OpenGL veya Direct3D öğrenmem önemli mi?


11

Bu iki API arasındaki farklar küçük uygulama ayrıntıları arasındaki farkı öğrendikten sonra her şey için kullanabileceğim anlamına mı geliyor? Ya da gelecekte başka bir API'yi yeniden öğrenmek zorunda kalmadan genel olarak kullanabilmek için diğerinden ziyade öğrenmenin nedenleri var mı? Biri ya da diğeri daha genel mi?

Özellikle herhangi bir grafik kartı için yazabilmek istiyorum, bu yüzden kod sadece belirli bir manuafacturer's kartları veya belirli bir model üzerinde çalışan ile sınırlı değildir. Ayrıca, bir grafik kartı (daha yavaş da olsa) yokken hala çalışan bir kod yazabilmek istiyorum.

Taşınabilir kodun farklı platformlarda (işletim sistemleri / mimariler) nasıl olacağı konusunda bir fark var mı? Bunlarla çalışan diğer kitaplıkların kullanılabilirliği ve birinin ya da diğerinin daha geniş bir ortamda daha az lisans kısıtlamasına yol açıp açmadığıyla ilgileniyorum. Bunlardan birinin beni kısıtlamadan öğrendiğim tek kişi olup olmadığı konusunda fark yaratacak herhangi bir şey.


2
mandal ucube cevabı iyi bir cevaptır. Direct3D öğrenmek istiyorsanız, "The Direct3D Graphics Pipeline" adlı ücretsiz kitabımı okuyabilirsiniz . API ayrıntıları çoğunlukla Direct3D9'dur, ancak kavramlar aynıdır. Mesele şu ki, 3D grafikleri programlamak için konseptler 1960'ların sonlarından bu yana hiç değişmedi. Bu kavramları ifade eden API'ler çok daha akıllı hale geldi.
yasallaştırmak

Yanıtlar:


9

Ben "program grafikleri" eğilerek kullanmak istediğiniz hangi API, çok önemli olduğunu sanmıyorum. Öğrenilmesi gereken daha önemli şeyler, 3D sahnelerle çalışırken kullandığınız tipik kavramlardır. Örneğin, basit (ve daha sonra daha sofistike) bir Sahne Grafiği yazmayı öğrenmek istersiniz. Bu kavramlar, çağırmanız gereken belirli API yöntemi adlarından çok daha önemlidir.

Program yazmayı öğrenirken karşılaştırın. Örneğin Java'da program yazma konusunda oldukça iyiyseniz, C ++, Objective-C, Swift veya başka bir nesne yönelimli dili öğrenmekte o kadar sorun yaşamayacaksınız. Çünkü öğrendiğiniz kavramlar ve düşünce .

OpenGL, Direct3D ve Metal arasındaki seçim öncelikle hangi işletim sistemini hedeflediğinizdir. Direct3D öncelikle Windows, OS X ve iOS'ta Metal'de bulunur ve OpenGL, OS X, iOS, Windows ve Linux dahil çoğu sistemde desteklenir.

Grafik kartının muhtemelen bir veya ikisini destekleyen bir kart bilmediğim için bu karar üzerinde çok az etkisi vardır veya hiç etkisi yoktur. Özel bir grafik kartınız yoksa, gerçek zamanlı renderleme yakında bir sorun olacaktır. Intel HD Grafik Kartı ve AMD arkadaşı zaten çok şey yapabilir.

Yani, platformunuzu seçin.


Yasal Uyarı: Şu an için ne Direct3D ne de Metal kullanmadım.


2
> "Örneğin Java ile program yazma konusunda oldukça iyiyseniz, C ++ öğrenmekte o kadar fazla sorun yaşamayacaksınız" - bu doğru değil. Herkes büyük miktarda C ++ öğrenme ve kullanmada zorluk yaşayacaktır . Java veya başka bir güvenli dil ile karşılaştırmak tamamen uygun değildir. Listelediğiniz diğer diller için (Objective-C, Swift veya başka bir nesne yönelimli dil) bu ifade çoğunlukla doğrudur.
Görünen Ad

9

Şu anda API paradigmalarının bir geçiş sürecindeyiz.

Tamponları, üniformaları, özniteliği, düzeni ve programları (örtük) küresel durum olarak bağlama ve bu durumla çizim gönderme gibi eski okul yöntemi D3D11 ve OpenGL'de yaygındır. Ancak büyük bir yükü vardır (durumu doğrulamak ve programın son dakikaya kadar ne yapmak istediğini bilmemek). Ayrıca diş güvenli değildir (çoğunlukla).

Bu yüzden yeni apiler ortaya çıktı (veya yakında geliyor) D3D12, vulkan ve Metal en önde gelenler. Bu API'ler program üzerinde daha fazla kontrol sağlar ve komut arabelleklerini kullanarak ne yapmak istediğini önceden bildirmesine izin verir. Ayrıca kendi kaynaklarınızı (tepe noktası verileri, dokular, ...) çok daha doğrudan yönetmenize izin verir. Bunları çoklu ile kullanmak çok daha basittir.

Eski ve yeni arasındaki seçim, ayırdığınız video belleğini ne kadar iyi yönetebileceğinize ve komut arabelleğini oluşturmanıza bağlıdır.

  • Eski donanımlarda bile "sadece çalışan" bir şey istiyorsanız, eski okul API'leri daha iyidir; onlar da daha iyi bilinir ve çevrimiçi olarak daha fazla yardım alacaksınız.

  • Öte yandan, gönderme komutlarının eşzamansız yapısını işleyebilir ve ayırdığınız tüm arabellekleri izlemek zorunda kalmazsanız. O zaman yeni API'ler sizin için bir şey olabilir.


6
Yeni açık grafik API'leri ortalama grafik programcısı tarafından tüketim için tasarlanmamıştır, daha çok motorlarda altyapı çalışması yapan kişiler veya performansa gerçekten ihtiyaç duyanlar içindir . Size çok daha büyük bir silah veriyorlar ve hemen ayağınıza doğrultuyorlar.
porglezomp

3

Şahsen bunun çok önemli olduğunu düşünmüyorum. Sadece projenize uygun olanı seçin. Geçmişte hem D3D hem de OpenGL kullandım. Önemli olan kavramlar. Hangisini alırsanız anlayın (örneğin):

  • Dokular nelerdir ve GPU tarafından nasıl kullanılırlar.
  • Grafik Geliştirmenin Temel Kavramları (Vertices, Primitives, Fragment, etc.)
  • Kamera sistemi nasıl çalışır (örneğin OpenGL'deki MVP matrisleri).
  • Gölgelendiriciler nedir ve nasıl düzgün bir şekilde kullanılır.
  • GPU'nun makinenizdeki CPU'ya göre ne kadar farklı çalıştığı.
  • GPU'nun bellek modeli ile CPU'nun bellek modeli arasındaki farklar nelerdir.
  • CPU'da ne yapılmalı ve işlem için GPU'ya neyin boşaltılması gerekir.

Burada belirtildiği gibi, yeni bir API setine (Vulkan, Metal vb.) Geçişin ortasındayız, bu nedenle Grafik Geliştirme'de tamamen yeniyseniz, muhtemelen GLSL'ye odaklanmak Vulkan'dan beri iyi bir fikirdir. bundan da faydalanacak.

Taşınabilirlik ile ilgili olarak, D3D sadece Windows'dur ( Wine projesinin D3D'nin Linux altında çalışmasına çalıştığı yönünde söylentiler var, ancak şu ana kadar hiçbir şey mümkün değil). OpenGL çapraz platformdur. Mobil ortama geçmek istiyorsanız OpenGL ES kullanılabilir bir seçenektir. Elbette hem OpenGL hem de OpenGL ES'nin tüm platformlar tarafından desteklenmeyen farklı sürümleri vardır.

Günün sonunda, tüm API'ler makinenizde aynı donanıma erişir, bu sadece ona nasıl "eriştikleri" meselesidir.


Direct3D, Xbox konsollarından herhangi biri için programlama yapıyorsanız kullanacağınız şeydir.
yasallaştırmak

"Mümkün olan hiçbir şey" ile ne demek istiyorsun? Wine, yüzlerce D3D tabanlı programı sorunsuz olarak çalıştırıyor ve bunu yıllardır yapıyor. Elbette hatalar ve uygulanmayan parçalar var, ancak bu tüm API'yi kullanılamaz hale getirmiyor.
Ruslan

0

Grafik kartı olmadan render hakkında birkaç kelime söyleyeceğim.

Niether OpenGL veya DirectX gerçekten bir grafik kartına ihtiyaç duymaz. Bir uygulama tamamen yazılım hızlandırmalı olabilir.

Linux'ta OpenGL için Mesa yazılım rasterleştirici var. Deneyimlerime göre, garip özellikleri birleştirerek çok zorlamadığınız sürece tamam görünüyor (ekran listesi + dizinli tepe dizileri). Onların gerçek hata listesinin mil yüksek olduğunu hayal ediyorum. Sürekli test yaptığınızdan emin olun!

Windows'ta OpenGL kullanma konusunda daha az deneyimim var. Bir şey biliyorsanız cevabı düzenleyin!

DirectX SDK, "referans rasterleştirici" adı verilen bir yazılım rasterleştirici ile teslim edilir. Bence çoğunlukla hata ayıklamak için ama sadece DX10 yetenekli bir dizüstü bilgisayarda DX11 geliştirirken referans rasterizer kullanarak en az bir arkadaş biliyorum. Diğer yanıtlarda belirtildiği gibi DirectX yalnızca Microsoft'tur.


Deneyimime göre, Windows'taki çoğu OpenGL geliştirme için entegre bir grafik kartı kullanma yeterince iyi olmalı, sadece yeni bir OpenGL sürümünü desteklediğinden emin olun.
akaltar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.