我最近开始学习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正在处理的当前位置? 最佳答案
mySampler被关联到一个采样寄存器,第一个是S0。
SpriteBatch使用相同的寄存器绘制纹理,因此请确保已对其进行了初始化。
该寄存器与GraphicDevice.Textures和GraphicDevice.SamplerStates数组有关。
实际上,在您的着色器中,您可以使用以下语句:
sampler TextureSampler : register(s0);
编辑:
如果需要在着色器中使用第二个纹理,则可以执行以下操作:
HLSL
sampler MaskTexture : register(s1);
C#:
GraphicsDevice.Textures[1] = MyMaskTexture;
GraphicsDevice.SamplerStates[1].AddresU = TextureAddresMode....
Color0不是注册表,并且不保存当前的像素颜色。它指的是您正在使用的顶点结构。
当您定义一个顶点(例如VertexPositionColor)时,该顶点包含一个Position(位置)和一个Color(颜色),但是如果要定义具有两种颜色的自定义顶点,则需要一种方法来区分这两种颜色…… channel 。
后缀数字表示您在当前顶点中引用的 channel 。