GLKBaseEffect旨在简化当今许多OpenGL应用程序常见的视觉效果。 对于iOS,GLKBaseEffect至少需要OpenGL ES 2.0,对于OS X,GLKBaseEffect至少需要一个OpenGL Core Profile。 在实例化和初始化GLKBaseEffect对象之前,必须创建一个合适的上下文并使其成为最新的上下文。
GLKBaseEffect旨在与自定义的OpenGL代码自由地互操作。 它还旨在最小程度上影响OpenGL状态设置。 在初始化GLKBaseEffect对象及其属性时,会保留OpenGL状态设置。
GLKBaseEffect是基于程序的,通过其底层GLSL程序的绑定,当 - [GLKBaseEffect prepareToDraw]被调用时,它会隐式地修改GL_CURRENT_PROGRAM状态设置。 出于性能原因,GL_CURRENT_PROGRAM不会被GLKBaseEffect保存和恢复,
出于性能原因,GL_CURRENT_PROGRAM不会被GLKBaseEffect保存和恢复,因此该类的客户端必须在调用[GLKBaseEffect prepareToDraw]之前或之后设置/保存/恢复GL_CURRENT_PROGRAM,因为它们适用于其应用程序。
如果已经指定了纹理属性并被启用,GLKBaseEffect也将修改OpenGL状态元素GL_TEXTURE_BINDING_2D。 此状态也必须以上述GL_CURRENT_PROGRAM描述的方式进行处理。
GLKBaseEffect使用命名顶点属性,因此当配置/启用/绑定要与GLKBaseEffect一起使用的顶点属性数据时,客户端应用程序可以引用以下顶点属性名称:
GLKVertexAttribPosition 0
GLKVertexAttribNormal 1
GLKVertexAttribColor 2
GLKVertexAttribTexCoord0 3
GLKVertexAttribTexCoord1 4
请注意,GLKVertexAttribNormal的法线总是标准化。
使用GLKBaseEffect的4个规范步骤是:
(1) 分配并初始化GLKBaseEffect的一个实例
directionalLightEffect = [[GLKBaseEffect alloc] init];
(2) 在效果上设置所需的属性
// 配置灯效果
directionalLightEffect.light0.position = lightPosition;
directionalLightEffect.light0.diffuseColor = diffuseColor;
directionalLightEffect.light0.ambientColor = ambientColor;
// 配置材料
directionalLightEffect.material.diffuseColor = materialDiffuseColor;
directionalLightEffect.material.ambientColor = materialAmbientColor;
directionalLightEffect.material.specularColor = materialSpecularColor;
directionalLightEffect.material.shininess = 10.0;
(3) 使用要绘制的模型或场景的顶点数组对象初始化顶点属性/顶点数组状态.
glGenVertexArraysOES(1, &vaoName);
glBindVertexArrayOES(vaoName);
// 为每个顶点属性创建和初始化VBO
// 下面的例子显示了一个建立position vertex属性的例子。
// 对每个附加的所需属性重复以下步骤:normal,color,texCoord0,texCoord1。
glGenBuffers(1, &positionVBO);
glBindBuffer(GL_ARRAY_BUFFER, positionVBO);
glBufferData(GL_ARRAY_BUFFER, vboSize, dataBufPtr, GL_STATIC_DRAW);
glVertexAttribPointer(GLKVertexAttribPosition, size, type, normalize, stride, NULL);
glEnableVertexAttribArray(GLKVertexAttribPosition);
... 对其他所需的顶点属性重复上述步骤
glBindVertexArrayOES(0); // unbind the VAO we created above
(4) 对于绘制的每个框架:更新每帧更改的属性。 通过调用 - [GLKBaseEffect prepareToDraw]同步更改的效果状态。 用效果绘制模型
directionalLightEffect.transform.modelviewMatrix = modelviewMatrix;
[directionalLightEffect prepareToDraw];
glBindVertexArrayOES(vaoName);
glDrawArrays(GL_TRIANGLE_STRIP, 0, vertCt);
网友评论