He estado ingresando a la programación de HLSL últimamente y tengo mucha curiosidad sobre CÓMO algunas de las cosas que estoy haciendo realmente funcionan.Algunas preguntas simples de XNA/HLSL
Por ejemplo, tengo este sombreador muy simple aquí que sombrea los píxeles de color verde azulado a un color rojo.
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();
}
}
entiendo que la función tex2D
agarra el color del píxel en la ubicación especificada, pero lo que no entiendo es cómo mySampler
incluso tiene ningún dato. No estoy configurando o pasando una textura en absoluto, sin embargo, contiene mágicamente los datos de mi textura.
Además, ¿cuál es la diferencia entre cosas como: COLOR
y COLOR0
o TEXCOORD
y TEXCOORD0
puedo tomar una suposición lógica y decir que COLOR0
es un registro en el montaje que mantiene el color del píxel utilizado actualmente en la GPU. (eso puede estar completamente equivocado, solo estoy diciendo lo que creo que es)
Y si es así, ¿significa que especificar algo como float2 texCoords : TEXCOORD0
tomará, de manera predeterminada, la posición actual que está procesando la GPU?
¿Dónde exactamente se asigna a una muestra en el registro? No he especificado de qué registro toma la muestra, así que supongo que simplemente tomará s0 por defecto sin ninguna especificación de código. Además, aparece otra pregunta: ¿'sampler' funcionará igual que' sampler2D'? – inline
sea cual sea la operación de extracción que haga, utilice esos registros, si está utilizando spritebatch o un efecto básico antes con esa textura, se ha hecho intrínsecamente ... – Blau
Sweet. Gracias por aclarar algunas cosas para mí. :) – inline