Czy to ważne, czy uczę się OpenGL czy Direct3D?

11

Czy różnice między tymi dwoma interfejsami API są drobnymi szczegółami dotyczącymi implementacji, co oznacza, że ​​gdy się tego nauczę, będę mógł używać go do wszystkiego? A może istnieją powody, aby uczyć się jednego, a nie drugiego, jeśli chcę mieć możliwość korzystania z niego bez konieczności ponownego uczenia się innego interfejsu API w przyszłości? Czy taki czy inny jest bardziej ogólny?

W szczególności chciałbym móc pisać dla dowolnej karty graficznej, więc kod nie ogranicza się tylko do uruchamiania na kartach konkretnego producenta lub konkretnego modelu. Chciałbym również móc pisać kod, który nadal działa przy braku karty graficznej (choć wolniej).

Czy istnieje różnica w tym, jak przenośny kod będzie działał na różnych platformach (systemach operacyjnych / architekturach)? Interesuje mnie dostępność innych bibliotek, które z nimi współpracują oraz to, czy jedna z nich prowadzi do ograniczenia ograniczeń licencyjnych w szerszym środowisku. Wszystko, co da się zmierzyć, miałoby wpływ na to, czy jeden z nich może być jedynym, którego się uczę bez ograniczania mnie.

trichopaks
źródło
2
odpowiedź grzechotnika jest dobra. Jeśli chcesz nauczyć się Direct3D, możesz przeczytać moją bezpłatną książkę „The Direct3D Graphics Pipeline” . Szczegóły API to głównie Direct3D9, ale pojęcia są takie same. Chodzi o to, że koncepcje programowania grafiki 3D tak naprawdę nie zmieniły się od końca lat 60. XX wieku. Interfejsy API do wyrażania tych pojęć stały się znacznie inteligentniejsze.
zalegalizować

Odpowiedzi:

9

Nie sądzę, żeby miało to duże znaczenie, którego interfejsu API chcesz użyć, skłaniając się ku „grafice programowej”. Ważniejsze rzeczy do nauczenia to typowe pojęcia, których używasz podczas pracy ze scenami 3D. Na przykład chcesz nauczyć się pisać prosty (a później bardziej wyrafinowany) wykres sceny. Te pojęcia są znacznie ważniejsze niż nazwy metod API, które musisz wywołać.

Porównaj to podczas nauki pisania programów. Jeśli jesteś całkiem dobry w pisaniu programów np. W Javie, nie będziesz miał większych problemów z nauką C ++, Objective-C, Swift lub innego języka zorientowanego obiektowo. Ponieważ uczysz się pojęć i myślenia .

Wybór między OpenGL, Direct3D i Metal to przede wszystkim wybór systemu operacyjnego, na który celujesz. Direct3D jest dostępny przede wszystkim w systemie Windows, Metal w OS X i iOS, a OpenGL jest obsługiwany w większości systemów, w tym OS X, iOS, Windows i Linux.

Karta graficzna prawdopodobnie nie ma żadnego wpływu na tę decyzję, ponieważ nie znam karty obsługującej tylko jedną lub dwie. Jeśli nie masz dedykowanej karty graficznej, renderowanie w czasie rzeczywistym wkrótce będzie stanowić problem. Chociaż grafika Intel HD i towarzysz AMD mogą już wiele zrobić.

Wybierz swoją platformę.


Uwaga: Na razie nie korzystałem ani z Direct3D, ani z Metalu.

Nero
źródło
2
> „Jeśli jesteś dobry w pisaniu programów np. W Javie, nie będziesz miał większych problemów z nauką C ++” - to nieprawda. Każdy będzie miał ogromne problemy z nauką i używaniem C ++. Porównanie go z Javą lub innym bezpiecznym językiem jest całkowicie nieodpowiednie. W przypadku innych wymienionych języków (Objective-C, Swift lub jakiś inny język obiektowy) to stwierdzenie jest jednak w większości prawdziwe.
Nazwa wyświetlana
9

Obecnie przechodzimy do zmiany paradygmatów API.

Oldschoolowa metoda wiązania buforów, mundurów, atrybutów, układu i programów jako (domyślnego) stanu globalnego i wysyłania losowań z tym stanem jest powszechna w D3D11 i OpenGL. Ma jednak duże koszty ogólne (podczas sprawdzania stanu i nie wiedząc, co program chce zrobić do ostatniej chwili). Nie są również bezpieczne dla wątków (w przeważającej części).

Właśnie dlatego pojawiły się nowe api (lub już wkrótce) D3D12, z których najbardziej popularnymi są Vulkan i Metal. Te interfejsy API dają większą kontrolę nad programem i pozwalają mu z góry zadeklarować, co chce zrobić za pomocą buforów poleceń. Pozwalają również zarządzać własnymi zasobami (dane wierzchołków, tekstury, ...) znacznie bardziej bezpośrednio. Używanie ich z wieloma jest znacznie prostsze.

Wybór między starym a nowym zależy od tego, jak dobrze możesz zarządzać przydzieloną pamięcią wideo i zbudować bufor poleceń.

  • Jeśli chcesz czegoś, co „po prostu działa” nawet na starszym sprzęcie, interfejsy API starej szkoły są lepsze; są one również lepiej znane, a otrzymasz więcej pomocy online.

  • Z drugiej strony, jeśli potrafisz poradzić sobie z asynchroniczną naturą komend wywołujących i nie masz nic przeciwko śledzeniu wszystkich przydzielonych buforów. W takim razie nowe interfejsy API mogą być dla Ciebie.

maniak zapadkowy
źródło
6
Nowe jawne interfejsy API grafiki nie są tak naprawdę zaprojektowane do użytku przez przeciętnego programistę grafiki, są raczej przeznaczone dla osób wykonujących prace infrastrukturalne w silnikach lub dla tych, którzy naprawdę potrzebują wydajności. Dają ci znacznie większą broń i celują w twoją stopę.
porglezomp
3

Nie sądzę, żeby to miało duże znaczenie. Po prostu wybierz ten, który pasuje do twojego projektu. W przeszłości korzystałem zarówno z D3D, jak i OpenGL. Ważne są pojęcia. Cokolwiek wybierzesz, musisz zrozumieć (na przykład):

  • Jakie są tekstury i jak są używane przez GPU.
  • Podstawowe pojęcia dotyczące rozwoju grafiki (wierzchołki, prymitywy, fragmenty itp.)
  • Jak działa system kamer (na przykład macierze MVP w OpenGL).
  • Czym są shadery i jak z nich właściwie korzystać.
  • Jak różni się procesor graficzny od procesora na komputerze.
  • Jakie są różnice między modelem pamięci GPU a modelem pamięci procesora.
  • Co należy zrobić na CPU i co powinno zostać odciążone na GPU w celu przetworzenia.

Jak wspomniano tutaj inni, jesteśmy w trakcie przejścia na nowy zestaw interfejsów API (Vulkan, Metal itp.), Więc w tym momencie, jeśli jesteś zupełnie nowy w tworzeniu grafiki, prawdopodobnie skupienie się na GLSL jest dobrym pomysłem, ponieważ Vulkan również z tego skorzysta.

Jeśli chodzi o przenośność, D3D jest tylko dla systemu Windows (krążą pogłoski, że projekt Wine próbuje uruchomić D3D pod Linuksem, ale jak dotąd nie jest to możliwe). OpenGL jest wieloplatformowy. Jeśli chcesz korzystać z urządzeń przenośnych, dostępna jest opcja OpenGL ES. Oczywiście zarówno OpenGL, jak i OpenGL ES mają różne wersje, które nie są obsługiwane przez wszystkie platformy.

Na koniec wszystkie interfejsy API uzyskują dostęp do tego samego sprzętu na komputerze, to tylko kwestia „sposobu” dostępu do niego.

Sepehr
źródło
Direct3D jest także tym, czego byś użył, jeśli programujesz dla dowolnej konsoli Xbox.
zalegalizować
Co rozumiesz przez „nic wykonalnego”? Wine uruchamia setki programów opartych na D3D bez problemów i robi to od lat. Oczywiście są błędy i niezaimplementowane części, ale to nie czyni całego API bezużytecznym.
Ruslan
0

Powiem kilka słów o renderowaniu bez kart graficznych.

Niether OpenGL ani DirectX naprawdę nie potrzebują karty graficznej. Implementacja może być w pełni przyspieszona programowo.

Dla OpenGL w systemie Linux dostępny jest rasterizer oprogramowania Mesa. Z mojego doświadczenia wynika, że ​​działa dobrze, o ile nie naciskasz zbyt mocno, łącząc dziwne funkcje (lista wyświetlania + indeksowane tablice wierzchołków). Wyobrażam sobie, że ich lista faktycznych błędów jest wysoka na milę. Pamiętaj o ciągłym testowaniu!

Mam mniejsze doświadczenie w korzystaniu z OpenGL w systemie Windows. Edytuj odpowiedź, jeśli coś wiesz!

Pakiet DirectX SDK jest dostarczany z programowym rasteryzatorem o nazwie „rasterizer referencyjny”. Moim zdaniem służy głównie do debugowania, ale znam przynajmniej jednego znajomego używającego referencyjnego rasterizera podczas opracowywania DX11 na laptopie obsługującym tylko DX10. Jak wspomniano w innych odpowiedziach, DirectX jest tylko Microsoft.

Andreas
źródło
Z mojego doświadczenia wynika, że ​​używanie zintegrowanej karty graficznej powinno wystarczyć do większości prac nad OpenGL w systemie Windows, ale upewnij się, że obsługuje najnowszą wersję OpenGL.
akaltar