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,这应该可以解决问题。
我正在使用以下方法在 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. (hereGL_TEXTURE_WRAP_S
mode isGLES20.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,这应该可以解决问题。