簡體   English   中英

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

[英]Rendering textured primitives in Android OpenGL ES 2.0 - What am I doing wrong?

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

我解決了 問題根本不在紋理或碎片着色器中。 這是將模型矩陣屬性加載到頂點着色器的方式。 我的矩陣加載代碼是這樣的:

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是模型矩陣第一行的位置。 因為我只是將數據加載到第一行,所以矩陣的最后三行是空的,因此頂點位置被弄亂了,三角形退化了。 我通過為連續的每一行添加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);

現在,它可以完美運行了!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM