2016-06-23 12 views
0

単純な2Dの四角形を画面に表示しようとしていますが、メソッドGLES20.glVertexAttribPointer()の最後の引数に問題があります。ここでVBOでGLOS20.glVertexAttribPointer()をAndroidで正しく使用するにはどうすればよいですか?

は私のコード(draw()メソッド)です。

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); 

私は、Android Studioを使用していて、それは私と私に語っていますこのメソッドの最後の引数に0を渡すことはできません。バッファオブジェクトが必要です。

私のVBOを使用するには、私は最後の引数としてゼロが必要であると言われます。これはどうすればいいですか?

次のように私が受け取るlogcatエントリは次のとおりです。

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を使用していないデバイスはほとんどありません。

+0

はい、このエントリポイントは、APIレベル8で導入された元のES20バインディングではなく、APIレベル9で追加されました。これは、各エントリポイントのAPIレベルがリストされているAPIドキュメントで確認できます。少なくとも彼らは1つのバージョンでそれを修正しました。 ES30バインディングでいくつかの不足しているエントリを修正するために6つのバージョンが必要でしたが、他のバージョンはまだバージョン24では見当たりません。 –

0

私はあなたのlogcat出力を見ていないので、私はエラーが正確にわかりません。しかし、私は推測している。最後の2つの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); 

} 
関連する問題