【问题标题】:Using the depth buffer for floating point rendertargets in OpenGL 2.1在 OpenGL 2.1 中为浮点渲染目标使用深度缓冲区
【发布时间】:2012-03-23 02:05:38
【问题描述】:

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

到目前为止,我找到了一种使用颜色缓冲区的方法

// 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);

我想知道如何使用深度缓冲区(大概如何选择正确的内部格式/格式),这样纹理值就不会被钳制。

【问题讨论】:

    标签: opengl rendertarget


    【解决方案1】:

    标准化的整数图像格式总是被钳位的。这就是为什么它们是标准化整数。如果你想要一个不固定的格式,那么你需要浮点值。

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

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

    【讨论】:

    • 链接失效了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多