2013-05-19 7 views
6

Ich habe vor kurzem mit OpenGL programmiert. Ich habe Code erstellt grundlegende primitive und habe Shader in WebGL verwendet. Ich habe das Thema ausführlich gegooglet, aber es ist mir immer noch nicht so klar. Grundsätzlich möchte ich Folgendes wissen. Gibt es etwas, das in GLSL getan werden kann, das nicht in einfacher OpenGL getan werden kann, oder macht GLSL nur Sachen effizienter?Was ist der Unterschied zwischen OpenGL und GLSL?

Antwort

12

Die kurze Version ist: OpenGL ist eine API zum Rendern von Grafiken, während GLSL (die für GL Schattierungssprache steht) ist eine Sprache, die Programmierer die Möglichkeit gibt, Pipeline-Shader zu ändern. Um es anders auszudrücken, GLSL ist ein (kleiner) Teil des gesamten OpenGL-Frameworks.

Um zu verstehen, wo GLSL in das große Bild passt, betrachten Sie eine sehr vereinfachte Grafikpipeline.

Vertexe angegeben --- (Vertex-Shader) ---> transformierte Vertexe --- (primitive Assembly) ---> Primitive --- (Rasterisierung) ---> Fragmente --- (Fragment-Shader) - -> Ausgangspixel

Die Shader (hier nur die Vertex- und Fragment-Shader) sind programmierbar. Sie können alle möglichen Dinge mit ihnen machen. Sie könnten einfach die roten und grünen Kanäle austauschen, oder Sie könnten ein Bump-Mapping implementieren, um Ihre Oberflächen viel detaillierter erscheinen zu lassen. Das Schreiben dieser Shader ist ein wichtiger Teil der Grafikprogrammierung. Hier ist ein Link mit einigen schönen Beispielen, die Ihnen zeigen sollen, was Sie mit benutzerdefinierten Shadern erreichen können: http://docs.unity3d.com/Documentation/Components/SL-SurfaceShaderExamples.html.

In der nicht allzu fernen Vergangenheit war die einzige Möglichkeit, sie zu programmieren, die Verwendung von GPU-Assembler. In OpenGL ist die Sprache als ARB-Assembler bekannt. Wegen der Schwierigkeit haben uns die OpenGL Leute GLSL gegeben. GLSL ist eine höhere Sprache, die kompiliert und auf Grafikhardware ausgeführt werden kann. Um das Ganze zusammenzufassen, sind programmierbare Shader ein integraler Bestandteil des OpenGL-Frameworks (oder jeder modernen Grafik-API), und GLSL macht es wesentlich einfacher, sie zu programmieren.

3

Wie auch von Mattsills beantwortet Antwort GL Shader Language oder GLSL ist ein Teil von OpenGL, der die Erstellung von Algorithmen ermöglicht, die als Shader in/für OpenGL bezeichnet werden. Shader laufen auf der GPU.

Shaders entscheiden über Faktoren wie die Farbe von Teilen von Oberflächen und die Art, wie Oberflächen Informationen wie reflektiertes Licht teilen. Vertex Shader, Geometry Shader, Tesselation Shader und Pixel Shader sind Shader-Typen, die in GLSL geschrieben werden können.


Q1:

Gibt es irgendetwas, das in GLSL getan werden kann, die im Klar OpenGL gemacht kann nicht sein?

A:

Sie können möglicherweise nur OpenGL ohne die GLSL Teile verwenden, aber wenn Sie Ihre eigene Oberflächeneigenschaften möchten, müssen Sie wollen wahrscheinlich ein Shader machen dies relativ einfach und performant, in etwas geschaffen wie GLSL.Hier sind einige Beispiele:

enter image description here

enter image description here

enter image description here

enter image description here

Q2:

Oder hat GLSL nur Dinge tun, effizienter?

A:

Pixel-Shader sind speziell sehr parallel, Werte unabhängig für jede Zelle eines 2D Gitters Berechnung, während auch erhebliche Einschränkungen enthält, wie nicht sehr performant nicht in der Lage „if“ -Anweisung ähnlichen Bedingungen zu handhaben Es ist also ein Fall von verschiedenen Arten von Shadern zu ihren Stärken, auf Oberflächen, die im Rest von OpenGL beschrieben und behandelt werden.



Q3:

Ich vermute, dass Sie nur wissen wollen, ob GLSL mit einer Option, und das kann ich nur mit meinem Wissen von einer Art von Shader, Pixel Shaders beantworten. Der Rest dieser Antwort umfasst „nur“ GLSL als eine mögliche Option:

A:

Während GLSL ein Teil von OpenGL ist, können Sie den Rest von OpenGL verwenden, um die Umgebung einzurichten und schreiben Sie Ihr Programm fast vollständig als Pixel-Shader, wobei jedes Element des Pixel-Shaders ein Pixel des gesamten Bildschirms einfärbt.


Zum Beispiel:

(Beachten Sie, dass WebGL eine Tendenz zum Schwein CPU zu dem Punkt hat das ganze System der Abwürgen und Windows 8.1 läßt es so tun, scheint Chrome besser auf diese Links als Firefox sehen .

)

Nein, dies ist nicht ein Videoclip von echtem Wasser:

https://www.shadertoy.com/view/Ms2SD1

Die einzigen externen Ressourcen dazu geführt Schnecke einige leicht erzeugbare Texturen:

https://www.shadertoy.com/view/ld3Gz2

Rendering mit ein lautes Fraktal Punktewolken:

https://www.shadertoy.com/view/Xtc3RS

https://www.shadertoy.com/view/MsdGzl

eine perfekte Kugel: 1 Polygon, 1 Oberfläche, keine Kanten oder Ecken:

https://www.shadertoy.com/view/ldS3DW

ein Partikelsystem wie Simulation mit Autos auf einer Rennstrecke, einen 2. schmale, aber lang unter Verwendung von Pixelshader als Tabelle von Daten über Auto Positionen:

https://www.shadertoy.com/view/Md3Szj

Zufallswerte sind relativ einfach:

fract(sin(p)*10000.) 

Ich habe die Sprache, in mancher Hinsicht gefunden, hart zu sein, mit zu arbeiten und es kann oder auch nicht besonders praktisch sein GLSL auf diese Weise für eine große verwenden Projekt wie ein Spiel oder eine Simulation, aber wie diese Demos zeigen, muss ein Computerspiel nicht wie ein Computerspiel aussehen und diese Art von Ansatz sollte eine Option sein, vielleicht mit generierten Inhalten und/oder externen Daten verwendet.

Wie ich es verstehe OpenGL auszuführen vernünftig Pixel Shaders in:

  • hat in ein kleines Stückchen Speicher geladen werden.
  • Keine Unterstützung:
    • "wenn" Aussage wie Bedingungen.
    • Rekursion oder while-Schleife wie Flusskontrolle.
  • Sind auf einen kleinen Pool von gültigen Anweisungen und Datentypen beschränkt.
  • Einschließlich "sin", mod, Vektormultiplikation, floats und halbpräzisen Floats.
  • Fehlende Funktionen auf hohem Niveau wie Objekte oder Lambdas.
  • Und effektiv Werte auf einmal parallel berechnen.
  • Eine Konsequenz von all dem ist, dass Code mehr wie Linien von geschlossenen Formgleichungen aussieht und keine Algorythmen oder Strukturen auf höherer Ebene aufweist, die modulare Arithmetik für etwas Ähnliches wie Bedingungen verwenden.

    +0

    Was hat das mit der Beantwortung der gestellten Frage zu tun? –

    +0

    Durch die Beantwortung von GLSL vs GL, und es ist wirklich ein Teil der Beziehung statt Alternativen zu sein, was die Fragen "Was kann in einem, aber nicht im anderen getan werden". Es zeigt auch, was mit "nur" GLSL gemacht werden kann, obwohl nur der Teil, über den ich weiß, und was in GLSL effizient ist und was nicht. Es ist keine vollständige Antwort, es gibt nur eine Menge Informationen über Dinge, die ich kenne, die bei der Frage helfen können. Es ist die einzige Antwort, die bisher nur die Verwendung von GLSL behandelt, und wenn dies effizienter wäre, sogar mit Live-Code-Beispielen. – alan2here

    +0

    @ NicolBolas es war nicht klar, was war der Teil der Frage, ich habe etwas Text neu angeordnet und ausgeschildert, um die Dinge deutlicher zu machen. – alan2here

    Verwandte Themen