繁体   English   中英

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

[英]Accessing 32-bit Depth Buffer from fragment shader?

我正在尝试进行以下阴影处理技术,我在NVIDIA网站上阅读了它,这似乎是一种不错的技术。 我宁愿选择它来计算cpu上的阴影体积,因为它看起来更“真实”,我可以将其用于软阴影。

第一关:

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

第二遍:

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

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

但是,我是openGL的新手,但我不知道如何执行以下任一操作:

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

谢谢您,如果有人可以帮助我或给我更多想法,我现在有点迷惑,而且我缺乏良好的硬件和空闲时间的确使调试/尝试所有工作变得筋疲力尽。

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

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

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

没错:您需要根据深度缓冲区值创建2D纹理,以便在第二遍中使用这些值。

关于本身的质感,我觉得从32位深度缓冲区拷贝至8位RGBA不会使用强制转换数据:为深度缓冲的中间范围值(比方说为0x80000000),您将获得R,G半色调, B和A在您的rgba纹理上:

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

您期望的位置:(广播)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM