Java 在Android OpenGL ES 2.0中渲染纹理原语-我做错了什么?
我正在为Android()编写一个开源游戏引擎,在渲染纹理三角形时遇到了一些问题。OpenGL不会报告任何错误,但不会渲染任何内容。我可以很好地渲染顶点颜色的三角形,所以我知道我的VBO和着色器加载函数可以工作。我有一种感觉,我只是错过了一些小细节。以下是相关代码:Java 在Android OpenGL ES 2.0中渲染纹理原语-我做错了什么?,java,android,opengl-es,opengl-es-2.0,textures,Java,Android,Opengl Es,Opengl Es 2.0,Textures,我正在为Android()编写一个开源游戏引擎,在渲染纹理三角形时遇到了一些问题。OpenGL不会报告任何错误,但不会渲染任何内容。我可以很好地渲染顶点颜色的三角形,所以我知道我的VBO和着色器加载函数可以工作。我有一种感觉,我只是错过了一些小细节。以下是相关代码: // loaded is a boolean field if(!loaded ){ int[] tex = { 0 }; GLES20.glGenTextures(1, tex, 0); int hand
// loaded is a boolean field
if(!loaded ){
int[] tex = { 0 };
GLES20.glGenTextures(1, tex, 0);
int handle = tex[0];
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, handle);
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_CLAMP_TO_EDGE);
if (useMipmaps) {
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_MIN_FILTER,
GLES20.GL_LINEAR_MIPMAP_NEAREST);
} else {
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
}
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
// bmp is an android.graphics.Bitmap object
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bmp, 0);
if (useMipmaps)
GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);
loaded = true;
}
GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + glTexture);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, handle);
GLES20.glUniform1i(GLES20.glGetUniformLocation(programHandle,
"s_baseMap"), glTexture);
GLES20.glDrawElements(GLES20.GL_TRIANGLES,
indexCount, GLES20.GL_UNSIGNED_SHORT, 0);
顶点着色器:
precision mediump float;
uniform mat4 u_viewProj;
uniform vec3 u_lightColor;
attribute mat4 a_model;
attribute vec4 a_pos;
attribute vec2 a_mtl; // Stores UV coords
varying vec2 v_tc;
void main() {
gl_Position = (u_viewProj * a_model) * a_pos;
v_tc = a_mtl;
}
和片段着色器:
precision mediump float;
varying vec2 v_tc;
uniform sampler2D s_baseMap;
void main() {
vec4 black = vec4(0.0, 0.0, 0.0, 1.0);
gl_FragColor = black + texture2D(s_baseMap, v_tc);
}
我解决了。问题根本不在纹理或碎片着色器中。这与模型矩阵属性加载到顶点着色器的方式有关。我的矩阵加载代码如下:
GLES20.glDisableVertexAttribArray(a_model);
GLES20.glVertexAttrib4fv(a_model, matrix, matrixOffset * 16);
GLES20.glVertexAttrib4fv(a_model, matrix, (matrixOffset * 16) + 4);
GLES20.glVertexAttrib4fv(a_model, matrix, (matrixOffset * 16) + 8);
GLES20.glVertexAttrib4fv(a_model, matrix, (matrixOffset * 16) + 12);
是的,这是我在中删除的“不必要”代码的一部分*掌纹*
原来,a_model
是模型矩阵第一行的位置。因为我只将数据加载到第一行,所以矩阵的最后三行是空的,所以顶点位置被弄乱,三角形退化。我通过为每个连续行的a_model
添加1来修复此问题,如下所示:
GLES20.glDisableVertexAttribArray(a_model);
GLES20.glDisableVertexAttribArray(a_model + 1);
GLES20.glDisableVertexAttribArray(a_model + 2);
GLES20.glDisableVertexAttribArray(a_model + 3);
GLES20.glVertexAttrib4fv(a_model, matrix, matrixIndex * 16);
GLES20.glVertexAttrib4fv(a_model + 1, matrix, (matrixIndex * 16) + 4);
GLES20.glVertexAttrib4fv(a_model + 2, matrix, (matrixIndex * 16) + 8);
GLES20.glVertexAttrib4fv(a_model + 3, matrix, (matrixIndex * 16) + 12);
现在它工作得很好 您是否使用过glEnable(GLES20.GL_纹理_2D)代码>任何地方?
glEnable(GLES20.GL_纹理_2D)代码>导致无效的枚举错误,如所示。我很确定这在GLES 2.0中是不必要的。检查glGenTextures
实际生成的值。如果它给你一些100000的随机数,那么你可能不想使用它,而是想用你自己的系统来生成唯一的纹理ID。当我将我的应用程序从opengl ES 1.1转换为opengl ES 2.0时,我遇到了这个问题。我检查了它,它生成了70001。这不正常吗?另外,不使用glGenTextures
不会导致glBindTextures
之类的操作失败吗?当我使用API lvl 7时,它会给出1,2,3,n+1,其中n是调用glGenTextures
的次数。只有当我在具有更高API级别的较新设备上运行应用程序时,我才遇到此问题。我不知道GLuint的确切规格,所以可能70001是可以的,而其他地方的一些东西是失败的,但是如果你尝试使用多种纹理,你会很快发现glGenTextures
也是一个问题。您不需要使用glGenTextures
,只需将自己的ID插入glBindTexture()
。这只是一种方便的方法,所以您不必跟踪ID