0

我正在尝试将纹理渲染到屏幕的左下角,例如:

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

我无法执行该渲染。我画了一个四边形并做一些基本的事情。我已经尝试了所有渲染到四边形的变体,如这些链接和其他关于 SO 的讨论:

如何在 OpenGL ES 2.0 中将纹理绘制为 2D 背景?

OpenGL ES 2.0 使用纹理渲染

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

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 链接成功。我得到的只是屏幕左下角的一个白色矩形(当然,在已经渲染的场景的顶部)。我在这里错过了什么吗?

4

2 回答 2

0

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

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

于 2012-06-20T01:21:35.570 回答
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);
于 2018-08-03T00:00:46.303 回答