本文为L_Ares个人写作,包括图片皆为个人亲自操作,如需转载请表明原文出处。
最开始的第一节就说过,在OpenGL ES下,你想要实现一些效果,需要你自己实现顶点着色器和片元着色器。
在GLKit中它帮助我们封装了一些常用效果相关的着色器,用来实现一些常用效果。
而本节的GLKBaseEffect
类,就是GLKit框架中,使用的最高频率的基础效果类。它简化了目前许多OpenGL应用程序常见的视觉效果
GLKBaseEffect
提供了一些光照和着色的功能。
下面直接说这个类的头文件中给我们开放了什么属性和方法。
一、命名
给这个效果命名。
@property (nullable, nonatomic, copy) NSString *label;
二、配置模型视图转换
比如模型视图,投影,纹理和派生矩阵转换。
@property (nonatomic, readonly) GLKEffectPropertyTransform *transform;
三、配置光照效果
类型是个枚举,包含两个枚举值。
GLKLightingTypePerVertex
: 在三角形的每个顶点上执行光照计算,然后在三角形上进行插值。
GLKLightingTypePerPixel
: 把光照计算的输入插入到三角形中,然后在每个片段去执行光照计算。
@property (nonatomic, assign) GLKLightingType lightingType;
四、配置光照
1. lightModelTwoSided
是否为图元的两侧计算光照。如果为GL_TRUE
,并且渲染的是图元背面,则通过求该图元的表面法线反转去计算光照值。(此处是根据苹果官方文档,我自己翻译的,后续在实际操作中,我将试探一下到底是怎么求得的)。
默认值是GL_FALSE
。(我觉得如果非要用,又不知道这个的特性和原理,就不修改这个默认值最好)。
@property (nonatomic, assign) GLboolean lightModelTwoSided;
2. material
计算渲染图元的光照时,可以设置的材料属性。
@property (nonatomic, readonly) GLKEffectPropertyMaterial *material;
3. lightModelAmbientColor
环境颜色。
@property (nonatomic, assign) GLKVector4 lightModelAmbientColor;
4. light
场景中的三个光照属性。GLKBaseEffect
只有这三个光照属性,如果你要设置4个的话,那么就不能应用GLKBaseEffect
。
这时候就需要自己来自定义着色器来完成。
这也说明了GLKBaseEffect
只是GLKit
帮我们做的一些简单的封装,当遇到复杂的情况的时候,还是要自己来实现。
@property (nonatomic, readonly) GLKEffectPropertyLight *light0, *light1, *light2;
5. texture2d
2D纹理属性,也有两个,有顺序的。也是一个情况,只能处理两个纹理,所以你要使用超过2个纹理的话,还是要自己来做,不能用GLKBaseEffect。
@property (nonatomic, readonly) GLKEffectPropertyTexture *texture2d0, *texture2d1;
你可以设置以下属性里面Array元素的顺序来确定渲染图元的纹理的顺序。
@property (nullable, nonatomic, copy) NSArray<GLKEffectPropertyTexture*> *textureOrder;
五、配置雾化
应用于场景的雾化属性。
@property (nonatomic, readonly) GLKEffectPropertyFog *fog;
六、配置颜色信息
**1.colorMaterialEnabled **
计算光照和材质交互的时候,要不要使用颜色顶点属性。
@property (nonatomic, assign) GLboolean colorMaterialEnabled;
2. useConstantColor
是否使用常量颜色。
@property (nonatomic, assign) GLboolean useConstantColor;
3. constantColor
不提供每个顶点的颜色数据时,要用的常量颜色值。
@property (nonatomic, assign) GLKVector4 constantColor;
七、准备绘制效果
同步所有更改的效果状态,让他们保持一致。
在我们执行渲染之前,一定要准备渲染。
- (void) prepareToDraw;
网友评论