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?
źródło
Odpowiedzi:
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.
źródło
Powiedziałbym, żeby zacząć od stałej funkcji GLUT. Nie powiem o tym wiele, ale pomysły stojące za shaderem są dość skomplikowane, a niezbędna wiedza to podstawowe programowanie 3d (tj. Tworzenie wierzchołków i macierze transformacji itp.). Jest o wiele więcej miejsc, które można zepsuć za pomocą shaderów, jest o wiele więcej do kodowania.
Sprawdź mój poradnik , a te lighthouse3d te
źródło
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.
źródło
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.
źródło