Я пишу игровой движок с открытым исходным кодом для Android ( здесь ), и у меня возникли проблемы с рендерингом текстурированных треугольников. 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);
}