1

これは立方体をレンダリングすることになっています。後面の一部が、カメラに最も近い部分よりも前にレンダリングされているように見えます。これは、遠くに設定しても発生します。これは私のレンダラーからのものです:

public void onDrawFrame(GL10 unused) {

    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

    // Set the camera position
    Matrix.setLookAtM(mVMatrix, 0, 0, 0, -3f, 0f, 0f, 0f, 0f, 1.0f, 0.0f);

    Matrix.setIdentityM(mModelMatrix, 0);
    Matrix.setRotateM(mModelMatrix, 0, mAngle, 0f, 1f, 0.0f);

    Matrix.multiplyMM(mMVPMatrix, 0, mVMatrix, 0, mModelMatrix, 0);
    Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix,   0);

    // Draw object
    cube.draw(mMVPMatrix, context);

    mAngle++;
}

そして私のオブジェクトの描画方法

public void draw(float[] mvpMatrix, Context context) {
    GLES20.glUseProgram(mProgram);

    GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,
                                 GLES20.GL_FLOAT, false,
                                 vertexStride, vertexBuffer);

    GLES20.glVertexAttribPointer(mTexHandle, 2,
                                 GLES20.GL_FLOAT, false,
                                 8, textureBuffer);

    GLES20.glEnableVertexAttribArray(mPositionHandle);
    GLES20.glEnableVertexAttribArray(mTexHandle);

    GLES20.glActiveTexture ( GLES20.GL_TEXTURE0 );
    GLES20.glBindTexture ( GLES20.GL_TEXTURE_2D, mTextureID);
    GLES20.glUniform1i ( mSampler, 0 );

    mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");

    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);

    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);

    GLES20.glDisableVertexAttribArray(mPositionHandle);
    GLES20.glDisableVertexAttribArray(mTexHandle);
}

そして私のシェーダー:

    String vertexShaderCode =
         "uniform mat4 uMVPMatrix;" +
         "uniform float u_offset;      \n" +
         "attribute vec4 a_position;   \n" +
         "attribute vec2 a_texCoord;   \n" +
         "varying vec2 v_texCoord;     \n" +
         "void main()                  \n" +
         "{                            \n" +
         "   gl_Position = uMVPMatrix *  a_position; \n" +
         "   gl_Position.x += u_offset;\n" +
         "   v_texCoord = a_texCoord;  \n" +
         "}                            \n";




String fragmentShaderCode = 
      "precision mediump float;                            \n" +
      "varying vec2 v_texCoord;                            \n" +
      "uniform sampler2D s_texture;                        \n" +
      "void main()                                         \n" +
      "{                                                   \n" +
      "  gl_FragColor = texture2D(s_texture, v_texCoord);  \n" +
      "}                                                   \n";

そして結果

写真: http://i.imgur.com/eWI2Uom.png

ありがとう

4

2 に答える 2

2

深度バッファを使用していると仮定すると、関数でそれをクリアしていないようですonDrawFrame。試す:

GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT|GLES20.GL_DEPTH_BUFFER_BIT);
于 2013-01-21T03:01:25.370 に答える
0

私は iOS でプログラミングしているので、Android 固有のコードについてはよくわかりませんが、「OpenGL ES 2.0 プログラミング ガイド」(Munshi らによる) を読んで理解したところ、違いはほとんどありません。最近の小さなプロジェクトからの私のコードは次のようになります。

フレームバッファとカラーレンダバッファを設定したら、すでに行ったように深度バッファを設定します。

GLuint depthRenderbuffer;

GLint backingWidth, backingHeight;

glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight);

glGenRenderbuffers(1, &depthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);

glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, backingWidth, backingHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);

を使用して、カラー レンダー バッファーに基づいて深度バッファーのサイズを設定する部分を含めることをお勧めしglGetRenderbufferParameteriv()ます。

補足として、iOS では、基になる iOS 描画レイヤーから color-renderbuffer ストレージを直接セットアップすることをお勧めしますglRenderbufferStorage()

次のコード行を描画ルーチンに含めることもできます。

glClearDepthf(1.0);
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

を呼び出さないとglEnable(GL_DEPTH_TEST)、最初は不具合が発生し、その後、少なくとも iOS での私の実装では問題なく動作するように見えます。glClearDepthf(1.0)値を 0.0 にするとフロント プレーンまでクリアされますが、 はファー プレーンまで完全にクリアされます。

Android 固有のコードがいくつかあるようですが、うまくいけば、これで正しいスタートが切れます。乾杯!

于 2013-01-21T09:47:28.617 に答える