使用FBO的位置缓冲区和颜色缓冲区进行渲染(渲染后3D渲染)

时间:2014-01-19 18:58:09

标签: opengl rendering fbo

我想使用存储在FBO中的位置数据和颜色数据来实现渲染后3D扭曲。如何在现代OpenGL中有效地完成它?根据位置数据,它们是相机相对的XYZ坐标。

我有两个FBO,比如fbo1和fbo2。 fbo1用于数据(位置+颜色)输入,fbo2用于数据输出(后渲染3D扭曲后的结果)。两个FBO的FBO设置代码如下:

void setupFBO( int width, int height )
{
    // Create and bind the FBO
    glGenFramebuffers(1, &FBO);
    glBindFramebuffer(GL_FRAMEBUFFER, FBO);

    // The depth buffer
    glGenRenderbuffers(1, &fboDepthBuf);
    glBindRenderbuffer(GL_RENDERBUFFER, fboDepthBuf);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);

    // The color buffer
    glActiveTexture(GL_TEXTURE0);
    glGenTextures(1, &fboColorTex);
    glBindTexture(GL_TEXTURE_2D, fboColorTex);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

    // The position buffer
    glActiveTexture(GL_TEXTURE1);
    glGenTextures(1, &fboPosTex);
    glBindTexture(GL_TEXTURE_2D, fboPosTex);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

    // Attach the images to the framebuffer
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fboDepthBuf);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fboColorTex, 0);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, fboPosTex, 0);

    // Set the targets for the fragment output variables
    GLenum drawBuffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
    glDrawBuffers(2, drawBuffers);

    glBindFramebuffer(GL_FRAMEBUFFER, 0);
}

假设我们存储在fbo1中的数据,即fbo1.fboColorTex中的颜色​​数据和fbo1.fboPosTex中的位置数据,我们知道转换位置数据所需的变换(模型视图)矩阵以及投影矩阵。如何获得转换后的位置和颜色数据?实现它的一种方法可能如下:

glBindFramebuffer(GL_FRAMEBUFFER, fbo2);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, fbo1.fboColorTex);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, fbo1.fboPosTex);
// set shader parameters for textures
// set modelview, projection matrices
// what to render here? A full-screen quad?
glBindFramebuffer(GL_FRAMEBUFFER, 0);

渲染什么?什么着色器应该是什么样的?

我能想到的另一种方法是使用动态VBO,但我不确定如何从纹理动态分配VBO的顶点和颜色数据(在fbo1中)...我提到动态VBO的原因是因为fbo1的数据可以更改但不经常。

0 个答案:

没有答案