首页 > 解决方案 > 2D OpenGL 渲染,FBO 完全黑色/无法正确渲染

问题描述

我在将opengl渲染到帧缓冲区对象时遇到了问题,我的渲染代码中的所有内容都可以正常工作而没有绑定fbo,但是一旦我绑定了fbo,结果就是黑色。着色器工作正常,我已经多次检查过它,所以希望有人能在这里帮助我。提前致谢!:)

屏幕着色器代码:

/// Vertex
#version 330 core
layout (location = 0) in vec2 aPos;
layout (location = 1) in vec2 aTexCoords;

out vec2 TexCoords;

void
main(void)
{
    gl_Position = vec4(aPos.x, aPos.y, 0.0, 1.0); 
    TexCoords = aTexCoords;
}

/// Fragment
#version 330 core
out vec4 FragColor;

in vec2 TexCoords;

uniform sampler2D main_texture;

void
main(void)
{ 
    FragColor = texture(main_texture, TexCoords);
}

渲染器渲染精灵代码:

void
RenderSprite(Renderer *renderer,
             Texture *texture,
             vec2 position, f32 rotation, vec2 scale,
             vec2 origin, vec4 colour)
{
    UseShader(renderer->shader);
    mat4 model = GLM_MAT4_IDENTITY_INIT;
    
    vec3 rot_mult = { 0.0f, 0.0f, 1.0f };
    
    vec3 origin_offset = { (origin[0]+1) * scale[0], (origin[1]) * scale[1], 0.0f };
    vec3 inv_origin_offset = { -origin_offset[0], -origin_offset[1], 0.0f };
    glm_translate(model, inv_origin_offset);
    
    vec3 position_offset = { position[0], position[1], 0.0f };
    glm_translate(model, position_offset);
    
    glm_translate(model, origin_offset);
    glm_rotate(model, rotation * DEG2RAD, rot_mult);
    glm_translate(model, inv_origin_offset);
    
    vec3 scale_vec3 = { texture->width * scale[0], texture->height * scale[1], 1.0f };
    glm_scale(model, scale_vec3);
    
    /*************************************************************************/
    
    SetShaderMat4f(renderer->shader, "model", model);
    SetShaderVec4f_arr(renderer->shader, "tint", colour);
    
    glActiveTexture(GL_TEXTURE0);
    BindTexture(texture);
    
    glBindVertexArray(texture->vao);
    glDrawArrays(GL_TRIANGLES, 0, 6);
    glBindVertexArray(0);
}

QUAD VAO 初始化代码:

unsigned int vbo;
float vertices[] =
{
    -1.0f, -1.0f,  0.0f,  0.0f,
    +1.0f, +1.0f, +1.0f, +1.0f,
    -1.0f, +1.0f,  0.0f, +1.0f,
    -1.0f, -1.0f,  0.0f,  0.0f,
    +1.0f, -1.0f, +1.0f,  0.0f,
    +1.0f, +1.0f, +1.0f, +1.0f
};
glGenVertexArrays(1, &quad_vao);
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBindVertexArray(quad_vao);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);

FBO VARS(在 .c 文件的顶部):

static Texture *test_texture; // <- temp
static unsigned int quad_vao;
static unsigned int fbo;
static unsigned int colour;

FBO 初始化代码:

glGenFramebuffers(1, &fbo);
glGenTextures(1, &colour);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glBindTexture(GL_TEXTURE_2D, colour);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, WINDOW_WIDTH, WINDOW_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colour, 0);

FBO 渲染代码:

glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

// just draws a sprite (works completely fine without fbo bound)
vec2 position = { 0.0f, 0.0f };
vec2 scale = { 4.0f, 4.0f };
vec2 origin = { 0.0f, 0.0f };
vec4 tint = { 1.0f, 1.0f, 1.0f, 1.0f };
RenderSprite(game->renderer, test_texture,
             position, 0, scale,
             origin, tint);

glBindFramebuffer(GL_FRAMEBUFFER, 0);
UseShader(GetShader(SHADER_screen)); // grabs a shader from the shader manager
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, colour);
glBindVertexArray(quad_vao);
glDrawArrays(GL_TRIANGLES, 0, 6);
glBindVertexArray(0);

标签: copengl

解决方案


您有 2 个顶点着色器输入:

layout (location = 0) in vec2 aPos;
layout (location = 1) in vec2 aTexCoords;

因此,您必须指定 2 个通用顶点属性数据数组(用于属性索引 0 和 1):

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float)));

推荐阅读