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