从片段着色器访问32位深度缓冲区?

时间:2010-10-14 08:16:31

标签: opengl shadow depth-buffer

我正在尝试使用以下阴影技术,我在NVIDIA网站上阅读它,这似乎是一个很好的技术。我更喜欢它来计算cpu上的阴影卷,因为它似乎更“真实”,我可以使用它来进行软阴影。 :

第一遍:

  • 从LIGHT0的角度填充深度缓冲区。复制此深度缓冲区以进行第二遍。 (*)

第二遍:

  • 从EYE渲染视图,并为每个片段:
    • 获取存储在(*)中的深度缓冲区中的XY位置。获取相应的32位值。
    • 计算到灯光的距离。
    • 将此距离与存储的深度缓冲区值匹配。
    • 如果它更大,则片段以glDisable(LIGHT0)模式绘制,否则在启用光的情况下绘制。为此,我根据距离的比较使用两个片段着色器和片段在两者之间进行混合/切换。

现在,出于某些原因,我想要在片段着色器中执行最后一步。其中之一是我想要考虑阴影的“效果”的距离。在我的游戏中,如果到阻碍物体的距离很小,可以说阴影将非常“严格”如果距离更远,全局照明会更多,阴影更小。这是因为它是纸牌游戏,对于更复杂的“凹”形状,情况并非如此。

但是,我是openGL的新手,我不明白如何做以下任何事情:

  • 如何在片段着色器中访问第一遍深度缓冲区而不将其复制到二维纹理。我认为这是不可能的?
  • 如果将32位深度缓冲区复制到每个R,G,B,A组件中具有8位的纹理,然后在片段着色器中重新组合该值是我能做的最有效的事情吗? / LI>
  • 如果有跨平台扩展,我可以使用它。

如果有人可以帮助我或者给我一些更多的想法,我感谢你们,我现在很难受,而且我缺乏良好的硬件和空闲时间,这使得调试/尝试所有内容的过程非常耗尽。

2 个答案:

答案 0 :(得分:2)

第一种方法是使用附加到GL_DEPTH_ATTACHMENT附件的GL_DEPTH_COMPONENT纹理的FBO。

第二种方法是再次使用glCopyTexImage2D和GL_DEPTH_COMPONENT纹理。

FBO是跨平台的,几乎在所有现代OpenGL实现中都可用,你应该可以使用它们。

答案 1 :(得分:0)

你是对的:你需要从深度缓冲区值创建一个2D纹理,以便在第二遍中使用这些值。

关于纹理本身,我认为从32位深度缓冲区复制到8位RGBA将不会使用强制转换来转换数据:对于深度缓冲区的中间范围值(比如0x80000000),你将在你的rgba纹理上获得R,G,B和A的半音:

RGBA[0] = 0x80;
RGBA[1] = 0x80;
RGBA[2] = 0x80;
RGBA[3] = 0x80;

你期望的地方:(演员)

RGBA[0] = 0x80;
RGBA[1] = 0;
RGBA[2] = 0;
RGBA[3] = 0;

因此,对于正确的格式,我不确定,但我建议您不要在复制期间修改它,因为您不希望有转换开销。