【问题标题】:Direct3D: Output 4 color channels and a separate alpha?Direct3D:输出 4 个颜色通道和一个单独的 alpha?
【发布时间】:2013-06-06 15:41:45
【问题描述】:

我想知道的事情,不幸的是这可能是不可能的,但我想我会问 - 我正在设置一个延迟照明着色器,它接收 2 个纹理并输出到 2 个渲染目标。他们的频道是:

Input Tex 1: Color Texture
  Channel 1: R
  Channel 2: G
  Channel 3: B
  Channel 4: A

Input Tex 2: Normal + Specular Texture
  Channel 1: X
  Channel 2: Y
  Channel 3: Z
  Channel 4: Specular Amount


Output Target 1: Color Target
  Channel 1: R
  Channel 2: G
  Channel 3: B
  Channel 4: A

Output Target 2: Normal+Specular Target
  Channel 1: X
  Channel 2: Y
  Channel 3: Z
  Channel 4: Specular Amount

很简单。除了 - 当输出到 Normal+Specular 目标时,我想屏蔽使用颜色纹理的 alpha 通道写入的像素以控制混合量。但是 - 我正在从着色器输出一个 vector4 作为我的第二种颜色,它的通道都用完了。

那么有什么方法可以让 Direct3D 暂时使用一个 alpha 值作为混合参数,用它来“屏蔽”我的 4 个规范+规范通道,然后在使用后丢弃它?还是让渲染目标 2 使用渲染目标 1 的 alpha 作为其混合参数?

我知道我可以只使用 2 个分量来表示法线向量 - 例如存储 X 和 Y 然后动态重新计算 Z - 但如果我可以不改变它们,这个过程会更简单并且可能表现更好 - 所以希望以这种方式找到解决方案。

谢谢!

【问题讨论】:

  • 使用第三个渲染目标怎么样?可以存储诸如镜面反射之类的材料信息,并且将来可能是发射部分。此外,您可以存储许多有趣的后期效果的深度:)
  • 谢谢 - 我认为这两种方法都行得通 - 我现在正在尝试球坐标方法。
  • 这里已经回答了这个问题:computergraphics.stackexchange.com/questions/94/…

标签: directx direct3d rendertarget


【解决方案1】:

有趣的问题!只是大声思考,我想知道您是否可以将遮罩值写入深度缓冲区的模板通道并在遮罩时使用它?

【讨论】:

  • 有趣 - 不太了解模板缓冲区,但如果它是 8 位并且可以用于混合,那可能会很好用。 (注意:刚刚检查过 - 可能行不通,因为我需要的不仅仅是一个简单的通过/失败掩码 - 即 8 位 alpha 掩码而不是 1 位 - 并且看起来你不能在混合中使用模板缓冲区函数)。
  • @QuadrupleA 您应该能够使用掩码的全部 8 位(假设您的深度缓冲区以通常的 24 位深度 + 8 位模板格式声明),但是是的,我我不确定它是否/如何用于混合。只是一个想法!祝你好运,当您找到解决方案时,请将其附加到您的帖子中,因为我对此感到好奇。
【解决方案2】:

所以,为了跟进这一点 - 我最终只是使用 Spheremap 变换技术将 XYZ 法线编码为两个分量(在页面 http://aras-p.info/texts/CompactNormalStorage.html#method03spherical 中提到的#3)。

所以我将相同的 alpha 值写入两个目标以控制混合 - 找不到任何其他方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 2017-07-04
    • 2021-11-16
    • 2014-08-26
    • 2013-07-05
    • 1970-01-01
    • 2013-06-01
    相关资源
    最近更新 更多