资源描述:
《OPENGL光照绘制》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、OPENGL光照模型绘制2在使用光照之前Jet.cpp程序功能:(1)用几个三角形组成简单的飞机模型(2)对这些三角形设置不同的颜色注意键盘的操作(1)在main之前定义函数voidSpecialKeys(intkey,intx,inty)(2)在main中glutSpecialFunc(SpecialKeys);(3)定义全局变量staticGLfloatxRot=0.0f;staticGLfloatyRot=0.0f;(4)在SpecialKeys函数中根据键盘的方向键修改xRot和yRot的值,并最后调用glutPostRedisplay();来通知操作系统重绘显
2、示窗口(5)在绘制时,使用xRot和yRot来控制三维物体的转向另一个颜色函数glColor3ub(255,255,255);OPENGL中函数的定义方式:glColor是函数主名,但是对应所支持的输入不同,函数名会有所变化glColor3f,glColor3ub等,可以通过MSDN查看所有对应的函数voidglColor3ub(GLubytered,GLubytegreen,GLubyteblue);取值范围0-255voidglColor3f(GLfloatred,GLfloatgreen,GLfloatblue);取值范围0.0f-1.0fvoidglColor3
3、fv(constGLfloat*v);输入一个float数组开启光照在voidSetupRC()中添加开启光照的语句glEnable(GL_LIGHTING);观察变化效果,此时颜色失效因为此时未对场景中的光照进行设置设置环境光GLfloatambientLight[]={1.0f,1.0f,1.0f,1.0f};glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambientLight);设置了一个最亮的环境光源,但是此时仍然看不到物体的本来颜色,这是因为还未对物体设置材料属性设置材料属性设置材料属性有两种方式(1)对每个面片设置材料属性GL
4、floatgray[]={0.75f,0.75f,0.7f,1.0f};glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,gray);OPENGL的状态保持机制,在第二次设置之前所有绘制的物体都使用这种材料属性,这种方式几乎必须对每个面片设置材料属性,而且使对物体颜色的设置无效。(2)使用颜色追踪glEnable(GL_COLOR_MATERIAL);glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);推荐使用这种方式,因为可以让OPENGL根据用户的颜色设定来自动确定材料属性,相对方
5、便模拟天变亮变暗如果不进行交互的话,环境光设置可在voidSetupRC()中进行,也可以在voidRenderScene(void)中进行但是如果要求进行交互的话,则必须在voidRenderScene(void)中进行环境光设置增加对环境光亮度的交互控制(1)增加全局变量staticGLfloatambientLight[]={1.0f,1.0f,1.0f,1.0f};staticGLfloatstrength=1.0f;(2)在voidSpecialKeys(intkey,intx,inty)中增加对按键的响应操作,对应方式为PgUp键控制变亮,PgDn键控制变暗
6、,代码如下:if(key==GLUT_KEY_PAGE_UP)strength+=0.1f;if(key==GLUT_KEY_PAGE_DOWN)strength-=0.1f;if(strength>1.0f)strength=1.0f;if(strength<0.0f)strength=0.0f;关于GLUT预设置的按键可查看glut.h文件(3)在voidRenderScene(void)中添加如下代码:ambientLight[0]=strength*1.0f;ambientLight[1]=strength*1.0f;ambientLight[2]=streng
7、th*1.0f;glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambientLight);使用散射光源给场景增加另一个光源在voidSetupRC()中增加如下代码:GLfloatambientLight1[]={0.3f,0.3f,0.3f,1.0f};GLfloatdiffuseLight1[]={0.7f,0.7f,0.7f,1.0f};glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight1);glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse