美文网首页
OpenGL ES - GLKBaseEffect

OpenGL ES - GLKBaseEffect

作者: li_礼光 | 来源:发表于2017-05-08 20:46 被阅读412次

    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

          本文链接:https://www.haomeiwen.com/subject/auevtxtx.html