Apakah perbedaan antara kedua API ini detail implementasi minor yang berarti begitu saya telah mempelajarinya, saya dapat menggunakannya untuk semuanya? Atau adakah alasan untuk mempelajari satu daripada yang lain jika saya ingin dapat menggunakannya secara umum tanpa harus mempelajari kembali API lain di masa mendatang? Apakah satu atau lebih umum?
Khususnya saya ingin dapat menulis untuk kartu grafis apa pun, sehingga kode tidak terbatas hanya berjalan pada kartu produsen tertentu atau model tertentu. Saya juga ingin dapat menulis kode yang masih berfungsi dengan tidak adanya kartu grafis (walaupun lebih lambat).
Apakah ada perbedaan dalam bagaimana kode portabel akan melintasi berbagai platform (sistem operasi / arsitektur)? Saya tertarik dengan ketersediaan perpustakaan lain yang bekerja dengan ini, dan apakah satu atau yang lain menyebabkan pembatasan lisensi lebih sedikit di lingkungan yang lebih luas. Apa pun yang terukur yang akan membuat perbedaan apakah salah satu dari ini bisa menjadi satu-satunya yang saya pelajari tanpa membatasi saya.
Jawaban:
Saya tidak berpikir itu penting, API mana yang ingin Anda gunakan ketika condong ke "program graphics". Hal yang lebih penting untuk dipelajari adalah konsep khas yang Anda gunakan saat bekerja dengan adegan 3D. Misalnya Anda ingin belajar cara menulis Grafik Adegan sederhana (dan kemudian lebih canggih). Konsep-konsep ini jauh lebih penting daripada nama metode API spesifik yang harus Anda panggil.
Bandingkan ketika belajar bagaimana menulis program. Jika Anda cukup pandai menulis program di Java misalnya, Anda tidak akan mengalami banyak kesulitan belajar C ++, Objective-C, Swift, atau bahasa berorientasi objek lainnya. Karena konsep dan pemikiran itulah yang Anda pelajari.
Pilihan antara OpenGL, Direct3D dan Logam terutama adalah pilihan, sistem operasi mana yang Anda targetkan. Direct3D terutama tersedia di Windows, Metal on OS X dan iOS, dan OpenGL didukung pada sebagian besar sistem termasuk OS X, iOS, Windows dan Linux.
Kartu grafis mungkin memiliki sedikit pengaruh pada keputusan ini karena saya tidak tahu kartu yang hanya mendukung satu atau dua. Jika Anda tidak memiliki kartu grafis khusus, maka perenderan secara langsung akan menjadi masalah segera. Meskipun Intel HD Graphics dan pendamping AMD sudah bisa melakukan cukup banyak.
Jadi, pilih platform Anda.
Penafian: Sampai sekarang, saya tidak menggunakan Direct3D atau Metal.
sumber
Kami saat ini dalam transisi paradigma API.
Metode sekolah lama yang mengikat buffer, seragam, atribut, tata letak, dan program sebagai (implisit) keadaan global dan pengiriman menarik dengan keadaan itu adalah umum di D3D11 dan OpenGL. Namun ia memiliki sejumlah besar overhead (dalam keadaan verifikasi dan tidak tahu apa yang ingin dilakukan program sampai menit terakhir). Mereka juga tidak aman utas (sebagian besar).
Inilah sebabnya apis baru muncul (atau akan segera hadir) D3D12, vulkan dan Metal menjadi yang paling menonjol. API ini memberikan lebih banyak kontrol ke program dan memungkinkannya menyatakan terlebih dahulu apa yang ingin dilakukan dengan menggunakan perintah buffer. Mereka juga memungkinkan Anda mengelola sumber daya Anda sendiri (data titik, tekstur, ...) lebih langsung. Menggunakannya dengan multipel jauh lebih mudah.
Pilihan antara lama dan baru didasarkan pada seberapa baik Anda dapat mengelola memori video yang Anda alokasikan dan membangun buffer perintah.
Jika Anda menginginkan sesuatu yang "hanya berfungsi" bahkan pada perangkat keras yang lebih lama maka API sekolah lama lebih baik; mereka juga lebih dikenal dan Anda akan mendapatkan lebih banyak bantuan secara online.
Di sisi lain, jika Anda dapat menangani sifat asinkron perintah pengiriman dan tidak keberatan harus melacak semua buffer yang Anda alokasikan. Maka API baru mungkin cocok untuk Anda.
sumber
Saya pribadi tidak menganggapnya penting. Pilih saja yang sesuai dengan proyek Anda. Saya telah menggunakan D3D dan OpenGL di masa lalu. Konsep itulah yang penting. Apa pun yang Anda ambil, Anda perlu memahami (misalnya):
Seperti yang disebutkan di sini, kami berada di tengah transisi ke set API baru (Vulkan, Metal, dll.) Sehingga pada titik ini jika Anda benar-benar baru dalam Pengembangan Grafik, mungkin berfokus pada GLSL adalah ide yang baik karena Vulkan akan memanfaatkannya juga.
Mengenai portabilitas, D3D adalah Windows saja (Ada desas-desus bahwa proyek Wine mencoba untuk membuat D3D bekerja di Linux tetapi sejauh ini tidak ada yang layak). OpenGL adalah lintas platform. Jika Anda ingin menggunakan ponsel, maka OpenGL ES adalah opsi yang tersedia. Tentu saja OpenGL dan OpenGL ES memiliki versi yang berbeda yang tidak didukung oleh semua platform.
Pada akhirnya, semua API mengakses perangkat keras yang sama pada mesin Anda, itu hanya masalah "bagaimana" mereka mengaksesnya.
sumber
Saya akan mengatakan beberapa kata tentang rendering tanpa kartu grafis.
Niether OpenGL atau DirectX benar-benar membutuhkan kartu grafis. Suatu implementasi dapat sepenuhnya dipercepat perangkat lunak.
Untuk OpenGL di Linux ada rasterizer perangkat lunak Mesa. Dalam pengalaman saya itu berfungsi ok selama Anda tidak mendorongnya terlalu keras menggabungkan fitur aneh (daftar tampilan + array vertex yang diindeks). Saya membayangkan daftar bug aktual mereka adalah mil tinggi. Pastikan untuk melakukan pengujian berkelanjutan!
Saya kurang pengalaman menggunakan OpenGL di Windows. Edit jawaban jika Anda tahu sesuatu!
DirectX SDK dikirimkan dengan rasterizer perangkat lunak yang disebut "rasterizer referensi". Sebagian besar untuk debugging menurut pendapat saya, tetapi saya tahu setidaknya satu teman menggunakan rasterizer referensi ketika mengembangkan DX11 pada laptop hanya mampu DX10. Seperti disebutkan dalam jawaban lain, DirectX adalah Microsoft saja.
sumber