2D-рендеринг OpenGL, FBO полностью черный / не отображает должным образом - PullRequest
0 голосов
/ 03 августа 2020

У меня проблема с рендерингом 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);
}

КОД RENDERER RenderSprite:

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);

1 Ответ

1 голос
/ 03 августа 2020

У вас есть 2 входа вершинного шейдера:

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

Следовательно, вы должны указать 2 массива общих c данных атрибутов вершин (для индексов атрибутов 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)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...