0

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

第一关:

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

第二关:

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

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

但是,我是 openGL 的新手,我不明白如何执行以下任何操作:

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

谢谢,如果有人可以帮助我或给我更多的想法,我现在有点难过,我缺乏良好的硬件和空闲时间真的使得调试/尝试所有东西的过程很累。

4

2 回答 2

2

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

第二种方法是再次使用带有 GL_DEPTH_COMPONENT 纹理的 glCopyTexImage2D。

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

于 2010-10-14T15:25:51.023 回答
0

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

关于纹理本身,我认为从 32 位深度缓冲区复制到 8 位 RGBA 不会使用强制转换来转换数据:对于深度缓冲区的中间值(例如 0x80000000),您将在 R、G、 rgba 纹理上的 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;

所以,对于正确的格式,我不确定,但我建议你不要在复制过程中修改它,因为你不希望有转换开销。

于 2010-10-14T13:10:03.240 回答