【问题标题】:Texture repeating over surface when rendered from FBO从 FBO 渲染时纹理在表面上重复
【发布时间】:2018-10-20 15:18:06
【问题描述】:

我正在尝试将纹理从 FBO 渲染到表面,但我得到了这样的重复图像效果:Repeating Image effect

我不确定这是做什么的。我正在修改本教程中的代码: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);
}

如果需要任何其他代码,请告诉我。

【问题讨论】:

  • 每帧清空缓冲区?
  • 谢谢你成功了。

标签: c++ opengl


【解决方案1】:

导致“重复图像”效果,因为您没有清除帧缓冲区(颜色附件纹理和深度渲染缓冲区)。

清除绘图缓冲区是不够的。您还必须明确帧缓冲区的颜色平面和深度缓冲区。

绑定帧缓冲区,设置清除颜色(纹理的背景)并清除帧缓冲区。这会导致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);

渲染到纹理后,设置渲染的默认framebuffer,设置背景颜色并清空缓冲区:

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

【讨论】:

  • 把它弄乱了,是的,我忘了刷新,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
相关资源
最近更新 更多