材质的应用,OpenGL材质的应用

这次把材质完全搞定,呵呵 上次12个不同的立体材质球的程序运用glMaterialfv()来改变材质有其固有的系统消耗。 另外同样的功能可以使用: 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 在想要使用这个函数时,要启用glEnable(GL_COLOR_MATERIAL)来是函数工作在绘图时使用glColor*()来改变材质颜色,或用glMaterial()来改变材质成分 使用完毕,要用glDisable(GL_COLOR_MATERIAL)来关闭这种材质模式。 例如: glColorMaterial(GL_FRONT,GL_DIFFUSE); glEnable(GL_COLOR_MATERIAL); glColor3f(0.3,0.5,0.7); //画一些物体: ... glColor3f(0.0,1.0,0.0); //再画另一些物体: ... glDisable(GL_COLOR_MATERIAL); 说明: 当需要改变场景中大部分方面的单个材质时,最好调用glColorMaterial() 当修改不只一个材质参数,最好调用glMaterial*(),这是目前我体会到唯一的使用功能上的不同点吧。 请看下面例子: #include <windows.h> #include <gl/gl.h> #include <gl/glu.h> #include <gl/glaux.h> #pragma comment(lib, "OpenGl32.lib") #pragma comment(lib, "glu32.lib") #pragma comment(lib, "glaux.lib") #pragma warning(disable : 4244) // MIPS #pragma warning(disable : 4136) // X86 #pragma warning(disable : 4051) // ALPHA ///////////////////////////////////////////////////////// //sample.cpp void myinit(void); void CALLBACK display(void); void CALLBACK reshape(GLsizei w,GLsizei h); void myinit(void) { auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); auxInitPosition(0,0,500,500); auxInitWindow("sample1"); glClearColor(0.0,0.1,0.1,0.0); glClear(GL_COLOR_BUFFER_BIT); // glShadeModel(GL_FLAT); //定义一个白色简单光源 GLfloat light_position[]={0.0,3.0,2.0,0.0}; glLightfv(GL_LIGHT0,GL_POSITION,light_position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); //启用消隐 glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST); //启用颜色材质模式 glColorMaterial(GL_FRONT,GL_DIFFUSE); glEnable(GL_COLOR_MATERIAL); } void CALLBACK reshape(GLsizei w,GLsizei h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w<=h) glOrtho(-6.0,6.0,-6.0*(GLfloat)h/(GLfloat)w, 6.0*(GLfloat)h/(GLfloat)w,-10.0,10.0); else glOrtho(-6.0*(GLfloat)h/(GLfloat)w, 6.0*(GLfloat)h/(GLfloat)w,-6.0,6.0,-10.0,10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void CALLBACK display(void) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); //先画一个黄色材质的球 glLoadIdentity(); glTranslatef(-0.7,0.0,0.0); glColor3f(1.0,1.0,0.0); auxSolidSphere(1.0); //再在黄球的右边2.7处画一个红色的球 glLoadIdentity(); glRotatef(-60.0,1.0,0.0,0.0); glTranslatef(2.7,0.0,0.0); glColor3f(1.0,0.0,0.0); auxSolidSphere(1.0); //再再黄球左边(两球之间)靠后的位置画一个青色三角锥 glLoadIdentity(); glTranslatef(-1.0,-1.0,-5.0); glRotatef(30.0,1.0,0.0,0.0); glColor3f(0.0,1.0,1.0); auxSolidCone(2.0,2.0); glFlush(); } void main(void) { myinit(); auxReshapeFunc(reshape); auxMainLoop(display); } //end of sample //////////////////////////////////////////////////////////// 通过这个例子,我们除了可以熟悉glColorMaterial()的使用,还可以体会到OPENGL在消隐方面为我们做的工作。记的我们前面的用彩色平面 绘制三角锥的例子吗?那里可是哪个平面后画,哪个平面遮挡以前的平面。 这里我们看到虽然三角锥虽然最后画出,但是OPENGL的消隐功能已经保证乐它实际应该被消隐。你可以试试取消myinit()中消隐的两句程序,那么 三角锥就跑到前面来乐,呵呵。
Tags:  opengl 材质的应用

延伸阅读

最新评论

发表评论