0

我有一段时间遇到这个问题,但我找不到解决方案。

这里我初始化Framebuffer:

//Initialize buffers
    glGenBuffers(1, &primaryBuffer);
    glBindBuffer(GL_FRAMEBUFFER, primaryBuffer);

    glGenRenderbuffers(1, &depthBuffer);
    glBindBuffer(GL_RENDERBUFFER, depthBuffer);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, Statics::ScreenWidth, Statics::ScreenHeight);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer);

    glGenTextures(1, &colorTexture);
    glBindTexture(GL_TEXTURE_2D, colorTexture);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8,  Statics::ScreenWidth, Statics::ScreenHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);

    glGenTextures(1, &depthTexture);
    glBindTexture(GL_TEXTURE_2D, depthTexture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32,  Statics::ScreenWidth, Statics::ScreenHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);

    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTexture, 0);

    int res = glCheckFramebufferStatus(GL_FRAMEBUFFER);
    if (res == GL_FRAMEBUFFER_COMPLETE)
    {
        printf("GOOD!\n");
    }

    glBindFramebuffer(GL_FRAMEBUFFER, 0);

我以这种方式在渲染函数中使用它:

glBindFramebuffer(GL_FRAMEBUFFER, primaryBuffer);
glViewport(0, 0, Statics::ScreenWidth, Statics::ScreenHeight);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

SetCamera();
DrawScene1();

glBindFramebuffer(GL_FRAMEBUFFER, 0);

glViewport(0, 0, Statics::ScreenWidth, Statics::ScreenHeight);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
SetCamera();
DrawScene2();

这里应该发生的是“scene1”在附加的帧缓冲区纹理中呈现。并且“scene2”应该出现在屏幕上。“scene2”确实出现在屏幕上,但是当我使用渲染的帧缓冲区纹理时,会出现以下内容: 看起来像一些 GPU 内存垃圾! :)

谁能告诉我怎么了?

4

1 回答 1

2

根据您所写的内容,我了解到 DrawScene2() 应该渲染整个场景,而 DrawScene1() 应该渲染为 DrawScene2() 所产生的一部分。

由于您没有透露 DrawScene2() 的任何细节(或整个代码),我只能在这里做出有根据的猜测:问题将出在 DrawScene2() 上。由于您在这里使用 DrawScene1() 的结果作为渲染源,您可能只是将整个 FBO 拍打在渲染目标上,而不是将其视为常规纹理,即在它获取之前为其设置正确的世界和纹理坐标渲染的(即您想用 DrawScene1() 生成的东西“绘制”的由 DrawScene2() 渲染的门的边界)。

于 2011-08-21T12:28:19.193 回答