Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader

Aus DGL Wiki
Wechseln zu: Navigation, Suche

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 bremst 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