在OpenGL中给场景添加光照
来源:互联网 发布:无线网检测不到网络 编辑:程序博客网 时间:2024/05/17 06:12
在OpenGL中给场景添加光照
为了在OpenGL中使用光照计算,我们需要调用glEnable方法,并用GL_LIGHTING作为参数。这个调用告诉OpenGL在确定场景中每个顶点的颜色时使用光照参数和材料属性。当然,如果我们没有指定任何光照参数和材料属性,那么物体仍将会保持为黑暗的无光照状态。
// 启用光照
glEnable(GL_LIGHTING);
一、设置环境光
OpenGL提供了一个全局光源,它只发射环境光。这种光源很有用,它可以照射没有被其它光源直接照射的物体的背面,并且如果场景看上去太暗,可以调节这种全局环境光,以达到自己所需要的亮度。设置全局环境光的代码如下所示:
// 指定环境光的RGBA强度值
GLfloat ambientLight[] = {1.0f, 1.0f, 1.0f, 1.0f};
// 设置光照模型,将ambientLight所指定的RGBA强度值应用到环境光
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);
glLightModel方法使用指定的参数来设置光照模型。它的第一个参数是需要设置的光照模型,在这里我们指定的是环境光(ambient);接下来的一个参数包含了组成光源的RGBA强度值,也就是我们设置的ambientLight。
全局环境光的默认RGBA值是(0.2, 0.2, 0.2, 1.0),这是一种较暗的光。其它光照模型参数允许我们指定多边形是正面还是背面被照射,或者是两面都被照射,以及指定如何计算镜面光的角度等。
二、设置材料属性
当有了环境光源之后,我们还需要设置材料属性,只有设置了材料属性,我们的多边形才可以反射光线。
设置材料属性可以使用两种方法,第一种是在指定每个多边形或每组多边形之前使用glMaterial方法。代码如下所示:
GLfloat gray[] = {0.75f, 0.75f, 0.75f, 1.0f};
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gray);
glBegin(GL_TRIANGLES);
...
glEnd();
glMaterial方法的第一个参数指定了材料属性是作用于正面、背面还是双面(GL_FRONT、GL_BACK、GL_FRONT_AND_BACK);第二个参数指定将要设置环境光和散射光的反射率,在这里它们被设置为相同的值;最后一个参数是数组,包含了构成材料属性的RGBA值。在大多数情况下,环境光和散射光成分是相同的。
第二种设置材料属性的方法,称为颜色追踪。使用颜色追踪,可以告诉OpenGL仅仅通过调用glColor方法来设置材料属性。依旧使用glEnable方法来启用颜色追踪:
// 启用颜色追踪
glEnable(GL_COLOR_MATERIAL);
// 设置多边形正面的环境光和散射光属性,追踪glColor方法所设置的颜色
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glColor(0.75f, 0.75f, 0.75f);
glBegin(GL_TRIANGLES);
...
glEnd();
接着,glColorMaterial函数根据glColor所设置的颜色值来指定材料参数。这里有很重要的一点,那就是物体材料的颜色成分实际上决定了入射光的反射比例,正是这一点确保了颜色追踪的可行性。设置完整渲染状态的代码如下所示:
void SetupRC()
{
glEnable(GL_DEPTH_TEST);
glFrontFace(GL_CCW);
glEnable(GL_CULL_FACE);
// 启用光照计算
glEnable(GL_LIGHTING);
// 指定环境光强度(RGBA)
GLfloat ambientLight[] = {1.0f, 1.0f, 1.0f, 1.0f};
// 设置光照模型,将ambientLight所指定的RGBA强度值应用到环境光
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);
// 启用颜色追踪
glEnable(GL_COLOR_MATERIAL);
// 设置多边形正面的环境光和散射光材料属性,追踪glColor
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glClearColor(0.0f, 0.0f, 0.5f, 1.0f);
}
这一部分的示例程序完整代码已经放到了GitHub上,有需要的朋友可以参考一下(https://github.com/dxm3dp/OpenGL-05-Ambient点击打开链接)。
本文出自杜晓萌的博客,请勿用于任何商业用途,转载请保持完整性并标明出处:http://blog.csdn.net/haohan_meng
0 0
- 在OpenGL中给场景添加光照
- 向场景中添加光照
- 在OPENGL中使用光照
- Opengl中光照、材质
- 在场景中添加多个图层
- 在场景中添加按钮
- OpenGL中光照的设置
- OpenGL中光照的设置
- Android OpenGL添加光照和材料属性
- 给立方体添加光照和材质
- (转载)在OpenGL场景中实现小地图功能
- OpenGL中ADS光照模型没有镜面光照效果
- 给场景自动添加AssetBundleName
- OpenGL光照
- opengl光照
- OpenGL光照
- OpenGL光照
- opengl 光照
- 第十三周 项目三 成绩处理函数版
- 30款jQuery常用网页焦点图banner图片切换
- hdu1864最大报销额(dp)
- MVC下如何局部刷新页面
- 【算法学习】排序算法 - 简单选择排序
- 在OpenGL中给场景添加光照
- 第13周上机实践项目2——成绩处理(3)
- sql server 报“列名不存在”的错误可能的原因
- Entropy concept
- Linux下修改Mysql的用户(root)的密码
- IO流 PrintStream new Date() util System.in toUpperCase()
- 第十三周上机项目4--(1)冒泡排序
- 南邮oj题型
- FoundationDAY02