OpenGL ES 2.0:在没有ModelView或Projection矩阵的情况下将纹理渲染到屏幕

时间:2012-06-20 00:26:47

标签: opengl-es-2.0

我试图将纹理渲染到屏幕的左下角,如下所示:

glViewPort(0, 0, width/4, height/4);

我在执行渲染时遇到问题。我画一个四边形并做一些基本的东西。我已尝试将这些渲染的所有变体尝试到这些链接中讨论的四边形和其他SO:

How to draw a texture as a 2D background in OpenGL ES 2.0?

OpenGL ES 2.0 Rendering with a Texture

我的顶点和片段着色器如下:

const char * VERTEX_SHADER =
"                                               \n\
attribute vec4 a_position;                      \n\
attribute vec4 a_texCoord;                      \n\
                                                \n\
                                                \n\
#ifdef GL_ES                                    \n\
varying mediump vec2 v_texCoord;                \n\
#else                                           \n\
varying vec2 v_texCoord;                        \n\
#endif                                          \n\
                                                \n\
void main()                                     \n\
{                                               \n\
    gl_Position = a_position;                   \n\
    v_texCoord = a_texCoord.xy;                 \n\
}                                               \n\
";


const char * FRAGMENT_SHADER =
"                                                       \n\
#ifdef GL_ES                                            \n\
precision lowp float;                                   \n\
#endif                                                  \n\
                                                        \n\
varying vec2 v_texCoord;                                \n\
uniform sampler2D u_texture;                            \n\
                                                        \n\
void main()                                             \n\
{                                                       \n\
    gl_FragColor =  texture2D(u_texture, v_texCoord);   \n\
}                                                       \n\
";

我的渲染代码就是这样:

static const GLfloat squareVertices[] = {
    -1.0f, -1.0f,
     1.0f, -1.0f,
    -1.0f,  1.0f,
     1.0f,  1.0f,
};

static const GLfloat textureVertices[] = {
    0.0f, 0.0f,
    1.0f, 0.0f,
    0.0f, 1.0f,
    1.0f, 1.0f,
};


// ...

glUseProgram(myProgram_);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glViewPort(0, 0, width/4, height/4);  // width and height are defined elsewhere

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, myTexture_); // myTexture_ has been successfully loaded and checked

// Update uniform values
glUniform1i(textureUniformLocation_, 0);

// Update attribute values.
glEnableVertexAttribArray(a_position_location_);
glEnableVertexAttribArray(a_texcoord_location_);
glVertexAttribPointer(a_position_location_, 2, GL_FLOAT, 0, 0, squareVertices);
glVertexAttribPointer(a_texcoord_location_, 2, GL_FLOAT, 0, 0, textureVertices;

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

顶点和片段着色器编译并且glProgram链接成功。我得到的只是屏幕左下角的白色矩形(当然是在已渲染的场景的顶部)。我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:0)

也许您忘了设置缩小过滤器?将纹理保存为图像可能不会提醒您这样的采样错误。

http://www.opengl.org/wiki/Common_Mistakes#Creating_a_Texture

答案 1 :(得分:0)

您应该更改

attribute vec4 a_position;
attribute vec4 a_texCoord;

attribute vec2 a_position;
attribute vec2 a_texCoord;

gl_Position = a_position;             

gl_Position = vec4(a_position,0.0,1.0);