【问题标题】:Accessing 32-bit Depth Buffer from fragment shader?从片段着色器访问 32 位深度缓冲区?
【发布时间】:2010-10-14 08:16:31
【问题描述】:

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

第一关:

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

第二遍:

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

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

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

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

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

【问题讨论】:

    标签: opengl shadow depth-buffer


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      关于纹理本身,我认为从 32 位深度缓冲区复制到 8 位 RGBA 不会使用 cast 来转换数据:对于深度缓冲区的中间值(例如 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;
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-05
        • 2016-11-27
        • 1970-01-01
        相关资源
        最近更新 更多