GLKBaseEffect苹果封装用于简单渲染的类,在官方文档中这样解释:
一个简单的照明和阴影系统,用于基于着色器的OpenGL渲染。
GLKBaseEffect类提供了模拟许多OpenGL ES 1.1照明和着色模型提供的行为的着色器,其中包括材质,光照和纹理。基本效果允许最多三个灯光和两个纹理应用于场景。
在初始化时,您的应用程序首先创建一个兼容的OpenGL或OpenGL ES上下文并使其最新。然后,它分配并初始化一个新的效果对象,配置其属性,并调用其prepareToDraw方法。绑定效果会导致着色器被编译并绑定到当前上下文。基本效应还需要由应用程序提供顶点数据。要提供顶点数据,请创建一个或多个顶点数组对象。对于着色器要求的每个属性,顶点数组对象应该启用该属性并指向存储在顶点缓冲对象中的数据。
在渲染时,应用程序调用效果的prepareToDraw方法来准备效果。然后,它绑定一个顶点数组对象并提交一个或多个绘图命令。
基础效应的照明计算是在眼睛空间坐标中完成的。 light0,light1和light2属性保存基础效果灯光的位置和光点方向。 transform属性包含分配给场景的模型视图矩阵。当光线被分配了新的位置或光点方向时,这些值将立即被当前的模型视图矩阵修改。因此,对模型视图矩阵进行排序并更改为灯光以实现所需的光线定位非常重要。在模型视图矩阵更新后,应设置需要以与场景几何相似的方式转换的光位置。
GLKBaseEffect遵循<GLKNamedEffect>协议,必须要写prepareToDraw,在我们以前写的自定义着色器中就是要设置上下文,绑定一些数据。
colorMaterialEnabled
指示在计算灯光与材质的交互时是否使用颜色顶点属性。
如果该值设置为GL_TRUE,则在执行任何照明计算时,将使用顶点数据中提供的颜色属性作为材质的颜色。 如果该值设置为GL_FALSE,则使用存储在材质属性中的颜色来点亮图元。 默认值是GL_FALSE。
lightModelTwoSided
一个布尔值,指示是否为基元的两侧计算光照。
如果值为GL_TRUE并且正在渲染基元的背面,则通过否定基元的表面法线来计算照明值。 如果值为GL_FALSE,则在执行照明计算时忽略基元的朝向。 默认值是GL_FALSE。
将此属性的值设置为GL_TRUE可能会影响性能。 只有在基本原理的任何一边在理论上对相机可见时才使用双面照明。
useConstantColor
一个布尔值,指示是否使用常量颜色。
如果该值设置为GL_TRUE,则存储在constantColor属性中的值将用作每个顶点的颜色值。 如果该值设置为GL_FALSE,则应用程序需要启用GLKVertexAttribColor属性并提供每顶点颜色数据。 默认值是GL_FALSE。
transform
当效果被绑定时,模型视图,投影和纹理变换应用于顶点数据。
modelviewMatrix模型变换矩阵,projectionMatrix投影变换矩阵,分为正投影和透视投影。
light0, light1, light2
最多提供三个灯光,类型是GLKEffectPropertyLight,里面可以设置enabled(是否开启),position(位置),ambientColor(环境色),diffuseColor(漫反色),specularColor(镜面色),spotDirection(点方向)等
lightingType
分为GLKLightingTypePerVertex和GLKLightingTypePerPixel,具体解释还没看懂
lightModelAmbientColor
应用于由效果渲染的所有基元的环境颜色。
material
计算渲染图元的光源值时使用的材质属性。
texture2d0, texture2d1
最多提供两个纹理,GLKEffectPropertyTexture类型,包括开启纹理,纹理名字,纹理目标
constantColor
不提供每顶点颜色数据时使用的常量颜色。
fog
应用于场景的雾特性。
GLKBaseEffect属性很多,没有完全搞懂,常用也就光源,纹理,变换。
矩阵堆栈
typedef struct CF_BRIDGED_TYPE(id) _GLKMatrixStack *GLKMatrixStackRef;
矩阵堆栈的概念和栈的概念一样,栈压的是数据,这里压的是矩阵。
GLKMatrixStackCreate创建一个矩阵堆栈
GLKMatrixStackPush压栈,参数是当前的矩阵堆栈,是将当前最上面的矩阵复制一份,然后压入堆栈中
GLKMatrixStackPop出栈,参数是当前的矩阵堆栈,将最后入栈的矩阵出栈。
GLKMatrixStackGetMatrix4得到最上层的矩阵
堆栈的概念,就像我们复制一样,我们初始化一个基础矩阵,然后需要变换时,入栈,得到矩阵,经过变换后使用,如果下一个模型需要使用就继续压栈,不需要直接出栈,不需要我们创建太多的变量,入栈和出栈的数量需要对应。