OpenGL ma już pewne koncepcje „obiektowe”.
Na przykład wszystko o identyfikatorze może być przedmiotem jako obiekt (istnieją również rzeczy o szczególnej nazwie „Obiekty”). Bufory, tekstury, obiekty buforów wierzchołków, obiekty tablic wierzchołków, obiekty buforów ramek i tak dalej. Przy odrobinie pracy możesz otoczyć je klasami. Daje również łatwy sposób powrotu do starych przestarzałych funkcji OpenGL, jeśli kontekst nie obsługuje rozszerzeń. Na przykład VertexBufferObject może wrócić do używania glBegin (), glVertex3f () i tak dalej.
Istnieje kilka sposobów odejścia od tradycyjnych koncepcji OpenGL, na przykład prawdopodobnie chcesz przechowywać metadane dotyczące buforów w obiektach buforowych. Na przykład, jeśli bufor przechowuje wierzchołki. Jaki jest format wierzchołków (tj. Pozycja, normalne, tekscoord itd.). Jakie prymitywy używa (GL_TRIANGLES, GL_TRIANGLESTRIP itp.), Informacje o rozmiarze (ile przechowywanych jest liczb zmiennoprzecinkowych, ile trójkątów reprezentują itp.). Aby ułatwić podłączenie ich do poleceń tablic rysowania.
Polecam spojrzeć na OGLplus . To wiązania C ++ dla OpenGL.
Również glxx , to tylko do ładowania rozszerzenia.
Oprócz owijania API OpenGL, powinieneś pomyśleć o stworzeniu na nim nieco wyższego poziomu pierwszego.
Na przykład klasa menedżera materiałów, która jest odpowiedzialna za wszystkie moduły cieniujące, ładowanie i używanie ich. Byłoby to również odpowiedzialne za przeniesienie do nich właściwości. W ten sposób możesz po prostu wywołać: Materials.usePhong (); material.setTexture (sometexture); material.setColor (). Pozwala to na większą elastyczność, ponieważ można używać nowszych rzeczy, takich jak współdzielone obiekty buforów jednolitych, aby mieć tylko 1 duży bufor zawierający wszystkie właściwości używane przez moduł cieniujący w 1 bloku, ale jeśli nie jest obsługiwany, wróć do przesyłania do każdego programu modułu cieniującego. Możesz mieć 1 duży monolityczny moduł cieniujący i przełączać się między różnymi modelami modułów cieniujących za pomocą jednolitych procedur, jeśli jest on obsługiwany, lub możesz wrócić do korzystania z wielu różnych małych modułów cieniujących.
Możesz także spojrzeć na wydatki wynikające ze specyfikacji GLSL na pisanie kodu modułu cieniującego. Na przykład #include byłby niezwykle użyteczny i bardzo łatwy do zaimplementowania w kodzie ładującym modułu cieniującego (istnieje również rozszerzenie ARB ). Możesz także generować kod w locie na podstawie obsługiwanych rozszerzeń, na przykład użyj wspólnego obiektu jednolitego lub wróć do używania normalnych mundurów.
Wreszcie będziesz potrzebować interfejsu API potoku renderowania na wyższym poziomie, który wykonuje takie rzeczy jak wykresy scen, efekty specjalne (rozmycie, blask), rzeczy wymagające wielu przejść renderowania, takie jak cienie, oświetlenie i tym podobne. A do tego interfejs API gry, który nie ma nic wspólnego z graficznym interfejsem API, a jedynie zajmuje się obiektami w świecie.