Xna 多过程着色器如何在HLSL中工作?

Xna 多过程着色器如何在HLSL中工作?,xna,Xna,我是着色器和HLSL的新手,对BasicFect类已经做得够多了。我了解管道是如何工作的,特别是对于只有一个过程的着色器。但是,对于2过程或N过程着色器,我不太了解2(或N)着色器输出的结果是如何组合的 你能解释一下这种组合是如何进行的吗?如果可能,您更喜欢使用多过程着色器而不是多个单过程着色器的示例?多过程着色器只需将结果添加到上一过程。它们可用于支持多个灯光,特别是当GPU的着色器模型没有足够的指令支持一次通过所需数量的灯光时 除非您真的需要,否则我不建议使用多个过程,因为它会使alpha混

我是着色器和HLSL的新手,对BasicFect类已经做得够多了。我了解管道是如何工作的,特别是对于只有一个过程的着色器。但是,对于2过程或N过程着色器,我不太了解2(或N)着色器输出的结果是如何组合的


你能解释一下这种组合是如何进行的吗?如果可能,您更喜欢使用多过程着色器而不是多个单过程着色器的示例?

多过程着色器只需将结果添加到上一过程。它们可用于支持多个灯光,特别是当GPU的着色器模型没有足够的指令支持一次通过所需数量的灯光时

除非您真的需要,否则我不建议使用多个过程,因为它会使alpha混合和雾等事情变得复杂。您需要在第一个过程和后续过程中以不同的方式设置混合状态


[编辑]根据Melchior Blausand的评论,更正确的说法是,每个过程的输出与当前值根据当前和进行组合,其中当前值是组合所有先前过程的结果。多过程着色器通常使用“添加混合”模式组合多个灯光。还请注意,alpha通道可以与颜色通道组合。

这完全取决于您,因为您必须在渲染网格本身和循环所有过程之前调用BeginPass方法。这使您能够更改混合模式,甚至网格也不需要相同


因此,通常情况下,结果将与使用一个过程着色器渲染(不同)网格的结果相同。

“即使网格也不要求相同”,您能解释一下吗?我认为第一个过程称为顶点和像素着色器函数,但后来的过程仅称为像素着色器,因为使用了顶点着色器输出…我的意思是可以在BeginPass和EndPass之间绘制所有内容。我用这个例子从不同的着色部分组成2D形状。最后!几个小时来一直在寻找那份确切的声明。非常感谢!不客气。可惜OP没有回来把它作为答案;)因为Addio是混合模式,所以我现在认为这个答案是误导的。我更愿意声明,混合模式可以在每次传递时指定。详细地说,指定了两个成员。