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.
Odpowiedzi:
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.
źródło
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.
źródło
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):
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.
źródło
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.
źródło