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