Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader
Inhaltsverzeichnis
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
- Übersichtseite Lazarus - OpenGL 3.3 Tutorial