gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 18:26:09 24 4
gpt4 key购买 nike

我正在使用以下方法在 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;
}

然后将位图上传到这个纹理,并使用GLSurfaceView的渲染器简单地渲染它。

Most of the times it is working as expected,

normal working image

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

clamp mode used

更改环绕模式后。

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

repeat mode used

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

顶点缓冲区的代码

 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() 调用中用 4 替换 6,这应该可以解决问题。

关于android - OpenGL ES 纹理包装有时会产生奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58921750/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com