EDYCJA: To jest duplikat pytania z przepełnienia stosu: https://stackoverflow.com/questions/9222217/how-does-the-fragment-shader-know-what-variable-to-use-for-the-color-of-a-pixel

Jeśli chcesz wysłać wartość z Vertex Shader do Fragment Shader, Vertex Shader powinien zadeklarować jedną zmienną jako out, Fragment Shader powinien zadeklarować inną zmienną jako in i obie zmienne muszą mieć takie same nazwy i typy. Ale tak się nie dzieje, gdy chcesz wysłać wartość koloru z modułu cieniującego. W rzeczywistości możesz wywołać zmienną wyjściową, jak chcesz. Dlaczego? W starszej wersji była jedna zmienna o nazwie gl_FragColor
W jaki sposób program łączy zmienną fragmentu wyjściowego z gl_FragColor?

Komentarze

Odpowiedz

Działa prawie dokładnie tak samo, jak dane wejściowe Vertex Shader.

W Vertex Shader masz dane wejściowe. Te dane wejściowe reprezentują indeksy atrybutów wierzchołków, liczby przekazywane do glVertexAttribPointer i

i tak dalej. Ustawiasz, które dane wejściowe są pobierane z którego atrybutu. W GLSL 3.30 używasz następującej składni:

layout(location = 2) in color; 

Ustawia to color Vertex Shader na wejście z atrybutu lokalizacja 2. Przed 3.30 (lub bez ARB_explicit_attrib_location) trzeba by to ustawić jawnie za pomocą glBindAttrbLocation przed łączenie lub wysyłanie zapytań do programu o indeks atrybutu za pomocą glGetAttribLocation . Jeśli nie podasz wyraźnie lokalizacji atrybutu, GLSL przypisze lokalizację arbitralnie (tj. W sposób zdefiniowany w implementacji).

Ustawienie tego w module cieniującym jest prawie zawsze lepsza opcja.

W każdym razie wyjścia Fragment Shader działają prawie dokładnie w ten sam sposób. Fragment Shadery mogą zapisywać w wielu kolorach wyjściowych , które same są mapowane do wielu buforów w buforze ramki . Dlatego musisz wskazać, które wyjście ma trafiać do którego koloru fragmentu.

To zaczyna się od wartości wyjściowej lokalizacji fragmentu. Jest ona ustawiana bardzo podobnie do lokalizacji wejściowych modułu cieniującego wierzchołki:

layout(location = 1) out secColor; 

Istnieją również funkcje API glBindFragDataLocation i glGetFragDataLocation , które są analogiczne do glBindAttribLocation i glGetAttribLocation.

Jeśli nie wykonasz żadnego wyraźnego assi implementacje zazwyczaj przypisują jedną ze zmiennych wyjściowych do lokalizacji 0. Jednak standard OpenGL nie wymaga takiego zachowania, więc nie powinieneś też na nim polegać.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *