Quali sono i pro e i contro di HLSL vs GLSL vs cg? [chiuso]


61

Quali sono i pro / contro dei tre?


2
Sembra che prima dovresti decidere su quale API stai cercando (OGL o DX) e quali piattaforme prima di decidere quale linguaggio shader.
Tetrad,

1
Penso che questa domanda sia geniale. Che ne dici di un wiki della comunità? Sono nuovo in tutto questo e una domanda sulle differenze con gli shader è esattamente ciò che devo sapere.
Mladen Mihajlovic il

3
Correzione: "chiuso come non costruttivo" dovrebbe dire "chiuso come violazione della politica dimwit", perché questo è costruttivo.
Lennart Rolland,

Risposte:


42

coderanger ha ragione sul fatto che HLSL abbia come target DirectX, GLSL e OpenGL e CG siano disponibili con entrambe le interfacce.

Tuttavia ci sono altre cose da considerare (apprese sul forum OGRE):

  • CG non ti consentirà di utilizzare le ultime funzionalità di GLSL (non sono sicuro di HLSL). È una via di mezzo, quindi non sarai in grado di sfruttare appieno le funzionalità GLSL, solo quella comune fino a Shader Model 3.0 (AFAI compreso).
  • CG è realizzato da NVidia che lo ottimizza per la sua scheda ma non sembra fare molto lavoro per le schede ATI ... alcune persone segnalano che potrebbero esserci problemi con le schede ATI che utilizzano CG.
  • OpenGL sembra essere un po 'più lento di DirectX su piattaforme Windows. Questo è davvero relativo a quello che stai facendo e il motivo di questo trova la sua origine nelle implementazioni dei driver, ma è bene sapere prima di scegliere l'API e il linguaggio shader associato. Tuttavia, OpenGL è l'unica interfaccia disponibile su tutte le piattaforme (win / mac / unix / alcune console). Quindi, sapendo che, l'utilizzo esclusivo di GLSL potrebbe essere la scelta migliore per un gioco multipiattaforma non centrato su Microsft.
  • I driver NVidia su Linux sembrano essere più stabili dei driver ATI, rendendo CG più interessante se devi essere sicuro che funzioni bene su Linux (sono tutte le informazioni riportate, dovrai controllare i dettagli)

Quindi, se non stai usando le ultime funzionalità di shader, CG sembra una buona scelta. GLSL sembra migliore se stai diventando OpenGL completo. HLSL se vai esclusivamente su piattaforme Microsoft.

Ora prima sviluppare in HLSL per Windows per utilizzare DirectX e poi convertirlo in GLSL per Linux e Mac potrebbe essere la soluzione migliore per essere sicuri delle prestazioni e avere a disposizione il set più ampio di funzionalità shader. Potrebbe comunque essere un sacco di lavoro (non l'ho fatto da solo, quindi non posso dirlo). Il motore grafico OGRE (e altri motori) consente di utilizzare qualsiasi API (DirectX o OpenGL o altri), quindi aiuta, ma c'è ancora codice shader da convertire se vai in questo modo.

Sono tutte le informazioni che ho raccolto scegliendo la mia lingua shader (non ho ancora preso la mia decisione).


Aggiornamento: Valve ha fatto una conversione di uno dei loro giochi in OpenGL e non ha trovato alcun modo per rendere la versione di DirectX più veloce di quella di OGL . Quindi tieni presente che lo stato dell'implementazione del driver, la qualità dell'API, ecc., Tutto ciò cambia di anno in anno per farti affidare totalmente alle prestazioni non elaborate come argomento per scegliere l'uno o l'altro. Con questo in mente, scegli OpenGL / GLSL per semplificarti la vita quando lavori (o hai piani o speranze di lavorare) con piattaforme diverse da Windows, usa DirectX / HLSL se vuoi davvero usare solo piattaforme Microsoft e concentrarti e magari avere un po 'di bene API più veloce di OpenGL (questo è invertendo ora, quindi non contare su di esso); usa CG se vuoi fornire entrambe le possibilità all'utente, ma se hai la forza lavoro (e gli strumenti) per farlo, usare sia GLSL che HLSL potrebbe essere una soluzione praticabile.


Aggiornamento (2012): è importante notare che CG è stato sospeso, e non è più supportato o lavorato attivamente da Nvidia. Nvidia raccomanda a tutti gli utenti di passare a una combinazione di GLSL e HLSL o a una libreria più recente come nvFX (su github). Questo perché era troppo difficile mantenere la compatibilità delle funzionalità tra GLSL e HLSL.


2
. NVIDIA non sembra preoccuparsi dei problemi con le schede ATI.
Bobobobo,

4
"OpenGL sembra essere un po 'più lento di DirectX su piattaforme Windows." Nella maggior parte dei casi è generalmente dovuto al supporto del fornitore per i driver con OpenGL non è buono su Windows come lo è con DirectX.
ChrisC,

1
Nota: alla fine ho scelto OpenGL / GLSL a causa dei recenti miglioramenti e della necessità di assicurarmi che il mio gioco funzioni su alcuni tablet non MS.
Klaim

2
@Comunità: hai collegamenti per l'interruzione del supporto per Cg?
Nicol Bolas,


15

Posso solo parlare di CG vs HLSL perché quelli sono i 2 che ho usato finora.

Cg non è lo stesso di HLSL.

In Cg, NVIDIA ha fatto un ottimo lavoro nel creare una sintassi dello shader molto pulita. È molto simile a HLSL.

Tuttavia , il collegamento con D3D9 / D3D11 (codice di inizializzazione, codice di compilazione dello shader) è molto più pulito su HLSL che su Cg. -1 Cg. Cg ha un brutto bit di codice di avvio che non è nemmeno necessario avere per HLSL su D3D.

In Cg, devi "cgGetNamedParameter" per ogni uniform variabile shader che desideri impostare / modificare. E devi mantenere un CGparameterriferimento nel tuo codice per quella variabile

// 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

In HLSL, questo finisce per essere molto più pulito - solo una riga e non devi mantenere quella CGparametervariabile.

// D3D9 C++ code to interact with HLSL shader variable
DX_CHECK( id3dxEffect->SetMatrix("modelViewProj", &mvp._11 ), "Set matrix" ) ;

In quanto sopra, DX_CHECKè solo una semplice funzione che controlla l'HRESULT che viene restituito dalla SetMatrixchiamata. Il codice sopra è d3d9 . D3D10 e 11, ovviamente, sono molto più dolorosi (poiché non esiste un oggetto ID3DX11Effect).

Prima di iniziare a usare HLSL, guardavo questo codice e in realtà diventavo geloso .

Sebbene NVIDIA hanno fatto del loro meglio per rendere un'interfaccia comune per Cg tra OpenGL / D3D, in pratica la sua non in quel modo, e si dispone cgGL*, cgD3D9, cgD3D10,cgD3D11 gruppi di funzioni con cui lottare. Quindi tutto funziona per OpenGL e D3D !! l'affermazione va solo così lontano. Devi ancora avvolgere tutto in #ifdefgruppi di tipi OpenGL / D3D per farlo funzionare su piattaforme diverse. -2 Cg.

Inoltre, recentemente ho avuto una brutta esperienza con le schede Cg / ATI, che sono abbastanza sicuro che non sia la mia cattiva. (Qualcun altro lo prova?). Penso che sia vero che NVIDIA non collauda completamente le schede ATI, come afferma Klaim. O che ATI non test su Cg. In un modo o nell'altro, c'è una discrepanza lì e una sorta di conflitto di interessi. -3 Cg.

Tutto sommato ho preferito Cg. La sintassi e la denominazione del codice shader sono pulite, dolci e ordinate. È un peccato che abbia questi altri problemi.


10

La mia comprensione di base è che HLSL è solo per DirectX e GLSL è solo per OpenGL. Cg è fondamentalmente la stessa lingua di HLSL, ma può essere utilizzato con DirectX o OpenGL (anche se tramite codice di runtime diverso).


+1 Anche questa è la mia comprensione, personalmente mi piace usare cg ogni volta che posso, ma aggiunge una dipendenza extra oltre al sistema di rendering stesso; e mi sembra di ricordare alcuni strani problemi con i driver OpenGL, cg e ATI con alcuni effetti più complessi ...
Riley Adams,

Sto usando Ogre e quindi ho tutti e tre disponibili per me, ma se voglio avere sia DirectX che OpenGL devo scrivere gli shader sia in HLSL che in GLSL o semplicemente cg? È giusto?
Z_guy,

14
-1. Questa è una risposta estremamente rudimentale e si spera di trovare informazioni più ampie su questo sito.
Bobobobo,

2
-1: sono d'accordo con bobobobo.
Nicol Bolas,

1
Sfortunatamente devo -1 per gli stessi motivi di bobobobo.
Jonathan Dickinson,

8

Un'altra differenza cruciale tra HLSL e GLSL (non conosco CG quindi non posso parlarne) è che con HLSL Microsoft fornisce il compilatore shader come parte del runtime D3D mentre con GLSL il tuo fornitore di hardware lo fornisce come parte del loro conducente.

Ciò presenta vantaggi e svantaggi su entrambi i lati.

Con il metodo GLSL il fornitore può mettere a punto il compilatore in base alle capacità del proprio hardware. Conoscono meglio il proprio hardware, sanno cosa fare e cosa non fare. D'altra parte lo svantaggio è che - in un mondo in cui ci sono più fornitori di hardware - si ha una situazione in cui ci possono essere incoerenze tra i compilatori di shader e il venditore ha anche un regno libero completo da rovinare.

Con il metodo HLSL Microsoft controlla il compilatore. Ognuno è su una base tecnologica coerente e se uno shader si compila correttamente in un posto, si può ragionevolmente supporre che si compili ovunque. Lo stesso shader produrrà lo stesso output compilato indipendentemente dal fornitore (ovviamente tutte le altre cose sono uguali). D'altra parte, il compilatore HLSL deve essere una cosa "funziona costantemente su tutto", quindi non è in grado di tirare trucchi speciali specifici del fornitore per ottenere le ultime gocce di succo dal serbatoio.

Se questo si presenta come se avessi una preferenza per la visione HLSL del mondo, è perché lo faccio. Sono stato morso molto prima da comportamenti selvaggi incoerenti su piattaforme diverse, e in un caso ho persino dovuto riportare un carico di GLSL su ARB ASM solo per ottenere una linea di base che funzionasse. Il compilatore GLSL di NVIDIA può essere visto come particolarmente noto qui - accetterà persino la sintassi HLSL e le parole chiave, il che significa che se non stai attento puoi finire per produrre shader che funzioneranno solo su NVIDIA e nient'altro. È una giungla là fuori.


1
Ad essere onesti, il compilatore GLSL di NVIDIA è diventato piuttosto più severo su ciò che fa e non accetta da quei giorni. Ma anche oggi, ci sono quelle che chiamo "trappole NVIDIA" che rendono facile fare qualcosa che pensi dovrebbe funzionare, ma non secondo le specifiche effettive e i driver AMD.
Nicol Bolas,

Andrei persino al punto di dire che lo sviluppo su ATI / AMD, o almeno il controllo incrociato con ATI / AMD su base regolare, è ancora un must assoluto. Ottieni due uccisioni per il prezzo di uno lì, dato che troverai anche dei bug nel loro driver OpenGL.
Maximus Minimus,

Quando si prendono di mira le implementazioni di Vulkan o OpenGL che supportano SPIR-V, gli shader GLSL possono essere precompilati su SPIR-V.
Andrea,

@Andrea - sì, è corretto; ovviamente né Vulkan né SPIR-V esistevano al momento della domanda (e fu scritta la risposta).
Maximus Minimus

1

Ho usato entrambi, ho iniziato con glsl e sono passato a hlsl solo perché il progetto lo richiede. Data la scelta, è glsl fino in fondo. glsl sembra molto lucido e hlsl sembra uscito da una panca per hobby di un ingegnere.


1

Potresti voler esaminare anche RTSS (Run Time Shader System) fornito con Ogre. È abbastanza nuovo, ma fondamentalmente scrivi shader nel codice piuttosto che in file esterni. Non l'ho ancora implementato, ma sicuramente pianifico di usarlo quando sarà il momento.

Ecco un'enorme serie di tutorial sulla wiki di Ogre e per scrivere shader. http://www.ogre3d.org/tikiwiki/JaJDoo+Shader+Guide

Per quanto riguarda la tua domanda originale, come ha detto Praetor, non è davvero una questione di pro / contro, è una questione di quale sistema di rendering vuoi utilizzare. Poiché l'utilizzo di DX / OpenGL con Ogre è solo una questione di caricamento del plugin, molto probabilmente vorrai utilizzare il formato .cg.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.