Текстура повторяется по поверхности при рендеринге из FBO - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь визуализировать текстуру поверхности из FBO, но получаю повторяющийся эффект изображения, подобный этому: Повторяющийся эффект изображения

Я не уверен, что делает это,Я адаптирую код из этого урока: https://www.youtube.com/watch?v=21UsMuFTN0k, который находится в Java для C ++.

Это мой код, который я использую для установки на FBO:

GLuint frameBuffer;
glGenFramebuffers(1, &frameBuffer);
//generate name for frame buffer
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
//create the framebuffer
glDrawBuffer(GL_COLOR_ATTACHMENT0);
//indicate that we will always render to color attachment 0

//texture setup
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 320, 180, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,texture, 0);

//depth buffer setup
GLuint depthBuffer;
glGenRenderbuffers(1, &depthBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, 320, 180);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer);

Этот разделиспользуется для визуализации:

//water is two triangle joined together
Water test(texture);
render->addWater(&test);
while (!glfwWindowShouldClose(window))
{
    // Set frame time
    GLfloat currentFrame = (float)glfwGetTime();
    deltaTime = currentFrame - lastFrame;
    lastFrame = currentFrame;
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    gameController->update(deltaTime);

    glBindTexture(GL_TEXTURE_2D, 0);//To make sure the texture isn't bound
    glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
    glViewport(0, 0, 320, 180);

    render->renderScene();
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);

    render->renderScene();
    render->renderWater();
    glfwSwapBuffers(window);
}

Если есть какой-либо другой код, который требуется, дайте мне знать.

1 Ответ

0 голосов
/ 10 мая 2018

Эффект «повторное изображение» возникает из-за того, что вы не очищаете буфер кадров (цветную текстуру и буфер рендеринга для глубины).

Недостаточно очистить буфер рисования.Вы должны также очистить цветовую плоскость и буфер глубины кадрового буфера.

Привязать кадровый буфер, установить чистый цвет (фон текстуры) и очистить буфер кадров.Это приводит к тому, что для каждого текселя объекта texture задан цвет, который вы указали glClearColor прямо перед этим, а объект буфера рендеринга (depthBuffer) очищается (устанавливается на 1,0 - значение по умолчанию см. glClearDepth).

glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

После рендеринга в текстуру установите рамочный буфер по умолчанию для рендеринга, установите цвет фона и очистите буфер:

glBindFramebuffer(GL_FRAMEBUFFER, 0);
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...