OpenGL ES 纹理包装有时会产生奇怪的结果

OpenGL ES texture wrap giving weird results sometimes

我正在使用以下方法在 android 上创建 OpenGL ES 纹理。

 private int createTexture(int width, int height, int i) {
    int[] mTextureHandles = new int[1];
    GLES20.glGenTextures(1, mTextureHandles, 0);
    int textureID = mTextureHandles[0];
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + i);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureID);
    GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
    return textureID;
}

然后将 bitmap 上传到此 texture 并使用 GLSurfaceView's Renderer 简单地渲染它。

Most of the times it is working as expected,

But randomly the texture is displayed like this. (here GL_TEXTURE_WRAP_S mode is GLES20.GL_CLAMP_TO_EDGE

更改换行模式后。

If GL_TEXTURE_WRAP_S = GLES20.GL_REPEAT then (again randomly) texture is displayed like this(notice the color change).

我已经尝试过使用 2 的幂纹理。

vertex buffer

代码
 private FloatBuffer createVertexBuffer(RectF glCoords) {

  //   RectF glCoords contains gl vertices.
  //   current Rect read from Logcat.
  //   left = -0.5833333, top = 0.5, right = 0.5833334, bottom = -0.5

    float[] vertices = new float[]{glCoords.left, glCoords.top, 0, 1, // V1 - top left
            glCoords.left, glCoords.bottom, 0, 1, // V2 - bottom left
            glCoords.right, glCoords.bottom, 0, 1, // V3 - bottom right
            glCoords.right, glCoords.top, 0, 1 // V4 - top right
    };
    FloatBuffer vBuffer = ByteBuffer.allocateDirect(vertices.length * bytesPerFloat)
            .order(ByteOrder.nativeOrder()).asFloatBuffer();
    vBuffer.put(vertices);
    vBuffer.position(0);
    return vBuffer;
}

未使用 IndicesBuffer,因为我正在使用 Triangle-Fan 渲染三角形。

    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 6);

如果有人能指出可能导致此问题的原因,那将非常有帮助

您的几何图形似乎是一个 4 顶点矩形(四边形),但代码想要绘制一个具有 6 个顶点的扇形 - GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 6);

那些额外的 2 个顶点未初始化,未在顶点数组中指定。 OpenGL 将读取超出数组定义部分的内容。结果将是随机的,我什至预计会崩溃。

glDrawArrays() 调用中将 6 替换为 4,这应该可以解决问题。