Lazarus - OpenGL 3.3 Tutorial - Shader - Einfachster Shader: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: „200px<br><br> =Shader - Einfachster Shader = == Einleitung == Hier wird ein sehr einf…“) |
(kein Unterschied)
|
Version vom 14. Dezember 2017, 19:00 Uhr
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;
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);}
Autor: Mathias
Siehe auch
- Übersichtseite Lazarus - OpenGL 3.3 Tutorial