Przejdź na czysty OpenGL lub GLSL? [Zamknięte]

11

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?

ibrabeicker
źródło
1
GLSL to OpenGL, myślę, że twoje pytanie dotyczy tego, czy sprzęt, którego zamierzasz używać, jest kompatybilny z OpenGL 3, a nie konkretnie GLSL.
spowolniony,
@Daniel, więc jeśli sprzęt / sterownik jest zgodny z OpenGL 3.0, jest zgodny z GLSL?
ibrabeicker,
1
GLSL jest częścią specyfikacji OpenGL 3.0, więc tak jest.
spowolniony,
1
Mówisz: „z wyglądu mój sterownik nie obsługuje shaderów”. Jaką wersję OpenGL otrzymujesz? Czy poprawnie ładujesz wszystkie dostępne funkcje OpenGL?
Nicol Bolas,
1
@Papavoikos: Jeśli zwraca NULL, masz o wiele większe problemy niż użycie shaderów. Czy poprawnie tworzysz kontekst OpenGL? Pamiętaj: nie możesz wywoływać żadnych funkcji GL, dopóki nie utworzysz prawidłowego kontekstu i nie zaktualizujesz go.
Nicol Bolas,

Odpowiedzi:

9

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)?

Maximus Minimus
źródło
Zupełnie zaniedbałem fakt, że Mesa3d wciąż jest zgodny ze specyfikacją OpenGL 2.1. Naprawię to
ibrabeicker,
6

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.

Nicol Bolas
źródło
6

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.

Joey Green
źródło