2016-06-23 15 views
0

간단한 2D 사각형을 화면에 표시하려고하지만 GLES20.glVertexAttribPointer() 메서드의 마지막 인수에 문제가 있습니다. 여기 GLO20.glVertexAttribPointer()를 VBO와 함께 android에서 제대로 사용하는 방법은 무엇입니까?

내 코드 (추첨() 메소드)입니다 :

public void draw(float[] matrix){ 
     int shaderHandle = shader.getShaderHandle(); 
     int mMVPMatrixHandle; 

     GLES20.glUseProgram(shaderHandle); 
     mPositionHandle = GLES20.glGetAttribLocation(shaderHandle, "vPosition"); 

     mMVPMatrixHandle = GLES20.glGetUniformLocation(shaderHandle, "uMVPMatrix"); 
     MyGLRenderer.checkGlError("glGetUniformLocation"); 

     GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, matrix, 0); 
     MyGLRenderer.checkGlError("glUniformMatrix4fv"); 

     GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER,vbo); 
     GLES20.glEnableVertexAttribArray(mPositionHandle); 
     GLES20.glVertexAttribPointer(mPositionHandle,COORDS_PER_VERTEX,GLES20.GL_FLOAT,false,0,0); 

     GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER,ibo); 
     GLES20.glDrawElements(GLES20.GL_TRIANGLES,DRAW_ORDER.length,GLES20.GL_UNSIGNED_SHORT,null); 

     GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER,0); 
     GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER,0); 
    } 

문제는이 라인에 있습니다

GLES20.glVertexAttribPointer(mPositionHandle,COORDS_PER_VERTEX,GLES20.GL_FLOAT,false,0,0); 

내가 안드로이드 Studio를 사용하고, 그리고 내가 나에게 말하고있다 이 메서드에서 마지막 인수로 0을 전달할 수 없으면 Buffer 객체가 필요합니다.

내 VBO를 사용하려면 마지막 인수로 0을 가져야한다고 들었습니다. 어떻게해야합니까? 다음과 같이

내가받는 로그 캣 항목은 다음과 같습니다

06-23 22:27:23.098 2709-2709/? I/art: Not late-enabling -Xcheck:jni (already on) 
06-23 22:27:23.222 2709-2709/com.example.android.opengl W/System: ClassLoader referenced unknown path: /data/app/com.example.android.opengl-2/lib/x86 
06-23 22:27:23.362 2709-2709/com.example.android.opengl W/System: ClassLoader referenced unknown path: /data/app/com.example.android.opengl-2/lib/x86 
06-23 22:27:23.432 2709-2730/com.example.android.opengl D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true 

                      [ 06-23 22:27:23.439 2709: 2709 D/   ] 
                      HostConnection::get() New Host Connection established 0xab9e4670, tid 2709 


                      [ 06-23 22:27:23.472 2709: 2730 D/   ] 
                      HostConnection::get() New Host Connection established 0xaf4471b0, tid 2730 
06-23 22:27:23.474 2709-2730/com.example.android.opengl I/OpenGLRenderer: Initialized EGL, version 1.4 

                      [ 06-23 22:27:23.506 2709: 2729 D/   ] 
                      HostConnection::get() New Host Connection established 0xab9e4ac0, tid 2729 
06-23 22:27:23.557 2709-2729/com.example.android.opengl I/System.out: DEBUG 
06-23 22:27:23.562 2709-2729/com.example.android.opengl E/Surface: getSlotFromBufferLocked: unknown buffer: 0xb4093c00 
06-23 22:27:23.565 2709-2729/com.example.android.opengl E/AndroidRuntime: FATAL EXCEPTION: GLThread 129 
                      Process: com.example.android.opengl, PID: 2709 
                      java.lang.NullPointerException: Attempt to invoke virtual method 'int java.nio.Buffer.remaining()' on a null object reference 
                       at android.opengl.GLES20.glVertexAttribPointer(GLES20.java:1913) 
                       at com.example.android.opengl.Sprite.draw(Sprite.java:105) 
                       at com.example.android.opengl.MyGLRenderer.onDrawFrame(MyGLRenderer.java:76) 
                       at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1535) 
                       at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240) 
06-23 22:27:23.607 2709-2730/com.example.android.opengl E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa3b11230 
+0

받고있는 logcat 오류 문을 제공해 주실 수 있습니까? – brohan322

+0

위의 logcat을 추가했습니다 – Lockrick

+0

나는 여전히 아래 내 대답에 서 있습니다. 시도해 보셨습니까? – brohan322

답변

1

나는 그것을 알아 냈다!

문제는 내 코드와 전혀 관련이 없었습니다. 사용하고 있던 Android SDK 버전이 문제였습니다. 이것에 대한 간단한 수정이 있습니다.

프로젝트의 SDK 설정 (compileSdkVersion, minSdkVersion, targetSdkVersion)을 적절한 버전으로 변경하기 만하면됩니다. minSdkVersion 및 compileSdkVersion에 대한 버전을 14로 변경했습니다.이 버전에 OpenGL ES 2.0에 대한 충분한 지원이 포함되어 있기 때문에 원하는 버전대로 작업 할 수 있으며, 더 이상 SDK 버전이 14 이하인 장치를 거의 사용하지 않기 때문입니다.

+0

예, API 레벨 8에 도입 된 원래 ES20 바인딩에서이 엔트리 포인트가 누락되어 API 레벨 9에 추가되었습니다. 각 엔트리 포인트에 대한 API 레벨이 나열된 API 문서에서이를 볼 수 있습니다. 적어도 한 버전 내에서 수정했습니다. ES30 바인딩에서 누락 된 항목을 수정하기 위해 6 가지 버전이 필요했으며 다른 버전은 여전히 ​​버전 24에서 누락 된 것으로 보입니다. –

0

나는 당신의 로그 캣 출력을 보지 못했다, 그래서 오류가 정확히 모른다. 그러나, 나는 짐작한다. 마지막 두 glBindBuffer 라인을 제거하십시오.

public void draw(float[] matrix){ 
    int shaderHandle = shader.getShaderHandle(); 
    int mMVPMatrixHandle; 

    GLES20.glUseProgram(shaderHandle); 
    mPositionHandle = GLES20.glGetAttribLocation(shaderHandle, "vPosition"); 

    mMVPMatrixHandle = GLES20.glGetUniformLocation(shaderHandle, "uMVPMatrix"); 
    MyGLRenderer.checkGlError("glGetUniformLocation"); 

    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, matrix, 0); 
    MyGLRenderer.checkGlError("glUniformMatrix4fv"); 

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER,vbo); 
    GLES20.glEnableVertexAttribArray(mPositionHandle); 
    GLES20.glVertexAttribPointer(mPositionHandle,COORDS_PER_VERTEX,GLES20.GL_FLOAT,false,0,0); 

    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER,ibo); 
    GLES20.glDrawElements(GLES20.GL_TRIANGLES,DRAW_ORDER.length,GLES20.GL_UNSIGNED_SHORT,null); 

}