如何从HLSL中的精灵批处理中获取色调颜色

时间:2012-08-15 02:39:36

标签: c# xna hlsl

我想要做的就是从像素着色器中的HLSL着色器内部的精灵批量绘制调用中获取色调。

我问了类似于before的东西,我被告知看一下spritebatch的股票效果。我看着这些并且它们令人费解,但很明显,色调被传递给具有COLOR0语义的像素着色器。但是,我尝试通过添加颜色参数来使用此语义,如下所示,但它不起作用。

float4 PixelShaderFunction(float2 texCoord : TEXCOORD0, float4 inputColor : COLOR0) : COlOR0

我认为我遗漏了一些东西,可能与顶点着色器有关?我没有使用顶点着色器的经验,但我想做的就是能够从精灵批处理中获得色调。

任何人都有这方面的经验吗?感谢帮助

编辑:为了更具体地说明为什么它不起作用,inputColor始终为0,无论我为spritebatch色彩设置的是什么

1 个答案:

答案 0 :(得分:1)

它通过顶点着色器。请注意semantics的文档和function arguments上的输入修饰符。

基本过程如下:

[vertex buffer data] -> [vertex shader] -> [pixel shader] -> [output]

像素着色器只能看到顶点着色器发出的内容。在每个阶段,数据都是根据语义来解释的。

在顶点缓冲区和顶点着色器之间,顶点声明将二进制数据映射到语义描述的输入寄存器中。

在顶点着色器和像素着色器之间,输出传递给通过匹配语义名称描述的输入。再次注意this list of semantics。 (此处还有一个混合步骤,用于获取顶点之间像素的输入值。)

最后,像素着色器的输出被传递到管道的剩余固定部分的一组固定输入(带语义):深度测试,混合等。


我认为在这种情况下让你困惑的是有两种方法从着色器输出数据:你可以返回它并给你的返回值一个语义(或许多)如果你返回一个结构语义。)

但您也可以通过将outinout修饰符指定给参数(或简单地将其保留在参数中)来输出值。

这是SpriteBatch的顶点着色器正在做的事情。请注意,它为所有参数指定了inout - 并且它根本不修改颜色或纹理坐标参数。这些参数只是直接传递给像素着色器(通过适当的混合)。