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
- Dyskusja na temat meta na temat duplikatów z różnych witryn oraz tego, czy stanowią problem
- Jeśli masz dodatkowe pytania, opublikuj je jako nowe pytania, zamiast edytować je w istniejącym. To sposób, w jaki odpowiedzi na oddzielne pytania mogą być porównywane niezależnie. Nadal możesz umieszczać linki między pytaniami, jeśli są one powiązane.
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ć.