02 - Shader

02 - Einfachster Shader

Selfhtml

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;


Diese Kommentare, welche man hier im Shader sind, werden auch dem der Grafik-Teiber übergeben, ab in dieser ingnoriert sie dann.
Wen man voll auf Perfornance beil laden ab ist, sollte man Kommentare im Shader-Code meiden.
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);}



zurück