Direct3D:输出4个颜色通道和一个单独的alpha?

时间:2013-06-10 21:23:02

标签: directx direct3d rendertarget

我想知道的事情,不幸的是,这可能是不可能的,但我想我会问 - 我正在设置一个延迟的灯光着色器,它接收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目标时,我想屏蔽使用Color纹理的alpha通道写入的像素来控制混合量。但是 - 我正在从着色器输出一个vector4作为我的第二种颜色,它的通道都用完了。

有没有办法让Direct3D临时使用alpha值作为混合参数,用它来“掩盖”我的4个规范+规范通道,然后在使用后丢弃它?或者让渲染目标2使用渲染目标1的alpha作为其混合参数?

我知道我可以仅使用2个组件来表示法向量 - 例如商店X& Y然后在飞行中重新计算Z - 但过程会更简单&如果我能让他们保持不变,那么表现可能会更好 - 所以希望能找到解决方案。

谢谢!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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