Fixed-Function vs. Shaders: Które dla początkujących?

16

Obecnie idę na studia informatyczne. Chociaż w pewnym momencie planuję wykorzystać istniejący silnik do stworzenia małej gry, moim celem jest teraz poznanie podstaw: programowania 3D. Przeprowadziłem już badania dotyczące wyboru między DirectX a OpenGL, a ogólne odczucia, które z tego wynikły, były takie, że niezależnie od tego, czy wybierzesz OpenGL czy DirectX jako platformę kół treningowych, wiele wiedzy można przenieść na inną platformę . Dlatego, ponieważ OpenGL jest obsługiwany przez więcej systemów (prawdopodobnie głupi powód, aby wybrać, czego się uczyć), zdecydowałem, że najpierw nauczę się OpenGL.

Po podjęciu decyzji o nauce OpenGL, przeprowadziłem dalsze badania i dowiedziałem się o dychotomii, której przez jakiś czas nie byłem świadomy: OpenGL o stałej funkcji vs. OpenGL z programowalnym shaderem. Na początku myślałem, że to oczywisty wybór, że powinienem nauczyć się OpenGL opartego na modułach cieniujących, ponieważ jest to obecnie najczęściej używane w branży. Potem jednak natknąłem się na bardzo popularny program do nauki nowoczesnej grafiki 3D autorstwa Jasona L. McKessona, znajdujący się tutaj: http://www.arcsynthesis.org/gltut/

Czytam fragmenty wprowadzające, aw sekcji „O tej książce” autor stwierdza:

„Po pierwsze, wiele z tego, czego się nauczyliśmy dzięki temu podejściu, musi być nieuchronnie porzucone, gdy użytkownik napotka problem graficzny, który musi zostać rozwiązany za pomocą programowalności. Programowalność usuwa prawie cały potok stałej funkcji, więc wiedza nie jest łatwo przenoszona”.

jednocześnie jednocześnie sprawia, że ​​stała funkcjonalność zapewnia łatwiejszą, bardziej natychmiastową krzywą uczenia się dla początkujących, stwierdzając:

„Generalnie uważa się, że najłatwiej jest uczyć programistów grafiki neofitów za pomocą potoku o stałej funkcji”.

Oczywiście możesz zrozumieć, dlaczego mogę się spierać o to, którego paradygmatu się uczyć: czy spędzam dużo czasu ucząc się (a potem ucząc się) sposobów stałej funkcjonalności, czy też zaczynam od shaderów? Moim głównym zmartwieniem jest to, że nowoczesne programowalne shadery w jakiś sposób wymagają od programisty zrozumienia potoku o stałej funkcji, ale wątpię, by tak było.

TL; DR = Jako początkujący programista gier, czy w moim najlepszym interesie jest uczyć się programowania 3D za pomocą stałej funkcjonalności czy nowoczesnego programowania opartego na shaderze?

Rob Hays
źródło
Istnieją również podobne pytania ...
notlesh
„jednocześnie jednak dowodzi, że stała funkcjonalność zapewnia łatwiejszą, bardziej natychmiastową krzywą uczenia się dla początkujących, stwierdzając:„ Jestem ciekawy. Jak to dokładnie czyni tę sprawę? Ponieważ cytat wyraźnie mówi: „Uznaje się to za najłatwiejsze ...” (podkreślenie dodane). Jak w, można to uznać za prawdę, ale to nie znaczy, że to prawda.
Nicol Bolas,
Tak, to był niezręczny sposób na sformułowanie tego.
Rob Hays,
Potok o stałej funkcji został przestarzały zarówno w OpenGL, jak i DirectX, więc nie marnowałbym z nim twojego czasu. Podstawowe moduły cieniujące są dość proste i na pewno nie bardziej skomplikowane niż zrozumienie wystarczające do uruchomienia kontekstu renderowania.
3Dave

Odpowiedzi:

30

Nie kupuję argumentu, że łatwiej jest zacząć od rzeczy o stałej funkcji. Może się zdarzyć, że funkcja stałej funkcji pozwala wykonywać pewne czynności z mniejszym kodem - na przykład w stałej funkcji OpenGL można uzyskać bardzo podstawowe oświetlenie / cieniowanie glEnable(GL_LIGHTING)i kilka innych wywołań. Problem polega na tym, że gdy tylko chcesz czegoś nieco innego - na przykład oświetlenia na piksel zamiast oświetlenia na wierzchołek - musisz całkowicie zrezygnować z funkcji o stałej funkcji i napisać moduł cieniujący, aby zaimplementować zarówno dowolną stałą funkcjonalność, jakiej używałeś wcześniej plus wszystko, co chciałbyś zmienić.

Wydaje się, że używanie shaderów przez cały czas byłoby prostsze i mniej mylące. Shadery wymagają nieco więcej pracy instalacyjnej, ponieważ masz osobny plik źródłowy, który należy załadować i skompilować, kilka dodatkowych wywołań C do wyszukiwania i ustawiania parametrów itp. Ale kiedy już uruchomisz shader, jest to najłatwiejsza rzecz aby zakodować kilka różnych efektów, wypróbować różne pomysły itp. I nie musisz się martwić, gdzie są granice systemu o stałej funkcji i czy może on lub nie może robić, co chcesz; shadery mogą robić wszystko, do czego możesz pisać kod, modulo zwykłe ograniczenia wydajności i pamięci.

Nathan Reed
źródło
Fajnie, dzięki za odpowiedź. Najprawdopodobniej skończę właśnie dla shaderów.
Rob Hays,
3
+1 - to także coś w rodzaju „Learning C ++” vs „Learning BASIC”. Nauka języka C ++ zajmie Ci więcej czasu, ale na dłuższą metę nauczysz się więcej.
Jonathan Dickinson
3
Chciałbym polecić opengl-tutorial.org . Strona dość dobrze wyjaśnia podstawy i używa tylko shaderów.
Exilyth,
2

Po drugie idę prosto na shadery. Naprawdę nie jest to trudniejsze do skonfigurowania, a kiedy przejdziesz tę pierwszą przeszkodę, masz pełną moc na wyciągnięcie ręki.

Co więcej, przekonasz się, że programowanie cieniowania bardziej odpowiada matematycznym równaniom, które widzisz w książkach i wykładach graficznych na studiach.

MGB
źródło
0

Sugerowałbym użycie potoku funkcji stałej jako szkieletu twojego programu. Uważam, że łatwiej jest wyświetlać coś przy użyciu zamiast czysto shaderów. Następnie, gdy wiesz, że nie pomieszałeś swoich wierzchołków lub normalnych, możesz powoli, ale pewnie wkroczyć do cieniującego świata.

Oskar
źródło