OpenGL编程指南-光照

OpenGL通过光源、材料和光照模型,渲染光照物体,模拟现实世界

1.光源

1.创建光源
OpenGL至少支持8个光源,即GL_LIGHT0到GL_LIGHT7,可以使用glEnable开启光源
2.设置光源属性

  • 设置光源方向:glLightfv(GL_LIGHT0, GL_POSITION,position)
  • 设置环境光:glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);环境光是那些在环境中进行了充分的散射,无法分辨器方向的光,它似乎是来自所有方向。环境光的特点是:照射在物体上的光来自周围各个方向,又均匀地向各个方向反射。
  • 设置漫反射光:glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);漫放射光是一组来自特定方向,具有方向性的光。漫反射的特点是:光源来自一个方向,反射光均匀地射向各个方向。
  • 设置镜面光:glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);镜面光与漫反射光一样是具有方向性的。高强度的镜面光会在被照射的物体的表面上形成亮点。对于这种理想的反射面,镜面反射的光强要比环境光和漫反射的光强高出很多倍。

2.材质

OpenGL 用材料对光的红、绿、蓝三原色的反射率来近似定义材料的颜色。像光源一样,材料颜色也分成环境、漫反射和镜面反射成分,它们决定了材料对环境光、漫反射光和镜面反射光的反射程度。
1.指定材质
glMaterialfv(GLenum face,GLenum pname,TYPE param);

1 GL_FRONT(正面),GL_BACK(反面),GL_FRONT_AND_BACK(正反两面)。

2 GL_AMBIENT、GL_DIFFUSE、GL_SPECULAR属性。这三个属性与光源的三个对应属性类似,每一属性都由四个值组成。

GL_AMBIENT表示各种光线照射到该材质上,经过很多次反射后最终遗留在环境中的光线强度(颜色)。

GL_DIFFUSE 表示光线照射到该材质上,经过漫反射后形成的光线强度(颜色)。

GL_SPECULAR表示光线照射到该材质上,经过镜面反射后形成的光线强度(颜色)。

通常,GL_AMBIENT和GL_DIFFUSE都取相同的值,可以达到比较真实的效果。使用GL_AMBIENT_AND_DIFFUSE可以同时设置GL_AMBIENT和GL_DIFFUSE属性。

3 GL_SHININESS属性。该属性只有一个值,称为“镜面指数”,取值范围是0到128。该值越小,表示材质越粗糙,点光源发射的光线照射到上面,也可以产生较大的亮点。该值越大,表示材质越类似于镜面,光源照射到上面后,产生较小的亮点。

4 GL_EMISSION属性。该属性由四个值组成,表示一种颜色。OpenGL认为该材质本身就微微的向外发射光线,以至于眼睛感觉到它有这样的颜色,但这光线又比较微弱,以至于不会影响到其它物体的颜色。

5 GL_COLOR_INDEXES属性。该属性仅在颜色索引模式下使用,由于颜色索引模式下的光照比RGBA模式要复杂,并且使用范围较小,这里不做讨论。

3.光照模型

1.全局环境光强度
GLfloat ambient[]={0.2,0.2,0.2,1.0};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);
2.局部的观察点或无限远的观察点
glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE);
这个观察点放在视觉坐标系(0,0,0)的位置。如果想把观察点切换到无限远处,可以通过传递参数GL_FALSE。
3.双面光照
glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE)。
4.辅助镜面颜色
典型的光照计算中,分别计算环境光,散射光,镜面反射光和发射光的贡献,然后进行叠加,而在这之后进行纹理映射的话,镜面反射区可能被覆盖,为了解决这个问题,
glLightModelfv(GL_LIGHT_MODEL_COLOR_CONTROL,
GL_SEPARATE_SPECULAR_COLOR);
这样,每个顶点光照计算将产生两种颜色,主颜色和辅助颜色,前者包含所有非镜面反射光照的贡献,后者是所有镜面反射光照的总贡献。纹理映射的时候只将主颜色和纹理颜色混合起来,执行完纹理映射后,再将主颜色和纹理颜色的混合结果与辅助颜色混合起来。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值