Почему текстура, созданная из кадрового буфера, не отображается правильно - PullRequest
1 голос
/ 23 февраля 2020

Я создаю пользовательский буфер кадров размером 1920 X 1080 и затем отображаю текстуру этого буфера кадров в полноэкранный прямоугольник в буфере кадров по умолчанию размером 800 X 600.

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

Но прямоугольник появился в левом нижнем углу.

Когда я рисую полноэкранный прямоугольник в пользовательском буфере и сопоставляю его с полноэкранным прямоугольником в стандартном буфере кадров размером 800 X 600 вместо отображения в полноэкранном режиме, он охватывает весь экран. нижний левый угол ////////////////////////////////////////////////// /////////////////////////// Определение для функции Render Quad

unsigned int quadVAO = 0;
unsigned int quadVBO;
void renderQuad()
{
    if (quadVAO == 0)
    {
        float quadVertices[] = { // vertex attributes for a quad that fills the entire screen in Normalized Device Coordinates.
        // positions   // texCoords
        -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,  0.0f, 1.0f,
         1.0f, -1.0f,  1.0f, 0.0f,
         1.0f,  1.0f,  1.0f, 1.0f
        };
        //  VAO
        glGenVertexArrays(1, &quadVAO);
        glGenBuffers(1, &quadVBO);
        glBindVertexArray(quadVAO);
        glBindBuffer(GL_ARRAY_BUFFER, quadVBO);
        glBufferData(GL_ARRAY_BUFFER, sizeof(quadVertices), &quadVertices, GL_STATIC_DRAW);
        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)));

    }

    glBindVertexArray(quadVAO);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 6);
    glBindVertexArray(0);
}

1 Ответ

1 голос
/ 23 февраля 2020

Вы должны настроить область просмотра на новый размер, когда вы переключаетесь между кадровыми буферами с различными размерами. Используйте glViewport для установки области просмотра. Размер кадрового буфера по умолчанию можно получить по glfwGetFramebufferSize (размер кадрового буфера окна изменяется при изменении размера окна).
Кроме того, OpenGL является механизмом состояний. Состояния сохраняются до тех пор, пока они не изменятся снова, даже за рамками. Если в первом проходе используется Проверка глубины , а во 2-м проходе - нет, то проверка глубины должна включаться и выключаться в l oop:

int main(int argc, char *argv[])
{
    // [...]

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1920, 1080, ....);

    // [...]

    while (!glfwWindowShouldClose(window))
    {
        int sizex, sizey;
        glfwGetFramebufferSize(window, &sizex, &sizey);

        glBindFramebuffer(GL_FRAMEBUFFER, fboMsaaId);
        glViewport(0, 0, 1920, 1080);
        glClearColor(1.0, 0.0, 0.0, 1.0);
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
        glEnable(GL_DEPTH_TEST);

        // [...]

        glBindFramebuffer(GL_FRAMEBUFFER, 0);
        glViewport(0, 0, sizex, sizey);
        glClearColor(0.0, 0.0, 0.0, 0.0);
        glClear(GL_COLOR_BUFFER_BIT);
        glDisable(GL_DEPTH_TEST);

        // [...]
    }
}
...