禁用顶点属性数组后glDrawArrays()如何工作?

时间:2015-02-19 14:20:17

标签: android opengl-es-2.0

我已经开始学习用于Android的Opengl ES 2.0。我正在使用从以下站点获取的代码段: http://www.learnopengles.com/android-lesson-two-ambient-and-diffuse-lighting/ 这是一个有4个数字的亮点:

    private final float[] mLightPosInModelSpace = new float[] {0.0f, 0.0f, 0.0f, 1.0f};

此亮点位于模型空间中。以下函数用于绘制具有禁用的顶点属性数组的点。

private void drawLight()
{
    final int pointMVPMatrixHandle = GLES20.glGetUniformLocation(mPointProgramHandle, "u_MVPMatrix");
    final int pointPositionHandle = GLES20.glGetAttribLocation(mPointProgramHandle, "a_Position");

    // Pass in the position.
    GLES20.glVertexAttrib3f(pointPositionHandle, mLightPosInModelSpace[0], mLightPosInModelSpace[1], mLightPosInModelSpace[2]);

    // Since we are not using a buffer object, disable vertex arrays for this attribute.
    GLES20.glDisableVertexAttribArray(pointPositionHandle);  

    // Pass in the transformation matrix.
    Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mLightModelMatrix, 0);
    Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0);
    GLES20.glUniformMatrix4fv(pointMVPMatrixHandle, 1, false, mMVPMatrix, 0);


    // Draw the point.
    GLES20.glDrawArrays(GLES20.GL_POINTS, 0, 1);
}

我从这里阅读文档:https://www.khronos.org/opengles/sdk/docs/man/xhtml/glEnableVertexAttribArray.xml
并看到启用顶点属性数组glDrawArrays()后从该启用的数组中获取点。但我的问题是glDrawArrays()获得积分的地方?在这个例子中,从mLightPosInModelSpace开始,它可以正常工作。提前致谢。

1 个答案:

答案 0 :(得分:1)

参见OpenGL ES 2.0规范的第2.7节," 当前顶点状态":

  

当前通用属性值定义a时顶点的通用属性   定义该数据的顶点数组未启用,如第2.8节所述。

     

当前   可以通过发出其中一个命令

随时更改值      
      
  • void VertexAttrib{1234}{f}( uint index, T values );
  •   
  • void VertexAttrib{1234}{f}v( uint index, T values );
  •   
     

将给定值加载到slot索引的当前通用属性中,其中   组件名为x,y,z和w。

然后在第21页,该规范解释了他们如何拉动:

  

如果   未启用与顶点着色器所需的通用属性对应的数组,   然后相应的元素取自当前的通用属性   州(见第2.7节)。