在Android OpenGL ES 2.0中渲染纹理基元 - 我做错了什么?

时间:2012-01-02 18:50:09

标签: java android opengl-es opengl-es-2.0 textures

我正在为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);
}

1 个答案:

答案 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);

现在它完美无缺!