HLSL vs GLSL vs cg lehte ve aleyhte olanlar nelerdir? [kapalı]


61

Üçlünün artıları / eksileri nelerdir?


2
İlk önce hangi API'ye (OGL veya DX) gireceğinize ve hangi gölgelendirici diline karar vermeden önce hangi platformlara karar vermeniz gerektiğine benziyorsunuz.
Tetrad

1
Bence bu soru mükemmel. Bir topluluk wiki'sine ne dersin? Tüm bunlara yeniyim ve gölgelendiricilere olan farklılıkların sorusu tam olarak bilmem gereken şey.
Mladen Mihajlovic

3
Düzeltme: "yapıcı değil olarak kapat", "dimwit politikasını ihlal ettiği için kapat" demelidir, çünkü bu IS yapıcıdır.
Lennart Rolland

Yanıtlar:


42

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

  • CG, GLSL'nin en son özelliklerini kullanmanıza izin vermez (HLSL hakkında emin değilim). Bu bir orta yoldur, bu nedenle Shader Model 3.0'a (AFAI anlaşılıncaya kadar) yalnızca ortak olan GLSL özelliklerinden tam olarak yararlanamazsınız.
  • CG, kartı için optimize eden, ancak ATI kartları için çok fazla iş çıkarmamış gibi görünen NVidia tarafından yapılmıştır ... bazı insanlar, CG kullanarak ATI kartlarında sorun olabileceğini bildirmektedir.
  • OpenGL, Windows platformlarındaki DirectX'ten biraz daha yavaş görünüyor. Bu gerçekten ne yaptığınıza ve bunun sürücünün uygulamalarındaki kaynağını bulmasının sebebi ile ilgili, ancak API ve ilgili gölgelendirici dilini seçmeden önce bunu bilmek iyi. Ancak, OpenGL tüm (win / mac / unix / bazı konsollar) platformlarında kullanılabilen tek arayüzdür. Bu nedenle, yalnızca GLSL kullanmak, Microsft merkezli olmayan platformlar arası bir oyun için daha iyi bir seçim olabilir.
  • Linux'taki NVidia sürücüleri ATI sürücülerinden daha kararlı görünüyor, bu da Linux üzerinde iyi çalıştığından emin olmanız gerektiğinde CG'yi daha ilginç hale getiriyor (tüm bildirilen bilgiler, ayrıntılara bakmanız gerekecek)

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.


2
Evet . NVIDIA, ATI kartlarıyla ilgili sorunları umursamıyor.
bobobobo

4
"OpenGL, Windows platformlarındaki DirectX'ten biraz daha yavaş görünüyor." Çoğu durumda, genellikle OpenGL'li sürücüler için satıcı desteğinden kaynaklanıyor, Windows'ta DirectX'teki kadar iyi değil.
ChrisC

1
Not: Son gelişmelerden ve oyunumun bazı MS dışı tabletlerde çalıştığından emin olma gereği nedeniyle sonunda OpenGL / GLSL'i seçtim.
Klaim

2
@Topluluk: Cg desteğinin kesilmesi ile ilgili herhangi bir bağlantınız var mı?
Nicol Bolas


15

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 CGparameterbu 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 CGparameterdeğ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_CHECKgeri 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. #ifdefFarklı 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.


10

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


+1 Bu benim de anlayışım, şahsen ne zaman istersem cg kullanmaktan hoşlanırım, ancak render sisteminin kendisinin ötesine ekstra bir bağımlılık ekler; ve OpenGL, cg ve ATI sürücüleri ile ilgili daha karmaşık etkileri olan garip sorunlar yaşadığımı hatırlıyor gibiyim ...
Riley Adams

Ogre kullanıyorum ve bu yüzden her üçü de elimde mevcut, ancak hem DirectX hem de OpenGL'ye sahip olmak istersem, gölgelendiricileri hem HLSL'de hem de GLSL'de yazmak zorunda mıyım yoksa sadece cg mi? Bu doğru mu?
Z_guy

14
-1. Bu son derece ilkel bir cevaptır ve biri bu sitede daha kapsamlı bilgi bulmayı umar.
bobobobo

2
-1: Bobobobo ile aynı fikirdeyim.
Nicol Bolas

1
Maalesef, bobobobo ile aynı sebeplerden -1'e ihtiyacım var.
Jonathan Dickinson

8

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.


1
Adil olmak gerekirse, NVIDIA’nın GLSL derleyicisi o günlerden beri ne yaptığını ve kabul etmediğini daha da sertleştirdi. Ancak bugün bile, çalışması gerektiğini düşündüğünüz bir şeyi yapmayı kolaylaştıran, ancak asıl spesifikasyon ve AMD sürücülerine göre yapmayan "NVIDIA tuzakları" dediğim şey var.
Nicol Bolas

ATI / AMD'de ya da en azından ATI / AMD ile düzenli olarak kontrol etmenin sürekli bir zorunluluk olduğunu söyleyecek kadar ileri gitmiştim. OpenGL sürücülerinde de böcekler yakalayacağınız için bir fiyat karşılığında iki öldürme elde edersiniz.
Maximus Minimus

SPIR-V'yi destekleyen Vulkan veya OpenGL uygulamaları hedeflenirken, GLSL gölgelendiricileri SPIR-V'ye önceden derlenebilir.
Andrea

@Andrea - evet, doğru; Açıkçası ne Vulkan ne de SPIR-V, soru sorulduğu sırada (ve asnwer yazıldığında) mevcut değildi.
Maximus Minimus

1

Her ikisini de kullanıyorum, glsl ile başladım ve sadece proje talep ettiği için hlsl'ye taşındım. Seçim göz önüne alındığında, her şey yolunda gidiyor. Glsl çok kaygan hissediyor ve Hlsl bir mühendisin hobi tezgahından çıkmış gibi hissediyor.


1

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.

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.