OpenGL ES - GLKBaseEffect

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);

你可能感兴趣的:(OpenGL ES - GLKBaseEffect)