如何使用OpenGL ES 2.0应用光源?

时间:2012-02-29 16:23:26

标签: iphone ios opengl-es opengl-es-2.0

我正在尝试找到解释和显示OpenGL ES 2.0中灯光使用情况的任何教程或示例代码。我在网上看到的大多数材料都是指Opengl ES 1.1。

任何人都可以提供有关如何在OpenGL ES 2.0中进行照明的任何链接或文档吗?

1 个答案:

答案 0 :(得分:11)

OpenGL ES 2.0的难点在于,由于您可以根据自己的需要编写自己的着色器,因此没有一种方法可以为对象提供照明。这取决于您希望如何呈现您的内容。

也就是说,您可以通过提供光线方向和计算每个顶点的光强度来复制OpenGL ES 1.1的固定功能照明功能。你可以在this sample application中看到一个例子,我为我的一个班级打了一针。

此处使用的顶点着色器如下:

attribute vec4 position;
attribute vec4 normal;

varying float lightIntensity;

uniform mat4 modelViewProjMatrix;
uniform vec3 lightDirection;

void main()
{
    vec4 newNormal = modelViewProjMatrix * normal;
    vec4 newPosition = modelViewProjMatrix * position;
    gl_Position = newPosition;

    lightIntensity = max(0.0, dot(newNormal.xyz, lightDirection));
}

使用匹配的片段着色器:

varying highp float lightIntensity;

void main()
{
    lowp vec4 yellow = vec4(1.0, 1.0, 0.0, 1.0);
    gl_FragColor = vec4((yellow * lightIntensity * 0.2).rgb, 1.0);
}

光点方向的点积和该顶点处的法线用于计算从该顶点撞击观察者眼睛的光强度。然后在每个三角形的顶点之间插入该光强度,以给出每个片段的强度。

我在开源Molecules应用程序中执行了一些更高级的每像素照明,其中每个球体和圆柱体实际上都是位于矩形内的光线跟踪冒名顶替者。对于每个像素,我计算虚拟对象上该点处的镜面反射和环境光照贡献,然后将其与在模型加载时计算的环境遮挡因子相结合。这远远超出了你可以用照明做的另一个极端,但你可以深入研究那里的代码或阅读my little writeup如何运作。