OpenGL总结


1.OpenGL会利用插值算法将3个顶点连成三角形

2.OpenGL中的阴暗处理有两种模式:GL_SMOOTH、GL_FLAT。

      GL_SMOOTH: OpenGL将根据顶点的颜色,插值生成其他点的颜色,形成颜色变、过渡的效果。

      GL_FLAT: 没有颜色渐变和过渡的效果。例如:对三角形单调着色,取最后一个顶点的颜色填充三角形。

3.glColor3ub(): 参数类型为GLubyte,范围为[0,255]

   glColor3f():   参数类型为GLfloat,范围为[0.0f,1.0f] .glColor3f()中的参数大于1.0f时,OpenGL会将参数值钳位至 1.0f。

    两者的功能相同。例如:glColor3ub(51,255,0)和glColor3f(0.2f,1.0f,0.0f)定义了相同的颜色。

4.设置色差可以使物体的3D效果更明显。例如:金字塔两侧面的颜色较深,前后面的颜色较浅,可使观察者产生错觉,凸现3D效果。

5.void auxSolidBox(GLdouble width,GLdouble height,GLdouble depth) //绘制长方体

6.顶点的绘制顺序只是会影响到面的法线方向的确定。GLFrontFace(GL_CW)和glFrontFace(GL_CCW)(默认)

可以决定顺时针还是逆时针的一面为正面。

7.glPushMatrix(), glPopMatrix();可以在绘制多个物体时,方便地控制各个物体的坐标。

8.void glRotatef(GLfloat angle,GLfloat x,GLfloat y,GLfloat z)

      angle:旋转的角度,向量(x,y,z)所在的直线表示转轴。该函数将当前坐标系绕(x,y,z)轴逆时针旋转angle角度。

9.#pragma comment( lib, "opengl32.lib" )          // 链接时查找OpenGL32.lib
              #pragma comment( lib, "glu32.lib" )           // 链接时查找glu32.lib
             #pragma comment( lib, "glaux.lib" )

10.怎样在绘制多个物体时控制各个物体的坐标?

      有三种方法:

      (1).人工进行逆操作:绘制一个物体时执行了什么样的坐标操作,在绘制下一个物体之前再执行依次反操作即可.比如:绘制一个物体时绕X轴旋转了xrot角度,则在绘制下一个物体之前把坐标系转-xrot角度即可.

      (2).若待绘制的多个物体之间的坐标没有关联,那么每次绘制物体前先用glLoadIdentity()重置ModelView Matrix(模型视图矩阵)即可.

      (3).用glPushMatrix()与glPopMatrix()将ModelViewMatrix压栈和出栈.同时我们可以嵌套调用glPushMatrix()与glPopMatrix()函数来绘制更加复杂的物体.

注意:千万不要把glRotatef()写在glBegin()与glEnd()之间.这样能够通过编译,但无法实现旋转的效果,并且会产生GL_INVALID_OPERATION的异常.

11.现有的纹理贴图就是将各种不同的2D平面图形贴在3D物体的表面上.

     AUX_RGBImageRec* LoadImage(char* filename)

     LoadImage()载入BMP图片,并返回AUX_RGBImageRec指针,Bool LoadTextureGL()

     将载入的BMP图片转为纹理

12.auxDIBImageLoad()载入图片并返回指针.注意加载图片的宽和高必须是2的n次方,其   宽度和高度最小不得小于64象素,图象的宽度和高度不应超过256象诉素.换句话说,图片必须为64*64,128*128,256*256

gluBuild2DMipmaps()代替glTexImage2D(),这样可以载入任意大小的图片

13.glTexImage2D()生成2D纹理图象,

第一个参数必须为GL_TEXTURE_2D;

第二个参数0表示细节的级别;

第三个参数表示图素的颜色通道,载入的图片只有RGB三色,所以为3;

第四、五两个参数分别表示纹理的宽度和高度;

第六个参数0表示边框宽度,

第七个参数GL_RGB表示象素数据格式;

第八个参数GL_UNSIGNED_BYTE表示组成图象的数据类型为unsigned byte;

第九个参数为纹理数据的来源。

14。glTexParameteri()用来指定滤波方式。

     GL_TEXTURE_MIN_FILTER指定缩小纹理的滤波方式,用于大纹理贴到小表面的情形;

     GL_TEXTURE_MAG_FILTER指定放大纹理的滤波方式,用于小纹理贴到大表面的情形

     GL_LINEAR将纹理滤波方式设为线形内插

15。在金字塔的各个三角形侧面贴上相同的纹理。

        在纹理上截取一个三角形区域,作为三角形侧面的贴图。

        通过改变glTexcoord2f()中的两个参数的值来截取纹理的不同区域。

        三角形的左下顶点------纹理的左下角图素(0.0,0.0)

        三角形的右下顶点------纹理的右下角图素(1.0,0.0)

        三角形的上顶点------纹理顶部的中点图素(0.5,1.0)

16.auxSolidSphere()函数是以坐标系原点为球心绘制球的,所以在绘制球之前必须先移动坐标系.

auxSolidCylinder()函数的作用是在Y轴方向上绘制所要求的圆柱.由于程序中绘制的四个圆柱并不都是垂直于XZ平面的,所以在绘制后面两个圆柱前需要先将坐标系绕Z轴旋转90度.

auxSolidCylinder()绘制的圆柱的上底面是固定的,而且是固定在当前坐标系中y=1.0f的平面上,以y轴为轴,随着指定高度的不同不断地向y轴负方向延伸.

17.glRotatef()只使物体绕过原点的直线旋转,所以首先要把坐标系移到这个侧面的旋转轴上.

18.如果程序开启GL_2D_TEXTURE后,既没有给图元指定颜色也不绑定纹理,那么OpenGL将会自动使用所用纹理边缘所有图素混合后的颜色给图元着色.

19.gluSphere(quadric,0.3f,32,32)用来绘制一个球体.

     第一个参数是一个指向二次曲面对象的指针;

     第二个参数是球体的半径;

     第三、四个参数是所绘制球体的细节和详细程度,数值越大,球体越精细。

20。怎样实现如太阳等发光物体的光晕效果,一种简单的办法是用一个透明的面片来模拟,另外也可以通过绘制渐变的射线面来实现。

21。齐次坐标(x,y,z,w)表示的3D坐标(x/w,y/w,z/w).若w=0表示坐标在(x,y,z)方向上的无穷远处。即为平行光。

22。OpenGL里面有GL_LIGHTi(i=0,1,2,....7)共8盏灯。GL_LIGHTING是所有灯的开关。

23。由于设置了各个侧面的法向量,立方体各个表面就会根据光源进行正确的着色。若不定义,就无法有正确的光照效果。

24。glFogi(GL_FOG_MODE,fogMode[filter])设定雾的滤波方式。其中filter允许程序在不同的滤波方式之间切换。OpenGL提供了三种滤波方式

        (1).GL_EXP滤波:简单渲染屏幕上的雾。用这种滤波方式不能渲染出很漂亮的雾,但在配置比较低的计算机上运行良好。一般用于大雾或云的效果。

        (2).GL_EXP2滤波:雾效果比GL_EXP好一些。一般用于烟和薄雾的效果。

        (3).GL_LINEAR滤波:最好的滤波方式,物体在雾中消隐得很好,具有深度感。

glFogfv(GL_FOG_COLOR,fogColor)设置雾的颜色为fogColor

glFogf(GL_FOG_DENSITY,0.35f)设置雾的浓度为0.35f.浓度值可设在0。0~1。0之间,值越大雾越浓,值越小雾越淡。

25. glHint(GL_FOG_HINT,GL_DONT_CARE)确定雾的渲染方式,函数的第二个参数是可选的

      (1).GL_DONT_CARE是让OpenGL自己选择渲染方式,只渲染每个顶点或者每个象素都渲染

      (2).GL_DONT_NICEST是对每个象素进行渲染,效果比较好;

      (3).GL_FASTET是对每个顶点进行渲染,顶点之间的像素由直接插值得到,速度较快,但效果相对较差。

第三章

1.glPrint();//在屏幕上显示信息

glRasterPos2f();//用以定位一行文字的位置

2.设置材质的颜色有几种方法:

   (1).glMaterialfv()来设置材质属性,但系统性能开销相当大

   (2).void glColorMaterial(GLenum face,GLenum mode);

         其中,face指定待更改的面(GL_FRONT,GL_BACK,GL_FRONT_AND_BACK)mode指定材质成分(GL_AMBIENT,GL_DIFFUSE,GL_AMBIENT_AND_DIFFUSE,GL_SPECULAR,GL_EMISSION)

3.显示表不能嵌套定义,即不能在一个显示表内部建立另一个显示表.但是在建立显示表时,OPenGL允许新的显示表调用在这之前已经建立好的显示表.

第四章

   在OpenGL里面,除了可以用glTexCoord()指定纹理坐标外,还可以用glTexGen*()自动生成纹理坐标,该函数在显示轮廓线、环境影射等许多方面都很有用。


你可能感兴趣的:(OpenGL总结)