在OpenGL 2.1中使用深度缓冲区进行浮点渲染

时间:2012-03-05 15:37:07

标签: opengl rendertarget

我想使用深度缓冲区通过使用OpenGL 2.1 / GLSL 1.2将粒子的深度值存储在2D纹理的眼睛空间中。

到目前为止,我找到了一种使用colorbuffer的方法

// create texture
glGenTextures(1, &g_hDepthTexture);
glBindTexture(GL_TEXTURE_2D, g_hDepthTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F_ARB, g_windowWidth, g_windowHeight, 0, GL_RGBA, GL_FLOAT, 0);
// create framebuffer
glGenFramebuffersEXT(1, &g_hFBO);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, g_hFBO);glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, g_hDepthTexture, 0);

但是,我不需要BGA组件。因此,我尝试使用深度缓冲区,但是下面的代码将纹理中的每个值钳位到0 ... 1

// create texture
glGenTextures(1, &g_hDepthTexture);
glBindTexture(GL_TEXTURE_2D, g_hDepthTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, g_windowWidth, g_windowHeight, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);  // create framebuffer
glGenFramebuffersEXT(1, &g_hFBO);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, g_hFBO);

glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);

glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, g_hDepthTexture, 0);

我想知道如何使用深度缓冲区(可能如何选择正确的内部格式/格式),以便不会限制纹理值。

1 个答案:

答案 0 :(得分:1)

标准化整数图像格式始终被钳制。这就是他们归一化整数的原因。如果您想要一个非压缩格式,那么您需要浮点值。

我建议使用实际的1通道浮点图像格式,例如GL_R32F。也许GL_R16F,取决于我需要多少精度。如果您没有GL 3.x硬件,则可以使用GL_LUMINANCE32F_EXT,具体取决于可用的扩展名。

顺便说一句,如果你是为延迟渲染做这个,不要打扰。您实际上可以直接从常规深度缓冲区计算眼睛空间点。 Yes, really