最近我开始涉足HLSL编程,对我做的一些事情背后的工作方式非常好奇。
比如说,我有一个非常简单的着色器,在这个着色器中,所有青色像素都被渲染成带红色的颜色。
sampler2D mySampler;
float4 MyPixelShader(float2 texCoords : TEXCOORD0): COLOR
{
float4 Color;
Color = tex2D(mySampler, texCoords.xy);
if(Color.r == 0 && Color.g == 1.0 && Color.b == 1.0)
{
Color.r = 1.0;
Color.g = 0.5;
Color.b = 0.5;
}
return Color;
}
technique Simple
{
pass pass1
{
PixelShader = compile ps_2_0 MyPixelShader();
}
}
我知道tex2D
函数会获取指定位置像素的颜色,但我不理解的是mySampler
怎么会有任何数据。我既没有设置它也没有传递纹理,但它却神奇地包含了我的纹理数据。
此外,COLOR
和COLOR0
之类的东西有什么区别?
还有,
TEXCOORD
和TEXCOORD0
之间的区别是什么?
我可以猜测说COLOR0
是汇编代码中保存GPU当前使用的像素颜色的寄存器。(这可能完全错误,我只是陈述了我认为的)
如果是这样,那么指定float2 texCoords : TEXCOORD0
之类的内容是否默认会抓取GPU正在处理的当前位置?
sampler
是否与sampler2D
一样有效? - inline