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?
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
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
Słodkie. Dziękuję za oczyszczenie niektórych rzeczy. :) – inline