在哪里获得统一的位置和attribpointer?绘制vs表面创建?

时间:2013-11-21 11:07:42

标签: android opengl-es glsurfaceview

我在android开发网站上的示例中有一些代码非常相似。我必须很混淆为什么一些程序员或教程会获得统一的位置和attribporinter的设置

 GLES20.glUseProgram(mProgram);

        // get handle to vertex shader's vPosition member
        mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");

        // Enable a handle to the triangle vertices
        GLES20.glEnableVertexAttribArray(mPositionHandle);

        // Prepare the triangle coordinate data
        GLES20.glVertexAttribPointer(
                mPositionHandle, COORDS_PER_VERTEX,
                GLES20.GL_FLOAT, false,
                vertexStride, vertexBuffer);

        // get handle to fragment shader's vColor member
        mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");

        // Set color for drawing the triangle
        GLES20.glUniform4fv(mColorHandle, 1, color, 0);

        // get handle to shape's transformation matrix
        mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
        MyGLRenderer.checkGlError("glGetUniformLocation");

        // Apply the projection and view transformation
        GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
        MyGLRenderer.checkGlError("glUniformMatrix4fv");

        // Draw the triangle
        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);

        // Disable vertex array
        GLES20.glDisableVertexAttribArray(mPositionHandle);

到on draw方法?从我所理解的绘制方法是一个循环。所以把声明放在那里会使应用程序变慢?另一方面,其他人将代码放在on surface created上,即使它们具有相同的代码。这是哪种方式?

2 个答案:

答案 0 :(得分:1)

获取初始化代码中的属性和统一指针是可行的方法,因为它们在应用程序的整个生命周期内都不会改变。我建议一些教程初始化onDraw()中的指针,主要是为了简单起见。在性能方面,它无论如何都不会产生明显的差异。

答案 1 :(得分:0)

我总是在onSurfaceCreated中设置这些句柄。正如您所注意到的那样,onDraw方法在连续循环中运行(除非您将模式设置为RENDERMODE_WHEN_DIRTY)并且这些句柄在迭代之间不会发生变化,因为您在onSurfaceCreated中只编译了一次顶点/片段着色器。

然而,它实际上没有什么区别,如果你把它放在onDraw中,它将不会使你的应用程序变慢。 OpenGL在onDraw中做了大量工作,例如应用转换和渲染基元。相比之下,设置这些句柄是微不足道的,额外的开销很小,并且不会引人注意。