2013-11-21 3 views
0

나는 android dev 웹 사이트의 샘플에서 매우 동일한 코드를 가지고 있습니다. 일부 프로그래머 또는 자습서가 균일 한 위치의 점점 무승부 방법에에 attribporinter어디서 균일 한 위치와 attribpointer를 넣을 수 있습니까? 무승부 대 표면 생성?

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 surface created에 해당 코드를 삽입합니다. 여기에서 선호되는 방법은 무엇입니까?

답변

0

항상 이러한 핸들을 onSurfaceCreated에 설정합니다. OnDraw 메서드는 연속 루프에서 실행됩니다 (모드를 RENDERMODE_WHEN_DIRTY로 설정하지 않은 경우). onSurfaceCreated에서 꼭 한 번만 정점/조각 쉐이더를 컴파일하므로 핸들이 반복 사이에서 변경되지 않습니다.

그러나 실제로는 거의 차이가 없으며 onDraw에 넣으면 앱이 느려지지 않습니다. OpenGL은 변환 적용 및 프리미티브 렌더링과 같은 onDraw에서 많은 작업을 수행합니다. 이러한 핸들을 설정하는 것은 비교적 간단하며 추가적인 오버 헤드는 작기 때문에 눈에 띄지는 않을 것입니다.

1

초기화 코드에서 속성 및 균일 포인터를 가져 오는 것은 응용 프로그램의 수명 내내 변경되지 않으므로 이동하는 방법입니다. 일부 자습서에서는 onDraw()의 포인터를 간단하게 초기화합니다. 성능면에서는 어쨌든 눈에 띄는 차이가 없습니다.