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