android - OpenGL ES 2.0 渲染不正确

标签 android opengl-es opengl-es-2.0

这应该渲染一个立方体。看起来背面的某些部分在最靠近相机的部分前面渲染。即使我将它设置得更远,也会发生这种情况。这是来 self 的渲染器:

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

谢谢

最佳答案

假设您正在使用深度缓冲区,您似乎没有在 onDrawFrame 函数中清除它。尝试:

GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT|GLES20.GL_DEPTH_BUFFER_BIT);

关于android - OpenGL ES 2.0 渲染不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14431405/

相关文章:

android - 在 Android Studio 中从 JSON 获取值(value)

java - 更新创建的 sqlite 数据库中的整行(包含多列)

android - ktlint 作为 detekt 中的格式化程序

iPhone。粒子系统性能

android - 确定 Android OpenGLES 中的最大/最小纹理大小限制

安卓 OpenGL : GLbyte LoadShader conversion

java - 如何在 Android 上安全地存储存储敏感日期?

javascript - "no VBO bound to enabled vertex attrib index 0"尝试在WebGL中绘制简单的纹理

opengl-es-2.0 - opengl es 2.0 中的 glcolor4ub

ios - 是否可以通过 iOS 纹理缓存 API 从 OpenGL ES 帧缓冲区读取 float ?