OpenGL 4.4 czyli kolejny krok w rozwoju grafiki 3D
Khronos ogłasza OpenGL 4.4 dokładnie rok po wydaniu OpenGL 4.3 Podczas SIGGRAPH 2013Khronos niezawodnie wydało kolejną specyfikację OpenGL w wersji 4.4. Ta wersja jak i poprzednie z serii 4.x działać powinna na wszystkich kartach graficznych obsługujących OpenGL 4 (jeśli producenci wydadzą zaktualizowane sterowniki).
Wsparcie od producentów GPU
W ciągu jednej doby Nvidia wydała już eksperymentalne sterowniki z nowym OpenGL'em, a AMD wreszcie dogoniło OpenGL 4.3, a obsługa 4.4 jest już zapowiedziana. Dużą zmianą w stosunku do poprzednich wersji "pełnego" OpenGL jest wymóg certyfikowania sterowników pod kątem testów zgodności które Khronos przygotował dla sterowników. Od czasu OpenGL 1.4 (czyli bardzo, bardzo, bardzo dawno temu), OpenGL nie posiadał oficjalnie takiego zestawu (programiści odpowiedzialni za sterowniki musieli takie tworzyć na swoje potrzeby, jednakże były one różne dla różnych producentów, a testy z projektu Mesa, były do nie dawna w ogóle nie zauważane i pokrywają w pełni tylko OpenGL 3.1). Zbiór testów powstał na bazie testów OpenGL ES 3.0 i testów które nadesłali członkowie Khronos, a całość na pewno przyczyni się do zmniejszenia ilości błędów w implementacjach OpenGL'a.
Nowości, czyli to co lubimy najbardziej
Jeśli chodzi o same nowości zaprezenowane przez Khronos, to możemy podzielić je na trzy kategorie:
(Kolejne) ułatwienia w portowaniu kodu z DX:
- GL_ARB_buffer_storage -> Pozwalającą aplikacji na kontrolę w której pamięci powinny znaleść się dane potrzebne GPU dla renderowania. Przy założeniu, że aplikacja wie najlepiej co będzie robić z tymi danymi, może to zaowocować sporym przyspieszeniem w porównaniu do sytuacji gdy sterowniki błędnie zgaduje. Mechanizm ten był dostępny w DX, choć w mniej rozwiniętej formie.
- GL_ARB_vertex_type_10f_11f_11f_rev -> Odpowiada formatowi upakowania 3 wierzchołków o mniejszej precyzji
- GL_ARB_texture_mirror_clamp_to_edge -> Odpowiada trybowi łączenia tekstur z DX
Oprócz ARB_buffer_storage są to zmiany które zaoszczędzą programistom czasu przy przepisywaniu kodu z DX do OpenGL.
Druga kategoria to wymierne zmiany w API:
- GL_ARB_query_buffer_object -> Pozwala na zostawienie danych z zapytań w GPU, tak, że CPU w ogóle nie musi być zaangażowane, ani też nie jest potrzebna synchronizacja pomiędzy CPU a GPU. Wzrost wydajności kiedy dane z zapytania mają być wykorzystane do kolejnych obliczeń na GPU.
- GL_ARB_enhanced_layouts -> Pozwala na dokładniejsze określanie formatu danych wejściowych i wyjściowych dla shaderów, tak że nie trzeb ich specyfikować przez API (a kompilator i linker mogą dokładniej wymusić te wymagania).
- GL_ARB_multi_bind -> To rozszerzenie poświęcone tylko poprawie wydajności. mW OpenGL "bindowanie" to operacja która ustawia w GPU konkretne obiekty jako te które mają być użyte. Takie operacje są kosztowne obliczeniowo (synchronizacja pomiędzy CPU a GPU, czas który sterownik GPU poświęca na przygotowanie operacji, czas który GPU poświęca na ustawianie, który mógł by być poświęcony na renderowanie). Od teraz operacje bindowania mogą być grupowane w jedno API, co powinno znacznie przyśpieszyć niektóre scenariusze.
Trzecia grupa czyli nowe (nie obowiązkowe) rozszerzenia ARB:
- GL_ARB_bindless_texture -> Rozszerzenie wymyślone przez Nvidię, które zamiast bindowania tekstur do tak zwanych jednostek teksturowania (sprzętowych jednostek które pobierają dane z tekstur, na potrzeby dalszych obliczeń), wprowadzają wirtualne tekstury, gdzie ilość dostępnych adresów dla tekstur idzie w miliony. Odpada kosztowne bindowanie, a i ilość tekstur do których mają dostęp shadery na GPU rośnie o kilka rzędów wielkości
- GL_ARB_sparse_texture -> Rozszerzenie tym razem od AMD, pozwalające na przechowywanie tylko części tekstury w pamięci GPU, dające kontrole nad tym które konkretnie dane znajdują się w pamięci w ręce programisty. Też potencjalnie ograniczające liczbę bindowań, oraz umożliwiającą lepsze wykorzystanie transferu danych do i z karty GPU.
Sterowniki Nvidi o których wspominałem na początku już obsługują ARB_bindless_texture i ARB_sparse_texture. Sterowniki od AMD jeszcze nie udostępniają żadnego rozszerzenia, jednak ARB_sparse_texture jest oparte o AMD_sparse_texture więc przynajmniej to rozszerzenie powinno szybko się pojawić.
Podsumowanie
Co w praktyce oznacza nowy OpenGL oraz nowe rozszerzenia? Khronos wywiązuje się ze swojej obietnicy szybkiego rozwijania OpenGL. Dodaje również niektóre obiecane możliwości z rewolucyjnego ale zawieszonego "OpenGL 3.0", w sposób ewolucyjny ułatwiając programistom pracę z API. Khronos zaczął też się troszczyć o zgodność sterowników ze standardem. Wyraźnie też widać, że szykuje się nam nowa generacja GPU czego wyrazem są nowe rozszerzenia. OpenGL 4.4 jest więc wyrazem solidnej strategii rozwoju API dla wysokowydajnych obliczeń graficznych. Świat w którym dominuje tylko jedna firma i jedno zamknięte API jest już za nami.
(Teraz czekamy na wieści o oficjalnym API w PS4 :D )