Was sind die Vor- und Nachteile von HLSL vs GLSL vs cg? [geschlossen]

61

Was sind die Vor- / Nachteile der drei?

Z_guy
quelle
2
Es scheint, als müssten Sie zuerst entscheiden, für welche API Sie sich entschieden haben (OGL oder DX) und welche Plattformen, bevor Sie sich für eine Shader-Sprache entscheiden.
Tetrad
1
Ich finde diese Frage genial. Wie wäre es mit einem Community-Wiki? Ich bin neu in all dem und eine Frage der Unterschiede zu Shadern ist genau das, was ich wissen muss.
Mladen Mihajlovic
3
Korrektur: "Geschlossen als nicht konstruktiv" sollte "Geschlossen als Verstoß gegen die Dummkopf-Richtlinie" heißen, da dies konstruktiv ist.
Lennart Rolland

Antworten:

42

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

  • CG erlaubt Ihnen nicht, die neuesten Funktionen von GLSL zu nutzen (ich bin mir nicht sicher, was HLSL angeht). Es ist ein Mittelweg, so dass Sie die GLSL-Funktionen nicht voll ausnutzen können, nur die üblichen bis zum Shader Model 3.0 (AFAI verstanden).
  • CG wird von NVidia entwickelt, um es für seine Karte zu optimieren, scheint aber für ATI-Karten nicht viel Arbeit zu leisten. Einige Leute berichten, dass es Probleme mit ATI-Karten geben könnte, die CG verwenden.
  • OpenGL scheint auf Windows-Plattformen etwas langsamer zu sein als DirectX. Das ist wirklich relativ zu dem, was Sie tun, und der Grund dafür liegt in den Treiberimplementierungen. Es ist jedoch gut zu wissen, bevor Sie die API und die zugehörige Shader-Sprache auswählen. OpenGL ist jedoch die einzige Schnittstelle, die auf allen Plattformen (win / mac / unix / einige Konsolen) verfügbar ist. Zu wissen, dass die ausschließliche Verwendung von GLSL die bessere Wahl für ein plattformübergreifendes Spiel ist, das nicht auf Microsft basiert.
  • NVidia-Treiber unter Linux scheinen stabiler zu sein als ATI-Treiber, was CG interessanter macht, wenn Sie sicherstellen möchten, dass es unter Linux einwandfrei funktioniert (alle gemeldeten Informationen müssen überprüft werden).

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.

Klaim
quelle
2
Ja . NVIDIA scheint sich nicht um Probleme mit ATI-Karten zu kümmern.
bobobobo
4
"OpenGL scheint auf Windows-Plattformen etwas langsamer zu sein als DirectX." In den meisten Fällen liegt dies daran, dass der Hersteller Treiber mit OpenGL unter Windows nicht so gut unterstützt wie unter DirectX.
ChrisC
1
Hinweis: Ich habe mich am Ende für OpenGL / GLSL entschieden, weil kürzlich Verbesserungen vorgenommen wurden und ich sicherstellen musste, dass mein Spiel auf einigen Nicht-MS-Tablets funktioniert.
Klaim
2
@Community: Hast du irgendwelche Links für die Einstellung des Supports für Cg?
Nicol Bolas
15

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 uniformfestlegen / ändern. Und Sie müssen einen CGparameterVerweis 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 CGparameterVariable nicht pflegen .

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

Im obigen Beispiel DX_CHECKhandelt es sich nur um eine einfache Funktion, die das HRESULT überprüft, das vom SetMatrixAufruf 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.

Bobobobo
quelle
10

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

coderanger
quelle
+1 Das ist auch mein Verständnis, ich persönlich verwende gerne cg, wann immer ich kann, aber es fügt eine zusätzliche Abhängigkeit hinzu, die über das Rendersystem selbst hinausgeht. und ich erinnere mich an seltsame Probleme mit OpenGL-, CG- und ATI-Treibern mit komplexeren Effekten ...
Riley Adams
Ich benutze Ogre und habe daher alle drei zur Verfügung, aber wenn ich sowohl DirectX als auch OpenGL haben möchte, muss ich entweder die Shader in HLSL und GLSL schreiben oder nur cg? Ist das richtig?
Z_guy
14
-1. Dies ist eine äußerst rudimentäre Antwort und man würde hoffen, auf dieser Site umfassendere Informationen zu finden.
Bobobobo
2
-1: Ich stimme Bobobobo zu.
Nicol Bolas
1
Leider muss ich -1 aus den gleichen Gründen wie Bobobobo.
Jonathan Dickinson
8

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.

Maximus Minimus
quelle
1
Um ehrlich zu sein, der GLSL-Compiler von NVIDIA hat seitdem strengere Regeln für das, was er tut und was nicht. Aber es gibt auch heute noch so genannte "NVIDIA-Traps", die es einfach machen, Dinge zu tun, von denen Sie glauben, dass sie funktionieren sollten, die jedoch nicht den tatsächlichen Spezifikationen und AMD-Treibern entsprechen.
Nicol Bolas
Ich würde sogar sagen, dass die Weiterentwicklung von ATI / AMD oder zumindest die regelmäßige Gegenprüfung mit ATI / AMD immer noch ein absolutes Muss ist. Sie erhalten zwei Kills zum Preis von einem, da Sie auch Fehler im OpenGL-Treiber finden.
Maximus Minimus
Beim Targeting von Vulkan- oder OpenGL-Implementierungen, die SPIR-V unterstützen, können GLSL-Shader zu SPIR-V vorkompiliert werden.
Andrea
@ Andrea - ja, das ist richtig; offensichtlich existierten weder Vulkan noch SPIR-V zu dem Zeitpunkt, als die Frage gestellt wurde (und der Asnwer geschrieben wurde).
Maximus Minimus
1

Ich habe beides benutzt, ich habe mit glsl angefangen und bin nur zu hlsl gewechselt, weil das Projekt es verlangt. Wenn man die Wahl hat, ist es ganz glatt. glsl fühlt sich sehr schick an und hlsl fühlt sich an, als wäre es von einer Hobbybank eines Ingenieurs ausgegangen.

user24721
quelle
1

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.

Aidan Knight
quelle