Визуализация в Framebuffer / текстура показывает пустой - PullRequest
1 голос
/ 04 июля 2019

Я пытаюсь выполнить рендеринг в буфер кадров (с тем же размером, что и у окна / экрана) для последующей обработки.Все в 2D, поэтому это не должно доставлять особых хлопот.Рендеринг прямо на экран работает нормально.Но я получаю только чистый цвет и пустой буфер.Единственный способ отрисовки чего-либо в нем - рендеринг прямоугольника с точным размером буфера в позиции (0,0), что странно.

Я пытался рендерить в случайных местах в буфер, но ничего не получалось,Отображение / рендеринг буфера на экран работает.

Вот как я могу создать буфер:

    glGenFramebuffers(1, &fbo);
    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    std::cout << "frame buffer fbo: " << fbo << std::endl;

    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
    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, texture, 0);

    if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
    {
        std::cout << "error creating screen buffer width: " << width << " height: " << height << std::endl;
    }
    else {
        std::cout << "created screen buffer width: " << width << " height: " << height << std::endl;
    }

    glBindFramebuffer(GL_FRAMEBUFFER, 0);

Вершинный шейдер:

#version 330 core

layout (location = 0) in vec2 vertex;
uniform mat4 projection;

void main() {
    gl_Position = projection * vec4(vertex.x, vertex.y, 0.0f, 1.0f);
}

Фрагментный шейдер:

#version 330 core

uniform vec4 in_color;
out vec4 FragColor ;

void main() {
    FragColor = in_color;
}

Матрица проекции для рендеринга:

glm::mat4 projection = glm::ortho(0.0f, static_cast<GLfloat>(this->width), static_cast<GLfloat>(this->height), 0.0f, -1.0f, 1.0f);

Код для рендеринга в буфер:

// binding and clearing the buffer to render into it
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glViewport(0, 0, width, height);
glClearColor(0.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

// render the rectangle
renderer->drawRectangle(0, 0, 10, 10, glm::vec4(1.0f, 0.0f, 1.0f, 1.0f));

glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0, 0, resolutionWidth, resolutionHeight);

// rendering main screen showing the quad

В результате получается следующее (буфер отображается на экране в половинном размере): Пустой Quad / Framebuffer, показывающий чистый цвет

1 Ответ

0 голосов
/ 05 июля 2019

Я следовал этому руководству при реализации этого: https://learnopengl.com/Advanced-OpenGL/Framebuffers

В качестве решения я просто изменил шейдер экрана, чтобы он принимал мои данные вершин / текстур. Потом я заметил, что фактические данные буфера были в порядке ...

Вершинный шейдер:

#version 330 core
layout (location = 0) in vec4 aPos;

out vec2 TexCoords;

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

Фрагмент шейдера:

#version 330 core
out vec4 FragColor;

in vec2 TexCoords;

uniform sampler2D screenTexture;

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