我最近开始学习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甚至还没有任何数据。我没有设置它或根本没有传递纹理,但是它神奇地包含了我的纹理数据。

另外,诸如此类的东西之间有什么区别?COLORCOLOR0或者TEXCOORDTEXCOORD0
我可以做出一个逻辑上的猜测,并说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 。

10-07 20:09