2011-10-01 11 views
11

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?

Respuesta

7

mySampler se asigna a un registro de muestra, el primero es S0.

SpriteBatch usa el mismo registro para dibujar texturas, por lo que lo ha iniciado antes.

este registro están en relación con las matrices GraphicDevice.Textures y GraphicDevice.SamplerStates.

De hecho, en su shader puede utilizar esta frase:

sampler TextureSampler : register(s0); 

EDIT:

si es necesario utilizar una segunda textura en su shader usted puede hacer esto:

HLSL 
     sampler MaskTexture : register(s1); 

C#: 
     GraphicsDevice.Textures[1] = MyMaskTexture; 
     GraphicsDevice.SamplerStates[1].AddresU = TextureAddresMode.... 

Color0 no es un registro y no contiene el color de píxel actual. Se refiere a la estructura de vértice que está utilizando.

Cuando define un vértice como un VertexPositionColor, el vértice contiene una Posición y un Color, pero si desea definir un vértice personalizado con dos colores, necesita una manera de discriminar entre los dos colores ... el canales

El sufijo de número significa el canal al que hace referencia en el vértice actual.

+0

¿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

+0

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

+0

Sweet. Gracias por aclarar algunas cosas para mí. :) – inline

Cuestiones relacionadas