opengl 入门学习 随笔十二

三维图形处理中的光照效果,其实由三部分组成。

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

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值