Was sind die Vor- / Nachteile der drei?
Was sind die Vor- / Nachteile der drei?
Antworten:
coderanger hat Recht, dass HLSL-Targeting DirectX, GLSL-Targeting OpenGL und CG mit beiden Schnittstellen verfügbar sind.
Es gibt jedoch noch andere Dinge zu beachten (im OGRE-Forum gelernt):
Wenn Sie also nicht die neuesten Shader-Funktionen verwenden, ist CG eine gute Wahl. GLSL scheint besser zu sein, wenn Sie mit OpenGL arbeiten. HLSL, wenn Sie ausschließlich auf Microsoft-Plattformen arbeiten.
Die erste Entwicklung von HLSL für Windows zur Verwendung von DirectX und die anschließende Konvertierung in GLSL für Linux und Mac könnte die bessere Lösung sein, um die Leistung zu gewährleisten und die größeren Shader-Funktionen verfügbar zu haben. Es könnte jedoch eine Menge Arbeit sein (habe es nicht selbst gemacht, also kann ich es nicht sagen). Die OGRE-Grafik-Engine (und andere Engines) ermöglichen die Verwendung beliebiger APIs (DirectX oder OpenGL oder andere), sodass dies hilfreich ist. Auf diese Weise muss jedoch noch Shader-Code konvertiert werden.
Das sind alle Informationen, die ich bei der Auswahl meiner Shader-Sprache gesammelt habe (ich habe meine Entscheidung noch nicht getroffen).
Update: Valve hat ein Spiel nach OpenGL konvertiert und keinen Weg gefunden, die DirectX-Version schneller als die OGL-Version zu machen . Denken Sie also daran, dass sich der Status der Treiberimplementierung, die API-Qualität usw. jedes Jahr zu stark ändert, als dass Sie sich bei der Auswahl des einen oder anderen Aspekts auf die Rohleistung verlassen könnten. Wählen Sie in diesem Sinne OpenGL / GLSL, um Ihr Leben zu vereinfachen, wenn Sie mit anderen Plattformen als Windows arbeiten (oder Pläne oder Hoffnungen haben). Verwenden Sie DirectX / HLSL, wenn Sie wirklich nur Microsoft-Plattformen verwenden und sich auf etwas konzentrieren möchten und vielleicht etwas Gutes haben möchten API schneller als OpenGL (dies kehrt sich jetzt um, rechnen Sie also nicht damit); Verwenden Sie CG, wenn Sie dem Benutzer beide Möglichkeiten bieten möchten. Wenn Sie jedoch über die erforderlichen Arbeitskräfte (und Tools) verfügen, ist die Verwendung von GLSL und HLSL möglicherweise ebenfalls eine praktikable Lösung.
Update (2012): Es ist wichtig zu wissen, dass CG eingestellt wurde und von Nvidia nicht mehr unterstützt oder aktiv bearbeitet wird. Nvidia empfiehlt allen Benutzern, auf eine Kombination aus GLSL und HLSL oder eine neuere Bibliothek wie nvFX (auf Github) umzusteigen. Dies liegt daran, dass es zu schwierig war, die Funktionskompatibilität zwischen GLSL und HLSL aufrechtzuerhalten.
Ich kann nur über CG vs HLSL sprechen, da dies die 2 sind, die ich bisher verwendet habe.
CG ist nicht dasselbe wie HLSL.
In Cg hat NVIDIA hervorragende Arbeit bei der Erstellung einer sehr sauberen Shader-Syntax geleistet. Es ist sehr ähnlich zu HLSL.
Die Verknüpfung mit D3D9 / D3D11 (Init-Code, Shader-Kompilierungscode) ist bei HLSL jedoch viel sauberer als bei Cg. -1 Cg. Cg hat einen fiesen Startcode, den Sie nicht einmal für HLSL über D3D benötigen.
In Cg müssen Sie "cgGetNamedParameter" für jede Shadervariable uniform
festlegen / ändern. Und Sie müssen einen CGparameter
Verweis in Ihrem Code für diese Variable pflegen
// 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 ist dies viel sauberer - nur eine Zeile, und Sie müssen diese CGparameter
Variable nicht pflegen .
// D3D9 C++ code to interact with HLSL shader variable
DX_CHECK( id3dxEffect->SetMatrix("modelViewProj", &mvp._11 ), "Set matrix" ) ;
Im obigen Beispiel DX_CHECK
handelt es sich nur um eine einfache Funktion, die das HRESULT überprüft, das vom SetMatrix
Aufruf zurückgegeben wird. Der obige Code lautet d3d9 . D3D10 und 11 sind natürlich viel schmerzhafter (da es kein ID3DX11Effect-Objekt gibt).
Bevor ich mit HLSL angefangen habe, habe ich mir diesen Code angesehen und wurde eifersüchtig .
Obwohl NVIDIA ihr Bestes taten, praktisch eine gemeinsame Schnittstelle für Cg zwischen OpenGL / D3D machen sprechen seine nicht auf diese Weise, und Sie haben cgGL*
, cgD3D9
, cgD3D10
,cgD3D11
Funktionsgruppen zu kämpfen. Das Ganze funktioniert also für OpenGL und D3D !! Anspruch geht nur so weit. Sie müssen noch alles in OpenGL / D3D-Typgruppen packen #ifdef
, damit es auf verschiedenen Plattformen funktioniert. -2 Cg.
Außerdem habe ich kürzlich schlechte Erfahrungen mit CG / ATI-Karten gemacht, von denen ich mir ziemlich sicher bin, dass sie nicht meine schlechte sind. (Jemand anderes probiert es aus?). Ich denke, es kann wahr sein, dass NVIDIA ATI-Karten nicht vollständig testet, wie Klaim behauptet. Oder dass ATI nicht auf CG testet. Auf die eine oder andere Weise gibt es dort ein Missverhältnis und eine Art Interessenkonflikt. -3 Cg.
Alles in allem habe ich Cg vorgezogen. Die Syntax und Benennung des Shader-Codes ist klar, süß und aufgeräumt. Schade, dass es diese anderen Probleme gibt.
Mein grundlegendes Verständnis ist, dass HLSL nur für DirectX und GLSL nur für OpenGL ist. Cg ist im Grunde die gleiche Sprache wie HLSL, kann jedoch entweder mit DirectX oder OpenGL verwendet werden (allerdings über einen anderen Laufzeitcode).
Ein weiterer entscheidender Unterschied zwischen HLSL und GLSL (ich kenne CG nicht, deshalb kann ich nicht dafür sprechen) ist, dass Microsoft mit HLSL den Shader-Compiler als Teil der D3D-Laufzeit bereitstellt, während Ihr Hardwarehersteller ihn mit GLSL als Teil der D3D-Laufzeit bereitstellt Treiber.
Dies hat auf beiden Seiten Vor- und Nachteile.
Mit der GLSL-Methode kann der Hersteller den Compiler auf die Fähigkeiten seiner Hardware abstimmen. Sie kennen ihre eigene Hardware am besten, sie wissen, was zu tun ist und was nicht. Andererseits besteht der Nachteil darin, dass in einer Welt mit mehreren Hardwareanbietern Inkonsistenzen zwischen Shader-Compilern auftreten können und der Anbieter auch völlig frei entscheiden kann, ob er Fehler macht oder nicht.
Mit der HLSL-Methode steuert Microsoft den Compiler. Jeder ist auf einer konsistenten technischen Basis und wenn ein Shader erfolgreich an einer Stelle kompiliert wird, kann davon ausgegangen werden, dass er überall kompiliert wird. Der gleiche Shader erzeugt unabhängig vom Hersteller die gleiche kompilierte Ausgabe (alle anderen Dinge sind natürlich gleich). Auf der anderen Seite muss der HLSL-Compiler eine Sache sein, bei der "alles durchgehend funktioniert", sodass er keine speziellen herstellerspezifischen Tricks ausführen kann, um die letzten Tropfen Saft aus dem Tank zu holen.
Wenn das so rüberkommt, als hätte ich eine Vorliebe für die HLSL-Sicht der Welt, dann weil ich es tue. Ich habe mich schon einmal von extrem inkonsistenten Verhaltensweisen auf verschiedenen Plattformen gebissen und musste in einem Fall sogar eine Ladung GLSL zurück an ARB ASM rollen, um eine funktionierende Baseline zu erhalten. Der GLSL-Compiler von NVIDIA kann hier als besonders berüchtigt angesehen werden - er akzeptiert sogar HLSL-Syntax und -Schlüsselwörter. Wenn Sie also nicht aufpassen, können Sie Shader erstellen, die nur mit NVIDIA und sonst nichts funktionieren. Es ist ein Dschungel da draußen.
Vielleicht möchten Sie sich auch das RTSS (Run Time Shader System) ansehen, das mit Ogre geliefert wird. Es ist ziemlich neu, aber im Grunde schreiben Sie Shader eher in Code als in externen Dateien. Ich habe es noch nicht implementiert, plane aber definitiv, es zu verwenden, wenn es soweit ist.
Hier finden Sie eine große Reihe von Tutorials im Ogre-Wiki, in denen Sie auch Shader schreiben können. http://www.ogre3d.org/tikiwiki/JaJDoo+Shader+Guide
Wie Praetor sagte, ist Ihre ursprüngliche Frage nicht wirklich eine Frage der Vor- und Nachteile, sondern der Frage, welches Rendering-System Sie verwenden möchten. Da die Verwendung von DX / OpenGL mit Ogre nur das Laden des Plugins erfordert, möchten Sie höchstwahrscheinlich das CG-Format verwenden.