OpenGL 3.0,无法绘制纹理四边形

时间:2015-11-27 18:36:01

标签: android opengl-es

我正在尝试修改OpenGL ES 3.0编程指南中的示例,但我无法弄清楚为什么我无法绘制纹理四边形。

这是主绘图循环(从书中提取,稍作修改):

void DrawTexturedQuad(ESContext *esContext)
{
    UserData *userData = static_cast<UserData *>(esContext->userData);
    GLfloat vVertices[] =
    {
        -0.5f,  0.5f, 0.0f,  // Position 0
        0.0f,  0.0f,        // TexCoord 0 
        -0.5f, -0.5f, 0.0f,  // Position 1
        0.0f,  1.0f,        // TexCoord 1
        0.5f, -0.5f, 0.0f,  // Position 2
        1.0f,  1.0f,        // TexCoord 2
        0.5f,  0.5f, 0.0f,  // Position 3
        1.0f,  0.0f         // TexCoord 3
    };
    GLushort indices[] = { 0, 1, 2, 0, 2, 3 };

    // Use the program object
    glUseProgram ( userData->programObjectMultiTexture );

    // Load the MVP matrix
    glUniformMatrix4fv(userData->mvpLoc, 1, GL_FALSE,(GLfloat *) &userData->grid.mvpMatrix.m[0][0]);

    #define LOCATION_VERT   (7)
    #define LOCATION_TEXT   (8)

    // Load the vertex position
    glVertexAttribPointer ( LOCATION_VERT, 3, GL_FLOAT,
        GL_FALSE, 5 * sizeof ( GLfloat ), vVertices );
    // Load the texture coordinate
    glVertexAttribPointer ( LOCATION_TEXT, 2, GL_FLOAT,
        GL_FALSE, 5 * sizeof ( GLfloat ), &vVertices[3] );

    glEnableVertexAttribArray ( LOCATION_VERT );
    glEnableVertexAttribArray ( LOCATION_TEXT );

    // Bind the base map
    glActiveTexture ( GL_TEXTURE0 );
    glBindTexture ( GL_TEXTURE_2D, userData->baseMapTexId );

    // Set the base map sampler to texture unit to 0
    glUniform1i ( userData->baseMapLoc, 0 );

    // Bind the light map
    glActiveTexture ( GL_TEXTURE1 );
    glBindTexture ( GL_TEXTURE_2D, userData->lightMapTexId );

    // Set the light map sampler to texture unit 1
    glUniform1i ( userData->lightMapLoc, 1 );

    glDrawElements ( GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices );

    glDisableVertexAttribArray ( LOCATION_VERT );
    glDisableVertexAttribArray ( LOCATION_TEXT );
}

顶点着色器:

#version 300 es

uniform                 mat4 u_mvpMatrix;
layout(location = 7) in vec3 a_position;
layout(location = 8) in vec2 a_texCoord;

out vec2 v_texCoord;

void main()
{
   //gl_Position = vec4(a_position, 1.f);
   gl_Position = u_mvpMatrix * vec4(a_position, 1.f);
   v_texCoord = a_texCoord;
}

片段着色器:

#version 300 es
precision mediump float;

in vec2 v_texCoord;

layout(location = 0) out vec4 outColor;
uniform sampler2D s_baseMap;
uniform sampler2D s_lightMap;

void main()
{
    vec4 baseColor;
    vec4 lightColor;

    baseColor = texture( s_baseMap, v_texCoord );
    lightColor = texture( s_lightMap, v_texCoord );

    outColor = baseColor * (lightColor + 0.25);
    //outColor = vec4(1.f, 1.f, 1.f, 1.f);
}

我做了三次测试,但它们看起来都不正确,虽然设置和着色器看起来对我来说。

第一次测试(图片的顶部窗口)。代码如上所示。

第二次测试(图片的中间窗口)。我通过了采样器并在片段着色器上对颜色进行了硬编码,如下所示:

outColor = vec4(1.f, 1.f, 1.f, 1.f);

这证明我的矩阵是正确的,因为我看到屏幕上正确转换了白色四边形。

第3次测试(底部窗口)。我绕过矩阵变换来测试采样器是否正确。我确实看到纹理四边形渲染但没有变换。像这样:

// this is so odd, I can see the textures!!!!
// why the transform can mess things up?
gl_Position = vec4(a_position, 1.f);
v_texCoord = a_texCoord;

无论如何,如果有人能够发现这个问题,我真的很适应。我使用的是Mali ARM模拟器,没有办法调试着色器,我不知道里面发生了什么。然而,代码设置看起来是正确的,但由于某些原因它们似乎并不能完全协同工作。

enter image description here

0 个答案:

没有答案