我想要做的就是从像素着色器中的HLSL着色器内部的精灵批量绘制调用中获取色调。
我问了类似于before的东西,我被告知看一下spritebatch的股票效果。我看着这些并且它们令人费解,但很明显,色调被传递给具有COLOR0语义的像素着色器。但是,我尝试通过添加颜色参数来使用此语义,如下所示,但它不起作用。
float4 PixelShaderFunction(float2 texCoord : TEXCOORD0, float4 inputColor : COLOR0) : COlOR0
我认为我遗漏了一些东西,可能与顶点着色器有关?我没有使用顶点着色器的经验,但我想做的就是能够从精灵批处理中获得色调。
任何人都有这方面的经验吗?感谢帮助
编辑:为了更具体地说明为什么它不起作用,inputColor始终为0,无论我为spritebatch色彩设置的是什么
答案 0 :(得分:1)
它通过顶点着色器。请注意semantics的文档和function arguments上的输入修饰符。
基本过程如下:
[vertex buffer data] -> [vertex shader] -> [pixel shader] -> [output]
像素着色器只能看到顶点着色器发出的内容。在每个阶段,数据都是根据语义来解释的。
在顶点缓冲区和顶点着色器之间,顶点声明将二进制数据映射到语义描述的输入寄存器中。
在顶点着色器和像素着色器之间,输出传递给通过匹配语义名称描述的输入。再次注意this list of semantics。 (此处还有一个混合步骤,用于获取顶点之间像素的输入值。)
最后,像素着色器的输出被传递到管道的剩余固定部分的一组固定输入(带语义):深度测试,混合等。
我认为在这种情况下让你困惑的是有两种方法从着色器输出数据:你可以返回它并给你的返回值一个语义(或许多)如果你返回一个结构语义。)
但您也可以通过将out
或inout
修饰符指定给参数(或简单地将其保留在参数中)来输出值。
这是SpriteBatch
的顶点着色器正在做的事情。请注意,它为所有参数指定了inout
- 并且它根本不修改颜色或纹理坐标参数。这些参数只是直接传递给像素着色器(通过适当的混合)。