我正在尝试使用以下阴影技术,我在 NVIDIA 网站上阅读了它,这似乎是一种很好的技术。我更喜欢它来计算 cpu 上的阴影体积,因为它看起来更“真实”,我可以使用它来进行软阴影。:
第一关:
- 从 LIGHT0 的角度填充深度缓冲区。复制此深度缓冲区以进行第二次传递。(*)
第二关:
- 从 EYE 渲染视图,并为每个片段:
- 获取存储在 (*) 中的深度缓冲区中的 XY 位置。获取对应的 32 位值。
- 计算到灯光的距离。
- 将此距离与存储的深度缓冲区值匹配。
- 如果它更大,则在 glDisable(LIGHT0) 模式下绘制片段,否则在启用灯光的情况下绘制。为此,我使用了两个片段着色器,并根据距离的比较在两者之间进行片段混合/切换。
现在,出于某些原因,我想在片段着色器中执行最后一步。其中之一是我想将距离考虑到阴影的“效果”。在我的游戏中,如果与障碍物的距离很小,可以肯定地说阴影会非常“严格” . 如果距离越远,全局光照越多,阴影越小。这是因为它是纸牌游戏,对于更复杂的“凹”形状则不会出现这种情况。
但是,我是 openGL 的新手,我不明白如何执行以下任何操作:
- 如何在不将其复制到 2d 纹理的情况下访问片段着色器中的第一遍深度缓冲区。我认为这是不可能的?
- 如果将 32 位深度缓冲区复制到每个 R、G、B、A 组件中具有 8 位的纹理,然后在片段着色器中重新组装该值是我能做的最有效的事情?
- 如果有跨平台扩展,我可以使用它。
谢谢,如果有人可以帮助我或给我更多的想法,我现在有点难过,我缺乏良好的硬件和空闲时间真的使得调试/尝试所有东西的过程很累。