В последнее время я начал программировать на 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 обрабатывает?