首先OpenGL运行库里面的东西解压了,
.h的放到VC安装目录的VC98里的Include里的GL文件夹(没有的话建一个),
.lib的放在VC98里的LIB里,
.dll的放在C盘Windows下的SysWOW64下面(64位系统)32位系统放在System32里面。
OpenGL的函数格式:
glColor3f()
gl表示函数属于OpenGL函数库中的哪个工具箱,还有glu、glut。
Color是一个标记,说明这个函数肯定跟颜色有关。
3f说明这函数的参数表中应该有三个变量,为GLfloat型,顺便说下颜色的三个变量一般为RGB的浓度,从0.0f到1.0f,如果有第四个那就是Alpha值,可以简单理解为透明度。
几个常用的基本函数:
glClearColor()
设置清除颜色,也就是背景色
glColor3f()
设置绘图颜色,也就是前景色
glClear()
OpenGL中设置了多个缓冲区,其中放置了各种内容,比如顶点的信息,色彩的信息,命令的信息。他们并不会直接生效,要想他们生效就必须清空这些缓冲区,glClear就是清空缓冲区的函数,在参数里加上GL_COLOR_BUFFER_BIT,就是清空颜色缓冲区,比如之前用glClearColor设置了背景色,但是不会立即生效,背景色信息会被放入颜色的缓冲区,也就是GL_COLOR_BUFFER_BIT,这里清空了颜色缓冲区也就是使里面的背景色生效,也就是用背景色填充了屏幕。
glFlush()
OpenGL中的绘图命令在被调用时并不会立即生效,而是会被放入一个命令队列,glFlush的功能就是将命令队列中的命令都生效并清空队列。
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
设置缓冲方式为双缓冲,单缓冲是直接在屏幕上绘图,如果命令较多计算机较慢的时候可以看到绘图的过程,这不是我们想看到的,因此出现了双缓冲,双缓冲在内存中独立开辟一个空间放渲染好的帧,也就是先在这个空间内绘图,绘图完毕以后再输出到屏幕上,这样能保证屏幕显示的是完整的图象而不是一个过程。双缓冲的另一个用途就是动画,动画是一系列图象的高速切换,那么从根本上就没法用单缓冲了,因为都在同一个地方绘图没法做到切换,OpenGL的动画就是在缓冲区内绘图完毕再输出屏幕再绘图再输出的循环过程。
在用了双缓冲时,glFlush就不再需要了
后面半句是设置色彩模式为RGB。
glutCreateWindow("Sample");
创建一个窗口,标题为“Sample”
glutDisplayFunc(DrawTriangle);
注册绘图函数为DrawTriangle。
OpenGL是一个状态机程序,它会在一个特定的空间内保存目前的状态,比如前景色背景色,缓冲模式,色彩模式,等等。每当要刷新画面的时候,程序会调用绘图函数,根据目前的状态绘图。
从这个角度说,对状态的修改语句不应该放在绘图语句里面,否则就好比是在一个算n的阶乘的函数中改变了n的值,当然除非有特殊情况。
glutTimerFunc(GLfloat msec,void 调用函数(int value),int value);
这个函数是制作简单动画的必要函数。相当于设置了一个定时器并每过一段时间调用一次里面的“调用函数”。
glutMainLoop();
相当于消息循环。
OpenGL的两种投影方式:
正投影(Orthographic Projection)
也叫平行投影实际大小相同远近不同的物体显示的大小一样,没有近大远小的透视效果。
透视投影(Perspective Projection)
实际大小相同远近不同的物体显示时近大远小,有透视效果。
OpenGL中显示的三个关键词:
修剪区Ortho、视区Viewport、窗口Window
修剪区(也叫裁剪区)为OpenGL的三维工作空间,是右手笛卡尔坐标系空间中被划分出来作为工作空间的区域,注意它是三维的。
视区(也叫视口)就是修剪区在二维平面上的投影区域,由于显示屏是二维的平面,因此修剪区没法直接被显示,需要被投影在一个二维的平面区域上,也就是视区,OpenGL显示的就是视区的内容。
窗口就是在程序中用来放视区的地方,视区占窗口的大小是可以设置的,通常设为跟窗口一样大。
三个区域的设置:
修剪区:
函数原型:
voidglOrtho(Gldouble left,Gldouble right,Gldouble bottom,Gldouble top,Gldoublenear,Gldouble far);
参数表中的数据分别指定了修剪区的外围6个面与xyz3个坐标轴的交点的坐标。通常near和far都是远离观察者的负值。
此函数是可以重复调用的,每次调用都会改变修剪区的大小位置,从这个意义上说,此函数并不是创造一个修剪区,而是修改修剪区的大小位置。
视区:
函数原型:
voidglViewport(GLint x,GLinty,GLsizeiwidth,Glsizeiheight);
x,y指定了视区在窗口中左下角的坐标,通常为(0,0),width和height指定了视区的宽高,单位为像素。
OpenGL中的坐标变换:
要制作一个模型的漫游或者说观察角度的变换,肯定改变视图。
OpenGL中是通过坐标的变换实现的。
首先是视图变换,就是变换camera的角度和坐标,也就是改变观察者的位置朝向,从而改变视口中观察到的裁剪区的内容。
然后是模型变换,这个类似于3D建模里的Local模式、局部模式,也就是变换模型本身的角度和位置,这样也能实现视口中内容的变换。
在制作模型较多的场景时显然模型变换是太麻烦了,应该用视图的变换。
投影变换,与其说是变换不如说是投影的模式,这个在上文中有提过,有透视和正投影,区别就是有没有透视效果,不多说了。
视口变换,这个我觉得其实就是个光栅化的过程,我们不需要特别的去控制它。
OpenGL中的变换是通过矩阵的变换实现的,这个里面的原理我还没细看,不过已经有资料了,目前没时间理解。
我做了一个带缩放的旋转三角形程序,用了glutRotate()这个函数,其实这个函数里面就用的是矩阵的变换,但是OpenGL把详细的过程都包在函数里面了,我们只要用就可以了,不过对原理了解的越深入,当然也就能用的更灵活,因此深入还是需要的。
下礼拜要把关于矩阵的东西弄清楚,把这个三角形小程序和MFC整合在一起,如果可以的话加上一些键盘啥的的消息响应。