opengl 入门学习 随笔十二
2014-11-27 11:12
176 查看
三维图形处理中的光照效果,其实由三部分组成。
1、光源,2、材质,3、光照环境
首先光源就是我们所看到的光源,例如:太阳,手电筒;材质就是物体的材料组成成分,俗称表面,比如当光线射入光滑的平面,那么反射后的光线就是很规则的,这样称为镜面反射。如果光线射入粗糙的平面,那么反射的管线很不规则,称为漫反射。显示生活中都是镜面反射和漫反射的叠加。对于光源可以设置经过镜面反射和漫反射后的光线强度;材质也可以设置这两个属性;最后加上光照环境的综合影响就会形成最终的光照效果。光照环境指一些额外的参数,例如经过多次反射后的光线已经分不清它是来自哪个光源,这时可以指定一个环境亮度参数。既然有反射,那么就一定会涉及到法向量,法向量的设置和顶点的设置基本相同,只要指定顶点的法向,计算机会自动计算其余的点的法向。
注意:使用glTranslate*函数或者glRotate*函数可以改变物体的外观,但法线向量并不会随之改变。然而,使用glScale*函数,对每一坐标轴进行不同程度的缩放,很有可能导致法线向量的不正确,因此,在使用了法线向量的场合,应尽量避免使用glScale*函数。即使使用,也最好保证各坐标轴进行等比例缩放。
glutSwapBuffers();
}
1、光源,2、材质,3、光照环境
首先光源就是我们所看到的光源,例如:太阳,手电筒;材质就是物体的材料组成成分,俗称表面,比如当光线射入光滑的平面,那么反射后的光线就是很规则的,这样称为镜面反射。如果光线射入粗糙的平面,那么反射的管线很不规则,称为漫反射。显示生活中都是镜面反射和漫反射的叠加。对于光源可以设置经过镜面反射和漫反射后的光线强度;材质也可以设置这两个属性;最后加上光照环境的综合影响就会形成最终的光照效果。光照环境指一些额外的参数,例如经过多次反射后的光线已经分不清它是来自哪个光源,这时可以指定一个环境亮度参数。既然有反射,那么就一定会涉及到法向量,法向量的设置和顶点的设置基本相同,只要指定顶点的法向,计算机会自动计算其余的点的法向。
注意:使用glTranslate*函数或者glRotate*函数可以改变物体的外观,但法线向量并不会随之改变。然而,使用glScale*函数,对每一坐标轴进行不同程度的缩放,很有可能导致法线向量的不正确,因此,在使用了法线向量的场合,应尽量避免使用glScale*函数。即使使用,也最好保证各坐标轴进行等比例缩放。
void myDisplay() { glMatrixMode(GL_PROJECTION);//当前矩阵为透视投影矩阵 glLoadIdentity();//设置为单位阵 gluPerspective(90.0f,1.0f,1.0f,20.0f);//也可换位glFrustum函数 glMatrixMode(GL_MODELVIEW);//当前矩阵为模型视图矩阵 glLoadIdentity(); gluLookAt(0.0,5.0,-10.0,0.0,0.0,0.0,0.0,1.0,0.0); //定义光照 { GLfloat sun_light_position[] = {0.0f,0.0f,0.0f,1.0f}; GLfloat sun_light_ambient[] = {0.0f,0.0f,0.0f,1.0f}; GLfloat sun_light_diffuse[] = {1.0f,1.0f,1.0f,1.0f}; GLfloat sun_light_specular[] = {1.0f,1.0f,1.0f,1.0f}; glLightfv(GL_LIGHT0,GL_POSITION,sun_light_position); glLightfv(GL_LIGHT0,GL_AMBIENT,sun_light_ambient); glLightfv(GL_LIGHT0,GL_DIFFUSE,sun_light_diffuse); glLightfv(GL_LIGHT0,GL_specular,sun_light_specular); glEnable(GL_LIGHT0);//启用0号光源 glEnable(GL_LIGHTING);//启用光照 glEnable(GL_DEPTH_TEST);//启用深度测试 } //定义材质 { GLfloat sun_mat_ambient[] = {0.0f,0.0f,0.0f,1.0f}; GLfloat sun_mat_diffuse[] = {0.0f,0.0f,0.0f,1.0f}; GLfloat sun_mat_specular[] = {0.0f,0.0f,0.0f,1.0f}; GLfloat sun_mat_emission[] = {0.5f,0.0f,0.0f,1.0f}; GLfloat sun_mat_shininess = 0.0f; glMaterialfv(GL_FRONT,GL_AMBIENT,sun_mat_ambient); glMaterialfv(GL_FRONT,GL_DIFFUSE,sun_mat_diffuse); glMaterialfv(GL_FRONT,GL_SPECULAR,sun_mat_specular); glMaterialfv(GL_FRONT,GL_EMISSION,sun_mat_emission); glMaterialfv(GL_FRONT,GL_SHININESS,sun_mat_shininess); <pre name="code" class="cpp">glutSolidSphere(2.0,40,32);}
glutSwapBuffers();
}
相关文章推荐
- OpenGL入门学习
- OpenGL入门学习【转载】
- OpenGL入门学习(十三) 【转】
- OpenGL入门学习(十四)(转)
- OpenGL入门学习----数据传输方式
- OpenGL入门学习
- OpenGL入门学习(五)
- OpenGL入门学习(十二) 【转】
- OpenGL入门学习(十一) 【转】
- OpenGL入门学习(二)
- OpenGL入门学习二
- OpenGL入门学习(三) 【转】
- OpenGL入门学习(四) 【转】
- OpenGL入门学习(十四) 【转】
- OpenGL入门学习(八) 【转】
- OpenGL入门学习
- OpenGL入门学习(二) 【转】
- OpenGL入门学习(六) 【转】
- OpenGL入门学习(十六) 【转】
- OpenGL入门学习(四)