两者的功能相同。例如: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)(默认)可以决定顺时针还是逆时针的一面为正面。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工具库函数gluUnProject()和gluUnProject4()用于执行这种逆变换操作.
只要提供一个经过变换的顶点的三维窗口坐标以及所有对他产生影响的变换.gluUnProject()就可以返回这个顶点的全局坐标(如果深度范围不是默认的[0,1],应该使用gluUnProject4()函数)