2011-10-01 11 views
11

Ostatnio zajmuję się programowaniem HLSL i jestem bardzo ciekaw, jak niektóre rzeczy, które robię, działają.Kilka prostych pytań XNA/HLSL

Na przykład, mam tutaj bardzo prosty shader, który powoduje, że wszystkie kolorowe piksele w odcieniach szarości mają czerwony kolor.

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(); 
    } 
} 

Rozumiem, że funkcja tex2D łapie kolor piksela w określonym miejscu, ale co ja nie rozumiem, jak mySampler ma nawet żadnych danych. Nie ustawiam go ani nie przekazuję tekstury, ale magicznie zawiera dane mojej tekstury.

także, jaka jest różnica pomiędzy rzeczami jak: COLOR i COLOR0 lub TEXCOORD i TEXCOORD0

mogę wziąć logiczne przypuszczenie i powiedzieć, że COLOR0 jest rejestrem w zespole, który posiada aktualnie używany kolor piksela w GPU. (to może być całkowicie błędne, po prostu stwierdzam, co myślę, że jest)

A jeśli tak, czy to oznacza, że ​​określenie czegoś jak float2 texCoords : TEXCOORD0 będzie domyślnie, chwycić aktualną pozycję, którą przetwarza GPU?

Odpowiedz

7

mySampler jest przypisany do rejestru próbek, pierwszy to S0.

SpriteBatch używa tego samego rejestru do rysowania tekstur, więc na pewno go wcześniej zainicjalizowałeś.

ten rejestr jest związany z tablicami GraphicDevice.Textures i GraphicDevice.SamplerStates.

W rzeczywistości, w cieniującego można użyć to zdanie:

sampler TextureSampler : register(s0); 

EDIT:

jeśli trzeba użyć drugiego tekstury w cieniującego można zrobić tak:

HLSL 
     sampler MaskTexture : register(s1); 

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

Kolor0 nie jest rejestrem i nie ma aktualnego koloru piksela. Odwołuje się do struktury wierzchołków, z której korzystasz.

Po zdefiniowaniu wierzchołka takiego jak VertexPositionColor, wierzchołek zawiera pozycję i kolor, ale jeśli chcesz zdefiniować niestandardowy wierzchołek z dwoma kolorami, potrzebujesz sposobu na rozróżnienie dwóch kolorów ... kanały.

Przyrostek liczby oznacza kanał, do którego odnosisz się w bieżącym wierzchołku.

+0

Gdzie dokładnie jest ono przypisane do próbki w rejestrze? Nie określiłem, który rejestr pobierze próbkę, więc domyślam się, że pobierze domyślnie s0 bez jakiejkolwiek specyfikacji kodu? Ponadto pojawia się kolejne pytanie: czy 'sampler' będzie działał tak samo jak' sampler2D'? – inline

+0

niezależnie od operacji rysowania wykonaj, użyj tych rejestrów, jeśli używasz spritebatch lub podstawowy efekt wcześniej z tą teksturą, to robione jest samoistnie ... – Blau

+0

Słodkie. Dziękuję za oczyszczenie niektórych rzeczy. :) – inline

Powiązane problemy