Używam GC
do pisania shaderów wewnątrz Unity3D
.CG: Określ zmienną, której nie można interpolować między werteksem a modułem cieniującym
Używam atrybutów wierzchołków kolorów do przekazywania niektórych parametrów do modułu cieniującego. Nie będą one używane do definiowania kolorów i powinny być przekazywane z modułu cieniującego wierzchołka do modułu cieniującego pikseli bez modyfikowania ich.
Jest to struktura Biorę jako wejście z Unity3D do vertex shader:
struct appdata_full {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
float4 texcoord1 : TEXCOORD1;
fixed4 color : COLOR;
#if defined(SHADER_API_XBOX360)
half4 texcoord2 : TEXCOORD2;
half4 texcoord3 : TEXCOORD3;
half4 texcoord4 : TEXCOORD4;
half4 texcoord5 : TEXCOORD5;
#endif
};
Jest to struktura zwracana przez cieniowania wierzchołków jako wejście do fragmentu:
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
fixed4 col: COLOR;
};
Jeśli Po prostu przekazuję ten parametr do modułu cieniującego fragmentu, oczywiście zostanie on interpolowany:
v2f vert (appdata_full v)
{
v2f output;
//....
output.col = v.color;
}
Chciałbym przekazać parametr v.color
nie interpolowany do modułu cieniującego fragmentu. Czy to możliwe? Jeśli tak, to w jaki sposób?
EDIT
jak Tim zauważył, jest to oczekiwane zachowanie, ze względu na cieniującego nie może nic innego niż interpolacji kolorów czy te zapadają się od cieniowania wierzchołków do fragmentu zrobić. Postaram się wyjaśnić lepiej, co próbuję osiągnąć. Używam kolorów wierzchołków do przechowywania innych informacji niż kolory. Nie mówiąc o wszystkich szczegółach dotyczących tego, co robię z tym, załóżmy, że można uznać każdy wierzchołek koloru jako identyfikator (każdy wierzchołek tego samego trójkąta, będzie miał ten sam kolor, właściwie każdy wierzchołek tej samej siatki).
Wykorzystałem więc sztuczkę koloru do maskowania niektórych parametrów, ponieważ nie mam innego sposobu, aby to zrobić. Ta informacja musi być w jakiś sposób dostępna w module cieniowania fragmentów. Jeśli jako parametr wyjściowy modułu cieniującego wierzchołka zostanie przekazana ta informacja zakodowana w kolorze, zostanie ona interpolowana na fragmencie, który nie może już jej użyć.
Poszukuję sposobu na propagowanie tych informacji w niezmienionym stanie do fragmentu shadera (być może jest możliwe użycie zmiennej globalnej lub coś podobnego ?, jeśli tak, to jak?).
Jak zamierzasz pogodzić trzy wejścia (wierzchołki) na piksel jeśli nie interpolacji wartości czego można się spodziewać się zdarzyć, jeśli każdy wierzchołek trójkąta ma inną wartość – Tim
@Tim? : ok .. masz rację, rozumiem twój sprzeciw . Chodzi o to, że faktycznie kolory nie są kolorami w moim cieniu. Używam wartości kolorów do przechowywania innych informacji. Muszę przesłać tę informację o wierzchołku z wierzchołka do shadera fragmentu, ostatecznie nie przekazując go jako parametru wyjściowego dla modułu cieniującego wierzchołków, ale używając jakiejś "zmiennej gloabalnej", jeśli coś takiego jest możliwe. Mam nadzieję, że będę jasny. – Heisenbug
Nie ma znaczenia, czy jest to kolor, indeks czy cokolwiek innego. Powiedzmy, że rysujesz pojedynczy trójkąt. W oparciu o niektóre arbitralne obliczenia na jeden wierzchołek; vertex 0 output "5", vertex 1 outputs "10", vertex 2 outputs "15". Które z tych trzech liczb chcesz pokazać w shaderze fragmentów? Jeśli to naprawdę wartość globalna, niż użycie jednolitego, ale poza tym myślę, że nie w pełni to przemyślałeś. Chyba że po prostu powiesz "Zawsze chcę wartości wierzchołków 0 i zignorować pozostałe dwa", to nie ma większego sensu. – Tim