Zainteresowałem się studiowaniem programowania graficznego, więc oczywistym punktem wyjścia była nauka OpenGL. Ale gromadząc rozproszone informacje na forach i stronach, wydaje się, że czysta implementacja OpenGL zanika, ponieważ większość rzeczy sprzed 3.0 jest przestarzała i cytuje recenzję na Amazon, „od 3.0 chodzi o shadery”. Również książki, które widziałem, wyglądają tak, jakby tylko znakomite pokrywały nowszą wersję, ale tylko częściowo, ponieważ duża część książki uczy przestarzałych funkcji, a są książki specjalnie dla GLSL.
Właśnie tam natknąłem się na mój pierwszy problem, niektóre programy nie obsługują GLSL, w tym notebook ze zintegrowaną grafiką Intel, którego planowałem użyć. Funkcja
GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);
powoduje błąd segmentacji i na pierwszy rzut oka mój sterownik nie obsługuje shaderów
Moje pytanie brzmi: jaka jest opłacalność tworzenia gry tylko w OpenGL? czy będę brakować niezastąpionych dobrych funkcji w języku modułu cieniującego? A jakiego sprzętu (starszej generacji i3, i5, i7, stare VGA) mogę spodziewać się, że poprawnie uruchomię grę z modułami cieniującymi?
Odpowiedzi:
Kod modułu cieniującego jest zdecydowanie bardziej przejrzysty i łatwiejszy do zrozumienia niż bałagan wywołań glTexEnv, glTexGen i matrycy tekstur oraz ma tę zaletę, że możesz wyrazić dowolną mniej lub bardziej dowolną operację matematyczną przy użyciu go (czego nie można zrobić z ustalonym potok - to, co nazywacie „czystym OpenGL”). Jedynym potencjalnym minusem jest to, że musisz napisać pewną ilość infrastruktury wspierającej w swoim kodzie, zanim zaczniesz z nich korzystać, podczas gdy w starym stylu możesz praktycznie zanurkować. Nazywam to „potencjalnym” minusem, ponieważ ja właściwie myślę, że dzięki temu przygotowujesz się i uczysz z wyprzedzeniem - OpenGL ma reputację „łatwej” i czasami widzisz, jak ludzie są oszukiwani i nurkują, nie wiedząc, co robią wcześniej,
Jeśli chodzi o sprzęt, możesz polegać na prawie wszystkim wydanym w ciągu ostatnich 5/6/7 lat, aby mieć pewien stopień obsługi shaderów, ale - w przypadku starszych Intelsów (niektóre z serii 9xx) - nie będzie to GLSL, ale zamiast tego będą starsze rozszerzenia GL_ARB_vertex_program i GL_ARB_fragment_program . Używają one asemblera podobnego do języka shadera, ale - spowiedź - osobiście bardzo go lubię. Jest właściwie dość łatwy w użyciu, jeśli brakuje mu bardziej nowoczesnych funkcji (takich jak rozgałęzianie) i wymaga więcej linii kodu modułu cieniującego, aby zrobić to samo. Infrastruktura pomocnicza wymagana w głównym programie dla tych rozszerzeń jest znacznie lżejsza niż w przypadku GLSL.
Nie oznacza to jednak, że poleciłbym je nad GLSL, ale są one opcją, która jest dostępna, jeśli naprawdę potrzebujesz uruchomić tę klasę sprzętu i warto wiedzieć, że istnieją, co prowadzi mnie do ostatniego punktu . Czy naprawdę jesteś pewien, że naprawdę musisz uruchomić tę klasę sprzętu (np. W przypadku notebooka możesz po prostu zaniedbać uzyskanie punktów wejścia)?
źródło
Należy również zauważyć, że nie ma już „czystego OpenGL”.
OpenGL ES 2.0 porzucił wszystkie rzeczy nie będące modułami cieniującymi, a ponieważ WebGL jest na nim oparty, również działa tylko z modułami cieniującymi. OpenGL 3.0 wycofał wszystkie rzeczy o stałej funkcji, a 3.1 usunął je (w podstawowych profilach. Większość implementacji obsługuje profile kompatybilności, ale MacOSX nie obsługuje ich wersji 3.2).
Nie sugerowałbym więc uczenia się OpenGL bez shadera.
źródło
Jeśli w przeszłości zajmowałeś się programowaniem, pisanie własnego kodu modułu cieniującego za pomocą GLSL będzie znacznie przyjemniejsze. Początkowo próbowałem nauczyć się OpenGL o stałej funkcji i było to dla mnie trudniejsze, ponieważ nie miało to sensu. Potem próbowałem nauczyć się GLSL za pomocą pomarańczowej książki i od tego czasu było o wiele łatwiej. Tylko moje 2 centy.
Zdecydowanie wybrałbym GLSL ze względu na moc pisania programów dla GPU.
źródło