4.3、使用GLKit灯光

iOs5的GLKit使用与下面摘录的用于漫反射光的代码相似的ShadingLanguage代码为每个光线实现了标准的灯光模拟方程式:

vec3 eyeNormal = normalize (uNormalMatrix  * aNormal);
float nDotVP = max(0.0, dot(eyeNormal, ulightDirection));
vColor = vec4( (uDiffuseColor * nDotVP).xyz, uDiffuseColor.a);

现在不用担心不理解Shading Language摘录。这里提供它只是为了显示出GPU实现灯光模拟的方式的特点。这个代码会改变每个顶点的法向量来匹配正在被渲染的场景的方向,计算光线方向与新的法向量之间的标量积,然后使用这个标量积来按比例决定光的漫反射颜色的影响力。GLKit 会自动地生成与摘录相似的Shading Language代码,以便同时混人每个光线的镜面发射光和环境光颜色。

GLKit的GLKBaseEffect类最多支持三个命名为light0、light1 和light2的模拟灯光。每个灯光都由一个相同名字的GLKBaseEffect属性所代表。这些属性是GLKEfectPropertyLight类的实例,这些属性反过来又包含用于设置每个灯光的属性。每个灯光至少有一个位置、一个环境颜色、一个漫反射颜色和一个镜面反射颜色。每个 灯光都可以被单独地开启和关闭。下面的代码显示了怎么使用GLKit灯光。粗体代码配置了light0。

// Create a base effect that provides standard OpenGL ES 2.0
// Shading Language programs and set constants to be used for
// all subsequent rendering

self.baseEffect = [ [GLKBaseEffect alloc] init];
self.baseEffect.1ight0.enabled = GL_TRUE;
self.baseEffect.1ight0.diffuseColor = GLKVector4Make(
    0.7f, // Red
    0.7f, // Green
    0.7f, // Blue
    1.0f);// A1pha
self.baseEffect.1ight0.position = GLKVector4Make(
    1.0f,
    1.0f, 
    0.5f,
0.0f);

灯光的漫反射颜色被设置为不透明中等灰色。灯光的镜面反射和环境颜色保持为GLKit的默认值,分别为不透明白色和不透明黑色。这意味着灯光的漫反射部分不会影响场景并且高反光的物体会显得非常有光泽。

这段代码使用一个带有四个元素的GLKVector4来设置光源的位置。前三个元素要么是光源的X、Y和Z位置,要么是指向一个无限远的光源的方向。第四个元素指定了前三个元素是一个位置还是一个方向。如果第四个元素是零,前三个元素就是一个方向;如果第四个元素非零,光源会从它的位置向各个方向投射光线。因此每个顶点的光线方向是多种多样的,并且必须要由GPU使用从每个顶点到光源的方向而计算出来。 位置光源可以被设置为以一个锥形而不是向各个方向发散光线的聚光灯。6.3节包含了位置聚光灯的示例代码,参考资料可以在网址: http://developerapple.com/mac/ibrary/documentation/Darwin/Reference/ManPages/man3/glLight.3.html上找到。

仅仅开启和配置-一个灯光是不够的,必须为被-一个灯光照射的每-一个 三角形的每一个顶点提供法向量。4.4 节的示例OpenGLES_Ch4_1会按需重新计算法向量,但是大部分应用是预先计算法向量的或者从一个数据文件一起加载法向量和顶点位置信息。

在一个或多个GLKBaseEffect的灯光被开启后,灯光决定了渲染的物体的颜色; GLKBaseEffect的常量颜色和所有的顶点颜色被忽略了。例子OpenGLES_Ch4_1使用一个开启的灯光绘制了场景,然后使用GLKBaseEffect的constantColor属性(而不是使用一个灯光)绘制了线段。需要两个独立的GLKBaseEffect实例,因为在iOS5中,在一个GLKBaseEffect的灯光被创建以后,constantColor属性就被忽略了,即使GLKBaseEffect的灯光被关闭了。例如,baseEffect.light0.enabled = GL_ FALSE;


注意 作为最后的手段,GLKBaseEffect的constantColor属性会告诉GLKBaseEffect为生成的片元使用什么颜色。大部分OpenGL ES应用使用某种灯光和纹理的结合来决定片元的颜色。constantColor 属性仅适用于渲染单调不发光的物体。


results matching ""

    No results matching ""