Некоторые простые вопросы XNA/HLSL

В последнее время я занимаюсь программированием 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 - это реестр в сборке, который содержит текущий цвет пикселя в графическом процессоре. (это может быть совершенно неправильно, я просто заявляю, что я думаю)

И если это так, означает ли это, что указание типа float2 texCoords : TEXCOORD0 будет по умолчанию захватывать текущую позицию, обрабатываемую графическим процессором?

Ответ 1

mySampler привязан к регистру выборок, первым является S0.

SpriteBatch использует один и тот же регистр для рисования текстур, чтобы вы его предварительно инициализировали.

этот регистр относится к массивам GraphicDevice.Textures и GraphicDevice.SamplerStates.

Фактически, в вашем шейдере вы можете использовать это предложение:

 sampler TextureSampler : register(s0);

EDIT:

если вам нужно использовать вторую текстуру в своем шейдере, вы можете сделать это:

 HLSL
      sampler MaskTexture : register(s1);

 C#:
      GraphicsDevice.Textures[1] = MyMaskTexture;
      GraphicsDevice.SamplerStates[1].AddresU = TextureAddresMode....

Color0 не является реестром и не поддерживает текущий цвет пикселя. Он ссылался на структуру вершин, которую вы используете.

Когда вы определяете вершину, такую ​​как VertexPositionColor, вершина содержит позицию и цвет, но если вы хотите определить пользовательскую вершину с двумя цветами, вам нужен способ различать два цвета... каналы.

Суффикс количества означает канал, к которому вы обращаетесь в текущей вершине.