Apakah penting apakah saya mempelajari OpenGL atau Direct3D?

11

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.

trichoplax
sumber
2
Jawaban ratchet freak adalah jawaban yang bagus. Jika Anda ingin mempelajari Direct3D, Anda dapat membaca buku gratis saya "The Direct3D Graphics Pipeline" . Detail API sebagian besar adalah Direct3D9, tetapi konsepnya sama. Masalahnya, konsep pemrograman grafik 3D belum benar-benar berubah sama sekali sejak akhir 1960-an. API untuk mengekspresikan konsep-konsep itu menjadi jauh lebih pintar.
mengesahkan

Jawaban:

9

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.

Nero
sumber
2
> "Jika Anda cukup pandai menulis program di misal Java, Anda tidak akan kesulitan untuk mempelajari C ++" - ini tidak benar. Setiap orang akan mengalami kesulitan belajar dan menggunakan C ++ dalam jumlah yang sangat besar. Membandingkannya dengan Java atau bahasa aman lainnya sama sekali tidak pantas. Untuk bahasa lain yang Anda daftarkan (Objective-C, Swift, atau bahasa berorientasi objek lainnya) pernyataan itu sebagian besar benar.
Nama Tampilan
9

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.

aneh ratchet
sumber
6
API grafik eksplisit baru tidak benar-benar dirancang untuk konsumsi oleh programmer grafis rata-rata, mereka lebih untuk orang-orang yang melakukan pekerjaan infrastruktur di mesin, atau bagi mereka yang benar - benar membutuhkan kinerja. Mereka memberi Anda senjata yang jauh lebih besar dan mengarahkannya tepat ke kaki Anda.
porglezomp
3

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):

  • Apa itu tekstur dan bagaimana mereka digunakan oleh GPU.
  • Konsep dasar Pengembangan Grafis (Vertikal, Primitif, Fragmen, dll.)
  • Bagaimana cara kerja sistem kamera (matriks MVP di OpenGL misalnya).
  • Apa itu shader dan bagaimana menggunakannya dengan benar.
  • Betapa berbedanya GPU bekerja versus CPU pada mesin Anda.
  • Apa perbedaan antara model memori GPU dan model memori CPU.
  • Apa yang harus dilakukan pada CPU dan apa yang harus diturunkan ke GPU untuk diproses.

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.

Sepehr
sumber
Direct3D juga apa yang akan Anda gunakan jika Anda pemrograman untuk salah satu konsol Xbox.
mengesahkan
Apa yang Anda maksud dengan "tidak ada yang layak"? Wine menjalankan ratusan program berbasis D3D tanpa masalah, dan telah melakukannya selama bertahun-tahun. Tentu saja ada bug dan bagian yang tidak diimplementasikan, tetapi itu tidak membuat keseluruhan API tidak dapat digunakan.
Ruslan
0

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.

Andreas
sumber
Dalam pengalaman saya menggunakan kartu grafis terintegrasi harus cukup baik untuk sebagian besar pengembangan OpenGL pada Windows, pastikan itu mendukung versi OpenGL terbaru.
akaltar