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

Directx Direct3D:输出4个颜色通道和一个单独的alpha?,directx,direct3d,rendertarget,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

我想知道的是,不幸的是,这可能是不可能的,但我想问一下-我正在设置一个延迟照明着色器,它接收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
很简单。除了-当输出到法线+镜面反射目标时,我想屏蔽使用颜色纹理的alpha通道写入的像素,以控制混合量。但是-我正在从着色器输出一个矢量4作为我的第二种颜色,它的通道都用完了

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

我知道我可以只使用两个组件来表示法向量-例如,存储X和Y,然后动态重新计算Z-但是如果我可以保持它们不变,那么过程会更简单,性能可能会更好-因此希望通过这种方式找到解决方案


谢谢

有趣的问题!大声想一想,我想知道您是否可以将掩码值写入深度缓冲区的模具通道,并在进行掩码时使用该值

因此,为了继续讨论这个问题,我最终使用Spheremap变换技术(第3页提到)将XYZ法线编码为两个分量


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

使用第三个渲染目标如何?可以存储镜面反射之类的材料信息,将来可能会存储一个emmisive部件。此外,您还可以存储许多有趣的后期效果的深度:)这是不可能的,如果你需要alpha混合法线缓冲区,你将不得不使用球坐标来填充法线。谢谢-这两种方法都会起作用,我想-我正在尝试球坐标方法。这里已经回答了:有趣-我不太了解模具缓冲区,但如果它是8位的,并且可以用于混合,那可能会非常有效。(注意:刚刚选中-可能不起作用,因为我需要的不仅仅是一个简单的通过/失败掩码-即8位alpha掩码而不是1位-并且看起来您不能在混合函数中使用模具缓冲区)。@Fourplea您应该能够使用掩码的全部8位(假设您的深度缓冲区是以通常的24位深度+8位模具格式声明的),但我不确定是否/如何将其用于混合。这只是一个想法!祝您好运,当您找到解决方案时,请将其附加到您的帖子中,因为我对此很好奇。