Zostało to w dużej mierze uwzględnione w komentarzach, ale w interesie posiadania odpowiedzi na miejscu, pozwól mi podsumować, które wstępnie zdefiniowane zmienne GLSL zniknęły w profilu podstawowym i które nadal tam są.
W większości przypadków wstępnie zdefiniowane zmienne zostały usunięte z shaderów profili głównych jako bezpośrednia konsekwencja usunięcia z API znacznej części potoków o ustalonej funkcji. Było wiele zmiennych uniform
, które odzwierciedlały stan, który po prostu już nie istnieje. Typowe przykłady to:
- Naprawiono stan transformacji funkcji (
gl_ModelViewMatrix
, gl_ProjectionMatrix
itd.).
- Parametry oświetlenia (
gl_Light*
).
- Parametry materiału (
gl_Material*
).
- Samoloty zaciskowe (
gl_Clip*
).
Podobnie, wierzchołkowe moduły cieniujące, które otrzymały atrybuty ustalonych wierzchołków funkcji, zniknęły, ponieważ w profilu podstawowym obsługiwane są tylko ogólne atrybuty. Należą gl_Vertex
, gl_Normal
, gl_Color
itd
Nie
też kiedyś niektóre wstępnie zdefiniowane varying
zmienne jak gl_FrontColor
, gl_BackColor
i gl_TexCoord
że są wszystkie zniknęły, i mogą być łatwo zastąpione przez definiowanie własnych out
/in
zmienne .
Znikają również wstępnie zdefiniowane wyjścia modułu cieniującego gl_FragColor
i gl_FragData
. To interesujący przypadek, ponieważ powodem nie jest wycofanie funkcji. Rozumiem, że zostały one wycofane, ponieważ nie były wystarczająco elastyczne, aby dostosować się do aktualnej funkcjonalności. Ponieważ typ gl_FragColor
był vec4
, dane wyjściowe modułu cieniującego fragmentu musiałyby być wektorami z elementami zmiennoprzecinkowymi. To nie działa dobrze, jeśli cel renderowania ma inny typ, np. jeśli renderujesz teksturę całkowitą.
Jakie wstępnie zdefiniowane zmienne pozostały? O wiele mniej niż wcześniej, jest jeszcze kilka, które wszystkie odnoszą się do stałej funkcji, która wciąż jest na miejscu w programowanym rurociągu. Przykłady obejmują:
- Wierzchołek interfejs między werteksach i fragmentu cieniującego, który składa się głównie z wyjścia
gl_Position
w tego modułu wierzchołkowego i wejście w cieniującego fragmentu gl_FragCoord
współrzędnych.Nadal istnieje wiele stałych bloków funkcyjnych, które znajdują się pomiędzy wierzchołkami i cieniami fragmentów, takimi jak obcinanie i rasteryzacja. Te ustalone bloki funkcyjne działają na współrzędnych wierzchołków, więc predefiniowane zmienne nadal mają sens.
- Niektóre zmienne związane z instancją (
gl_VertexID
, gl_InstanceID
).
gl_ClipDistance
do obsługi przycinania przy użyciu dowolnych płaszczyzn, która jest nadal obecna w formie ustalonej funkcji.
gl_FrontFacing
. Kolejność uzwojenia trójkątów jest określana za pomocą ustalonej funkcji i udostępniana jest shaderowi fragmentu.
Żadna z tych list nie jest wyczerpująca, ale mam nadzieję, że jest to przydatny przegląd i zawiera pewne informacje. Jak zwykle, dokumenty specyfikacji dostarczają ostatecznej i pełnej odpowiedzi.
Żadna z tych [zmiennych wbudowanych] (http://www.opengl.org/wiki/Built-in_Variable_ (GLSL)) nie jest uznawana za przestarzałą. Przed głównymi profilami (profile kompatybilności), były wbudowane, które odzwierciedlały ustalone atrybuty potoku, takie jak 'gl_Color',' gl_Normal', itd. –
Och, przepraszam. Czytałem, że niektóre zmienne 'gl_ *' zostały wycofane i uważano, że wszystkie z nich były. Dziękuję za wyjaśnienie. W każdym razie, w jaki sposób sprawić, by działało z niestandardową zmienną wyjściową? Lub po prostu użyć atrybutu gl_Position, aby ustawić pozycję vertex? – michy04
Musisz nadal używać 'gl_Position'. Ta zmienna jest wyjątkowa, ponieważ określa współrzędne używane przez stałe bloki funkcyjne pomiędzy shaderami wierzchołków i fragmentów (przycinanie, rasteryzacja itd.). Nie można go zastąpić zdefiniowaną przez siebie zmienną. Oprócz przykładów, o których już wspomniałem @BrettHale, również 'gl_FragColor', który był wcześniej zdefiniowanym wyjściem z ** shader ** fragment, również jest przestarzałe. –