我在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
上,即使它们具有相同的代码。这是哪种方式?
答案 0 :(得分:1)
获取初始化代码中的属性和统一指针是可行的方法,因为它们在应用程序的整个生命周期内都不会改变。我建议一些教程初始化onDraw()中的指针,主要是为了简单起见。在性能方面,它无论如何都不会产生明显的差异。
答案 1 :(得分:0)
我总是在onSurfaceCreated中设置这些句柄。正如您所注意到的那样,onDraw方法在连续循环中运行(除非您将模式设置为RENDERMODE_WHEN_DIRTY)并且这些句柄在迭代之间不会发生变化,因为您在onSurfaceCreated中只编译了一次顶点/片段着色器。
然而,它实际上没有什么区别,如果你把它放在onDraw中,它将不会使你的应用程序变慢。 OpenGL在onDraw中做了大量工作,例如应用转换和渲染基元。相比之下,设置这些句柄是微不足道的,额外的开销很小,并且不会引人注意。