Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
(Einleitung)
Zeile 38: Zeile 38:
 
   Shader.Free;</syntaxhighlight>
 
   Shader.Free;</syntaxhighlight>
 
<br><br>
 
<br><br>
Diese Kommentare, welche man hier im Shader sind, werden auch dem der Grafik-Teiber übergeben, aber dieser ingnoriert sie dann.<br>
+
Die Kommentare im Shader werden auch dem der Grafik-Teiber übergeben, aber dieser ingnoriert sie dann.<br>
Wen man voll auf Perfornance beim laden ab ist, sollte man Kommentare im Shader-Code meiden.<br>
+
Wer Shader möglichst schnell laden möchte, sollte die Kommentare im Vorfeld entfernen. Auch jede Leerzeile und jede Einrückung bremsen ein wenig ab.<br>
Auch jede Leerzeile und jede Einrückung bremsen ein wenig ab.<br>
 
 
Auf die später Zeichengeschwindigkeit hat dies aber keinen Einfluss.<br>
 
Auf die später Zeichengeschwindigkeit hat dies aber keinen Einfluss.<br>
 
Aber hier im Tutorial wird voll auf solche Optimierungen verzichtet, da wir übersichtlichen Shader-Code sehen wollen.<br>
 
Aber hier im Tutorial wird voll auf solche Optimierungen verzichtet, da wir übersichtlichen Shader-Code sehen wollen.<br>
 
<br><br>
 
<br><br>
 +
 
==Vertex-Shader:==
 
==Vertex-Shader:==
 
<syntaxhighlight lang="glsl">#version 330
 
<syntaxhighlight lang="glsl">#version 330

Version vom 2. Dezember 2019, 10:42 Uhr

Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader.png

Shader - Einfachster Shader

Einleitung

Hier wird ein sehr einfacher Shader geladen, welcher nichts anderes macht, als die Dreiecke rot darzustellen.


Hier wird noch ein Objekt der Klasse TShader deklariert.

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    ogc: TContext;
    Shader: TShader; // Shader-Object

Dieser Code wurde um 2 Zeilen erweitert.

In der ersten Zeile wird der Shader in die Grafikkarte geladen.
Da die Shader-Objecte als Text-Dateien vorliegen, wird hier FileToStr(Datei) verwendet.
Die zweite Zeile aktiviert den Shader.

procedure TForm1.CreateScene;
begin
  Shader := TShader.Create([FileToStr('Vertexshader.glsl'), FileToStr('Fragmentshader.glsl')]);
  Shader.UseProgram;

Beim Zeichnen muss man auch mit Shader[x].UseProgram(... den Shader wählen, wenn man mehr als einen Shader verwendet.
In der Shader-Klasse steht nichts anderes alsglUseProgram(ShaderID); .
Bei diesem Mini-Code mit nur einem Shader könnte dies weggelassen werden.

procedure TForm1.ogcDrawScene(Sender: TObject);
begin
  glClear(GL_COLOR_BUFFER_BIT);

  Shader.UseProgram;

Am Ende werden mit Shader.Free die Shader in der Grafikkarte wieder freigeben.
In diesem Destruktor steht glDeleteShader(ShaderID);

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Shader.Free;



Die Kommentare im Shader werden auch dem der Grafik-Teiber übergeben, aber dieser ingnoriert sie dann.
Wer Shader möglichst schnell laden möchte, sollte die Kommentare im Vorfeld entfernen. Auch jede Leerzeile und jede Einrückung bremsen ein wenig ab.
Auf die später Zeichengeschwindigkeit hat dies aber keinen Einfluss.
Aber hier im Tutorial wird voll auf solche Optimierungen verzichtet, da wir übersichtlichen Shader-Code sehen wollen.


Vertex-Shader:

#version 330

layout (location = 10) in vec3 inPos; // Vertex-Koordinaten
 
void main(void)
{
  gl_Position = vec4(inPos, 1.0);
}



Fragment-Shader

#version 330

out vec4 outColor;                     // ausgegebene Farbe

void main(void)
{
  outColor = vec4(1.0, 0.0, 0.0, 1.0); // Die Ausgabe ist immer Rot
}



So könnte ein optimierter Shader-Code aussehen, dafür ist er aber sehr schlecht leserlich.

Vertex-Shader:

#version 330
layout(location=10)in vec3 inPos;
void main(void){gl_Position=vec4(inPos, 1.0);}


Autor: Mathias

Siehe auch