Quelques questions simples sur XNA / HLSL

Je me suis lancé dans la programmation HLSL ces derniers temps et je suis très curieux de savoir comment fonctionnent certaines de mes activités.

Par exemple, j’ai ici ce shader très simple qui assombrit tous les pixels de couleur bleu sarcelle en une couleur rougeâtre.

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 = comstack ps_2_0 MyPixelShader(); } } 

Je comprends que la fonction tex2D saisit la couleur du pixel à l’emplacement spécifié, mais ce que je ne comprends pas, c’est la façon dont mySampler contient des données. Je ne le mets pas ou ne passe pas du tout à une texture, mais elle contient magiquement les données de ma texture.

Aussi, quelle est la différence entre des choses comme: COLOR et COLOR0 ou TEXCOORD et TEXCOORD0

Je peux faire une supposition logique et dire que COLOR0 est un registre en assembleur qui contient la couleur de pixel actuellement utilisée dans le GPU. (cela peut être complètement faux, je ne fais que dire ce que je pense que c’est)

Et si oui, cela signifie-t-il que vous spécifiez quelque chose comme float2 texCoords : TEXCOORD0 saisira, par défaut, la position actuelle que le GPU est en float2 texCoords : TEXCOORD0 traiter?

mySampler est associé à un registre d’échantillons, le premier est S0.

SpriteBatch utilise le même registre pour dessiner des textures, donc vous l’avez déjà bien initié.

ces registres sont en relation avec les tableaux GraphicDevice.Textures et GraphicDevice.SamplerStates.

En fait, dans votre shader, vous pouvez utiliser cette phrase:

  sampler TextureSampler : register(s0); 

MODIFIER:

Si vous devez utiliser une deuxième texture dans votre shader, vous pouvez créer ceci:

  HLSL sampler MaskTexture : register(s1); C#: GraphicsDevice.Textures[1] = MyMaskTexture; GraphicsDevice.SamplerStates[1].AddresU = TextureAddresMode.... 

Color0 n’est pas un registre et ne contient pas la couleur de pixel actuelle. Cela fait référence à la structure de vertex que vous utilisez.

Lorsque vous définissez un sumt comme un VertexPositionColor, il contient une position et une couleur, mais si vous souhaitez définir un sumt personnalisé avec deux couleurs, vous avez besoin d’un moyen de distinguer les deux couleurs … des canaux.

Le suffixe numérique signifie le canal auquel vous faites référence dans le sumt actuel.