Üçlünün artıları / eksileri nelerdir?
Üçlünün artıları / eksileri nelerdir?
Yanıtlar:
kodlayıcı, DirectX'i hedefleyen HLSL, OpenGL'yi hedefleyen GLSL ve CG'nin her iki arayüzde de mevcut olması konusunda haklıdır.
Ancak, dikkate alınması gereken başka şeyler var (OGRE forumunda öğrenildi):
Yani, en son gölgelendirici özelliklerini kullanmıyorsanız, CG iyi bir seçim gibi görünmektedir. Eğer OpenGL'e gidecekseniz, GLSL daha iyi görünüyor. HLSL, yalnızca Microsoft platformlarına gidiyorsanız.
Şimdi ilk olarak HLSL'de Windows için DirectX kullanmak ve ardından Linux ve Mac için GLSL'ye dönüştürmek için geliştirme yapmak performanstan emin olmak ve daha büyük gölgelendirici özelliklerine sahip olmak için daha iyi bir çözüm olabilir. Ancak çok fazla iş olabilir (kendim yapamadım, söyleyemem). OGRE grafik motoru (ve diğer motorlar) herhangi bir API'yi (DirectX veya OpenGL veya diğerleri) kullanmanıza izin verir, bu yüzden yardımcı olur, ancak bu şekilde giderseniz dönüştürmek için hala gölgelendirici kodu vardır.
Gölgelendirici dilimi seçerken topladığım tüm bilgiler (Kararımı henüz vermedim).
Güncelleme: Valve oyunlarından birini OpenGL'ye çevirdi ve DirectX sürümünü OGL'den daha hızlı hale getirmenin bir yolunu bulamadı . Bu nedenle, sürücü uygulaması durumunun, API kalitesinin, vb. Sizin her birini çok fazla değiştirdiğini, birini veya diğerini seçmek için bir argüman olarak ham performansa tamamen güvenmeniz gerektiğini unutmayın. Bunu akılda tutarak, Windows dışındaki diğer platformlarla çalışırken (veya çalışmayı planladığını veya umduğunu) hayatınızı kolaylaştırmak için OpenGL / GLSL'i seçin, gerçekten Microsoft platformlarını kullanmak ve odaklanmak istiyorsanız ve belki biraz iyi olmak istiyorsanız DirectX / HLSL kullanın. API, OpenGL'den daha hızlı (bu şimdi tersine dönüyor, bu yüzden buna güvenmeyin); Kullanıcıya her iki olasılık sağlamak istiyorsanız CG kullanın, ancak bunu yapacak iş gücünüz (ve araçlarınız) varsa, hem GLSL hem de HLSL kullanmak uygun bir çözüm olabilir.
Güncelleme (2012): CG'nin durdurulduğunu ve artık Nvidia tarafından desteklenmediğini veya aktif olarak çalışılmadığını not etmek önemlidir. Nvidia, tüm kullanıcıların GLSL ve HLSL kombinasyonuna veya nvFX (github'da) gibi daha yeni bir kütüphaneye geçmelerini önerir. Bunun nedeni, GLSL ve HLSL arasında özellik uyumluluğunu sürdürmenin çok zor olmasıdır.
CG ve HLSL hakkında konuşabiliyorum, çünkü şu ana kadar kullandıklarım 2.
Cg, HLSL ile aynı değildir .
Cg'de NVIDIA, çok temiz bir gölgelendirici sözdizimi oluşturmakta mükemmel bir iş çıkardı. HLSL'ye çok benzer.
Ancak , D3D9 / D3D11 (init kodu, gölgelendirici derleme kodu) ile birlikte kullanılması HLSL'de Cg'den çok daha temizdir . -1 Cg. Cg, D3D üzerinden HLSL için bile gerekmeyen çok kötü bir başlangıç koduna sahiptir.
Cg'de , ayarlamak / değiştirmek istediğiniz her uniform
gölgelendirici değişkeni için "cgGetNamedParameter" yapmanız gerekir . Ve CGparameter
bu değişken için kodunuzda bir referans tutmak zorundasınız.
// C++ code to interact with Cg shader variable (shader language independent)
CGparameter mvp = cgGetNamedParameter( vs, "modelViewProj" );
CG::getLastError("Getting modelViewProj parameter"); // check for errors
cgSetMatrixParameterdr( mvp, &modelViewProj._11 ) ; // setting the matrix values
HLSL'de bu, çok daha temiz bir hale gelir - sadece bir satır ve bu CGparameter
değişkeni korumanız gerekmez .
// D3D9 C++ code to interact with HLSL shader variable
DX_CHECK( id3dxEffect->SetMatrix("modelViewProj", &mvp._11 ), "Set matrix" ) ;
Yukarıda, çağrıdan DX_CHECK
geri gönderilen HRESULT'u kontrol eden basit bir işlevdir SetMatrix
. Yukarıdaki kod d3d9'dur . D3D10 ve 11, elbette, çok daha acı vericidir (bir ID3DX11Effect nesnesi olmadığı için).
HLSL kullanmaya başlamadan önce bu koda bakardım ve kıskanırdım .
NVIDIA pratikte onun konuşma, OpenGL arasında Cg / D3D için ortak bir arayüz yapmak için ellerinden geleni yapmış olsak değil bu şekilde ve sahip cgGL*
, cgD3D9
, cgD3D10
,cgD3D11
fonksiyon grupları ile uğraşmak. Böylece tüm OpenGL ve D3D için çalışıyor ! iddia sadece çok ileri gidiyor. #ifdef
Farklı platformlarda çalışabilmesi için her şeyi OpenGL / D3D tipi gruplarına sarmanız gerekir . -2 Cg.
Ayrıca Geçenlerde bir oldu kötü bir deneyim Ben Cs / ATI kartları ile oldukça emin benim kötü değildir. (Başka biri deneyecek mi?). Klaim'in iddia ettiği gibi, NVIDIA'nın ATI kartlarını tamamen test etmediği doğru olabilir. Veya bu ATI Cg üzerinde test yapmaz. Öyle ya da böyle, orada bir uyuşmazlık var ve bir tür çıkar çatışması var. -3 Cg.
Sonuçta Cg. Onun gölgelendirici kod sözdizimi ve adlandırma, temiz tatlı ve düzenli. Çok kötü, bu diğer sorunları var.
Benim çok temel anlayışıma göre HLSL sadece DirectX ve GLSL sadece OpenGL içindir. Cg temelde HLSL ile aynı dildir, ancak DirectX veya OpenGL ile kullanılabilir (farklı çalışma zamanı kodlarıyla da).
HLSL ve GLSL arasındaki bir diğer önemli fark (CG'yi bilmiyorum bu yüzden konuşamıyorum), HLSL ile Microsoft, D3D çalışma zamanının bir parçası olarak gölgelendirici derleyicisini sağlarken, GLSL ile donanım satıcınız bunların bir parçası olarak sağlar. sürücüsü.
Bunun her iki tarafta da avantaj ve dezavantajları vardır.
GLSL yöntemiyle satıcı, derleyiciyi donanımlarının yeteneklerine göre ayarlayabilir. Kendi donanımlarını en iyi bilirler, ne yapacaklarını ve ne yapmayacaklarını bilirler. Öte yandan, dezavantaj, - birden fazla donanım satıcısının bulunduğu bir dünyada - gölgelendirici derleyicileri arasında tutarsızlıkların olabileceği bir durumun olduğu ve satıcının da batırmak için tamamen serbest hüküm sürmesidir.
HLSL yöntemi ile Microsoft derleyiciyi kontrol eder. Herkes tutarlı bir teknoloji üssünde ve bir gölgelendirici bir yerde başarılı bir şekilde derlenirse, o zaman her yerde derlenmesi mantıklı olabilir. Aynı gölgelendirici, satıcıdan bağımsız olarak aynı derlenmiş çıktıyı üretecektir (diğer her şey elbette eşittir). Öte yandan, HLSL derleyicisi "her şeyde tutarlı bir şekilde çalışır" olayı olmak zorundadır, bu nedenle depodan son birkaç damla meyve suyu almak için üreticiye özel herhangi bir püf noktası çekemez.
Bu, eğer HLSL dünya görüşünü tercih edersem, karşımıza çıkıyor. Farklı platformlarda çılgınca tutarsız davranışlarla daha önce kötü bir şekilde ısırıldım ve bir durumda bile sadece işe yarayan bir temel almak için bir sürü GLSL ARB ASM'ye döndürmek zorunda kaldım. NVIDIA’nın GLSL derleyicisi burada özellikle ünlü olarak görülebilir - HLSL sözdizimini ve anahtar kelimelerini bile kabul eder, yani eğer dikkatli olmazsanız yalnızca NVIDIA’da çalışacak gölgelendiriciler üretebilirsiniz, başka bir şey yapmazsınız. Orası bir orman.
Ogre ile birlikte gelen RTSS'ye (Çalışma Süresi Gölgelendirici Sistemi) de bakmak isteyebilirsiniz. Oldukça yeni, ancak temelde gölgelendiricileri harici dosyalar yerine kodda yazıyorsunuz. Henüz uygulamadım, fakat zamanı geldiğinde kesinlikle kullanmayı planlıyorum.
İşte Ogre wiki'sinde ve gölgelendiricilerin yazılmasında kullanılan çok çeşitli dersler. http://www.ogre3d.org/tikiwiki/JaJDoo+Shader+Guide
Asıl sorunuza gelince, Praetor'un dediği gibi, bu gerçekten de artılar / eksiler meselesi değil, istediğiniz işleme sistemini kullanmak isteyeceğiniz bir konudur. DX / OpenGL'yi Ogre ile kullanmak eklentiyi yüklemekle ilgili olduğundan, büyük olasılıkla .cg biçimini kullanmak isteyeceksiniz.