1

我想知道的事情,不幸的是,这可能是不可能的,但我想我会问 - 我正在设置一个延迟照明着色器,它接收 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 - 但是如果我可以不改变它们,这个过程会更简单并且可能会表现得更好 - 所以希望找到一个那样解决。

谢谢!

4

2 回答 2

0

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

于 2013-06-11T18:57:16.387 回答
0

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

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

于 2013-06-12T20:51:53.000 回答