您的位置:首页 > 运维架构

opengl 入门学习 随笔十二

2014-11-27 11:12 176 查看
三维图形处理中的光照效果,其实由三部分组成。

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();

}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: