W nowatorskich nowych wersjach OpenGL (3.0 i 4.0 w górę), wbudowane atrybuty wierzchołków, takie jak gl_Vertex, są uznawane za przestarzałe. "Nową metodą" renderowania czegokolwiek jest określenie własnych atrybutów wierzchołków dla pozycji, koloru itp., A następnie powiązanie tych niestandardowych atrybutów z buforami.W jaki sposób nowoczesne shadery OpenGL powinny być tak napisane, aby były ze sobą kompatybilne?
Moje pytanie brzmi: jak można to zrobić bez ścisłego powiązania kodu renderującego i modułu cieniującego? Jeśli piszę moduł cieniujący, który używa pozycji "pozycja" jako pozycji wierzchołka, kod hosta za pomocą modułu cieniującego musi to wiedzieć i przekazać dane werteksów jako "położenie". Jeśli chcę użyć innego modułu cieniującego, który został napisany w celu przechwytywania danych wierzchołków w "vertex_pos", muszę najpierw przepisać ten moduł cieniujący lub zmodyfikować mój kod hosta, aby zamiast tego wysyłać dane werteksów jako "vertex_pos".
Czy istnieje zestaw nazw najlepszych praktyk dla standardowych atrybutów wierzchołków i fragmentów, które powinny być używane przez wszystkie moduły cieniujące? Czy są tam bałkanizowane standardy specyficzne dla silnika, takie, że moduł cieniujący napisany dla jednego silnika nie może działać na innym bez modyfikacji? Czy też nie ma żadnych standardów, tak, że na ogół każdy obiekt potrzebuje własnego niestandardowego kodu renderującego, aby dopasować go do własnego shadera?
Właściwie to nie jest prawda. GLSL zastrzega ** dowolną ** nazwę zaczynającą się na "gl_". Jeśli główny kompilator pozwala na użycie "gl_Vertex", to nie jest zgodny ze specyfikacją. Specyfikacja 1.50 wyjaśnia, że składnia redeclaration jest ważna tylko dla zmiany właściwości zadeklarowanego typu. Więc nie powinno ci pozwolić na ich redeclare. –
@Nicol: Teraz zaczyna się lawiracja języka: Niektóre osoby mogą widzieć przestarzałe nazwy zmiennych jako predefiniowane identyfikatory z profilu zgodności, a używanie ich w programie GLSL 1.50 jest zmianą właściwości redeclaration; Specyfikacja IMHO nie jest do końca jasna, chociaż w punkcie "# version" wydaje się wskazywać, że rdzeń oznacza "Brak dostępnych nazw kompatybilności". Jeśli ktoś chce być bezpieczny, może użyć preprocesora '#define gl_Vertex glVertex' i użyć tej nazwy w profilu podstawowym. – datenwolf