Quali sono i pro / contro dei tre?
Quali sono i pro / contro dei tre?
Risposte:
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):
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.
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 CGparameter
riferimento 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 CGparameter
variabile.
// 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 SetMatrix
chiamata. 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 #ifdef
gruppi 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.
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).
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.
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.