2014-06-25 13 views
8

Obecnie uczę się OpenGL z shaderów (3.3). Jest jedna rzecz, która nie może wydawać się działać. Czytałem, że używanie wbudowanych zmiennych takich jak gl_Position i gl_FragCoords jest przestarzałe w OpenGL 3+, dlatego chciałem użyć własnej zmiennej wyjściowej.GLSL - Używanie niestandardowego atrybutu wyjściowego zamiast gl_Position

tego Więc zamiast:

#version 330\n 
layout(location=0) in vec2 i_position; 
out vec4 o_position; 
void main() 
{ 
    gl_Position = vec4(i_position, 0.0, 1.0); 
}; 

pisałem tak:

#version 330\n 
layout(location=0) in vec2 i_position; 
out vec4 o_position; 
void main() 
{ 
    o_position = vec4(i_position, 0.0, 1.0); 
}; 

shaderów kompilować bez problemów w obu przypadkach, ale drugi kod generuje tylko pusty ekran. Czy muszę w jakiś sposób określić, która zmienna jest wyjściowa?

+4

Ż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. –

+0

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

+2

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. –

Odpowiedz

26

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.

+2

Dziękuję wszystkim za odpowiedzi, które bardzo mi wyjaśniły. OpenGL jest dość złożonym API, więc wiele rzeczy nie jest na pierwszy rzut oka oczywistych. – michy04

1

Jak już powiedział nasz kolega, gl_Position nie jest przestarzałe. Właśnie kupiłem książkę OpenGL Superbible 6. wydanie o OpenGL 4.3 i zaraz na pierwszych stronach (strona 18) ta funkcja jest używana.

Mogę tylko polecić, aby dostać książkę. Jest napisany przez ludzi projektujących OpenGL i jego naprawdę dydaktyczną.

Byłem tak zagubiony jak ty, ponieważ chciałem się uczyć przez Internet lub wymianę stosów, a po otrzymaniu tej książki mam wspaniały czas z OpenGL. Myślę, że to, czego się nauczę w ciągu trzech tygodni z tą książką, będzie warte więcej niż 5 lat nauki z Internetu. OpenGL nie jest skomplikowany i nie jest żadną "bestią", jak wiele osób mówi, jak długo się jej nauczysz z tej książki. Jeśli nauczysz się tego przez Internet, jestem pewien, że to coś więcej niż bestia!

Ta książka mówi na samym początku, że nie będzie uczyć niczego, co nie jest rdzeniem OpenGL, więc możesz być pewien, że nie wpadniesz w pułapki takie jak te, które zrobiłeś.

Możesz kupić tę książkę używaną w Amazon za tak tanie, jak 50 centów. Mogę to tylko polecić!

+0

Czy próbowałeś odpowiedzieć na pytanie? – Qwertiy

+1

Myślę, że tak, jeśli pierwsze zdanie.A potem potwierdziłem to, co do którego podejrzewałem, że Internet nie jest pełnym źródłem informacji dla zrozumienia, co dzieje się z cieniowanymi wersjami OpenGL. Szkoda, ponieważ OpenGL ma wiki. –

Powiązane problemy