2011-07-22 27 views
5

我是新来的着色器和HLSL,已经做了足够的BasicEffect类。我理解管道是如何工作的,特别是对于只有1遍的着色器。但是,对于2通道或N通道着色器,我不太了解2(或N)着色器输出的结果如何组合。多通道着色器如何在HLSL中工作?

你能解释一下这个组合是如何做的吗?如果可能的话,您更喜欢使用多通道着色器而不是多个单通道着色器的示例?

回答

5

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

除非你真的需要,否则我不会推荐使用多个pass,因为它确实会使诸如alpha混合和雾等事情复杂化。您需要在第一次传球后以不同的顺序设置混合状态。

[编辑] AS每梅尔基奥尔Blausand的评论,更正确的说,根据当前blend operationblend modes,其中电流值是组合所有先前的结果,输出各道次与当前值相结合经过。多通道着色器使用ADD混合模式组合多个光源是很常见的。另请注意,Alpha通道可以与different blend modes组合到颜色通道。

+1

终于!现在正在寻找几个小时的确切声明。十分感谢! –

+0

不客气。可惜OP没有回来标记它作为答案;) – Aranda

+1

由于ADD是一种混合模式,我现在认为这个答案误导。 我宁愿说每一遍都可以指定混合模式。 详细说明了[枚举D3DBLEND]的两个成员(http://msdn.microsoft.com/en-us/library/windows/desktop/bb172509%28v=vs.85%29.aspx)。 –

0

这完全取决于您,因为您必须在渲染网格物体本身之前调用BeginPass方法并遍历所有遍历。这使您可以更改混合模式,即使网格不需要相同。

所以一般情况下,结果与使用单通道着色器渲染(不同)网格相同。

+0

“即使网格不需要是相同的”你能解释一下吗?我虽然第一遍称为顶点和像素着色器函数,但后来通过只称为像素着色器,因为使用了顶点着色器输出... – Blau

+0

我的意思是你可以在BeginPass和EndPass之间画出所有东西。我使用这个例子来组合不同阴影部分的2D形状。 –