我正在为Android(here)编写一个开源游戏引擎,我在渲染纹理三角形时遇到了一些麻烦。 OpenGL不报告任何错误,但没有任何渲染。我可以很好地渲染顶点颜色的三角形,所以我知道我的VBO和着色器加载功能是有效的。我有一种感觉,我只是错过了一些细节。这是相关的代码:
// 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);
}
答案 0 :(得分:0)
我解决了。问题根本不在纹理或碎片着色器中。这是模型矩阵属性加载到顶点着色器的方式。我的矩阵加载代码如下:
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);
是的,这是我在my second edit中删除的“不必要”代码的一部分。 *捂脸*
事实证明,a_model
是模型矩阵的第一行的位置。因为我只是将数据加载到第一行,所以矩阵的最后三行是空的,因此顶点位置混乱并且三角形变得简并。我通过为每个连续的行添加1到a_model
来修复此问题,如下所示:
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);
现在它完美无缺!