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

Aus DGL Wiki
Wechseln zu: Navigation, Suche
(Die Seite wurde neu angelegt: „200px<br><br> =Shader - Geometrie Shader = == Einleitung == Hier wird ganz kurz der Geo…“)
 
(Einleitung)
 
Zeile 3: Zeile 3:
 
== Einleitung ==
 
== Einleitung ==
 
Hier wird ganz kurz der Geometrie-Shader erwähnt.<br>
 
Hier wird ganz kurz der Geometrie-Shader erwähnt.<br>
In diesem Beispiel wird nicht ins Detail eingegangen, es sollte nur zeigen für was ein Geometrie-Shader gut ist.<br>
+
In diesem Beispiel wird nicht ins Detail eingegangen, es sollte nur zeigen für was Geometrie-Shader gut sind.<br>
 
Die Funktion hier im Beispiel ist, die beiden Meshes werden kopiert und anschliessend nach Links und Rechts verschoben.<br>
 
Die Funktion hier im Beispiel ist, die beiden Meshes werden kopiert und anschliessend nach Links und Rechts verschoben.<br>
Auch bekommt die Linke Version eine andere Farbe als die Rechte.<br>
+
Auch bekommt die linke Version eine andere Farbe als die rechte.<br>
 
<br>
 
<br>
Man kann einen Geometrie-Shader auch brauchen um automatisch die Normale auszurechnen, welche für Beleuchtungs-Effekte gebraucht wird.<br>
+
Man kann einen Geometrie-Shader auch Nutzen um automatisch die Normale auszurechnen, welche für Beleuchtungs-Effekte gebraucht wird.<br>
 
Was eine Normale ist, wird später im Kapitel Beleuchtung erklärt.<br>
 
Was eine Normale ist, wird später im Kapitel Beleuchtung erklärt.<br>
 
<br>
 
<br>
 
Der Lazarus-Code ist nichts besonderes, er rendert die üblichen zwei Meshes Dreieck und Quadrat.<br>
 
Der Lazarus-Code ist nichts besonderes, er rendert die üblichen zwei Meshes Dreieck und Quadrat.<br>
Die einzige Besondeheit ist, es wird zu den üblichen zwei Shader noch ein Geometrie-Shader geladen wird.<br>
+
Die einzige Besondeheit ist, dass zu den üblichen zwei Shader noch ein Geometrie-Shader geladen wird.<br>
 
<br><br>
 
<br><br>
Hier ist die einzige Besonderheit, dem Constructor von TShader wird ein dritter Shader-Code mitgegeben.<br>
+
Hier ist die einzige Besonderheit, dass im Constructor von TShader ein dritter Shader-Code mitgegeben wird.<br>
 
<br>
 
<br>
Wen man bei der Shader-Klasse einen dritten Shader mit gibt, wird automatisch erkannt, das noch ein Geometrie-Shader dazu kommt.<br>
+
Wenn man bei der Shader-Klasse einen dritten Shader mit gibt, wird automatisch erkannt, das noch ein Geometrie-Shader dazu kommt.<br>
 
<syntaxhighlight lang="pascal">procedure TForm1.CreateScene;
 
<syntaxhighlight lang="pascal">procedure TForm1.CreateScene;
 
begin
 
begin
Zeile 21: Zeile 21:
 
   Shader.UseProgram;</syntaxhighlight>
 
   Shader.UseProgram;</syntaxhighlight>
 
<br><br>
 
<br><br>
 +
 
==Vertex-Shader:==
 
==Vertex-Shader:==
 
<syntaxhighlight lang="glsl">#version 330
 
<syntaxhighlight lang="glsl">#version 330

Aktuelle Version vom 2. Dezember 2019, 10:52 Uhr

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

Shader - Geometrie Shader

Einleitung

Hier wird ganz kurz der Geometrie-Shader erwähnt.
In diesem Beispiel wird nicht ins Detail eingegangen, es sollte nur zeigen für was Geometrie-Shader gut sind.
Die Funktion hier im Beispiel ist, die beiden Meshes werden kopiert und anschliessend nach Links und Rechts verschoben.
Auch bekommt die linke Version eine andere Farbe als die rechte.

Man kann einen Geometrie-Shader auch Nutzen um automatisch die Normale auszurechnen, welche für Beleuchtungs-Effekte gebraucht wird.
Was eine Normale ist, wird später im Kapitel Beleuchtung erklärt.

Der Lazarus-Code ist nichts besonderes, er rendert die üblichen zwei Meshes Dreieck und Quadrat.
Die einzige Besondeheit ist, dass zu den üblichen zwei Shader noch ein Geometrie-Shader geladen wird.


Hier ist die einzige Besonderheit, dass im Constructor von TShader ein dritter Shader-Code mitgegeben wird.

Wenn man bei der Shader-Klasse einen dritten Shader mit gibt, wird automatisch erkannt, das noch ein Geometrie-Shader dazu kommt.

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



Vertex-Shader:

#version 330

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



Geometrie-Shader:

#version 330

#define distance 0.5

layout(triangles) in;
layout(triangle_strip, max_vertices = 9) out;

out vec3 Color; // Farb-Ausgabe für den Fragment-Shader 

void main(void)
{

// Linke Meshes
   for(int i = 0; i < gl_in.length(); i++)
   {
      gl_Position = gl_in[i].gl_Position + vec4(-distance, 0.0, 0.0, 0.0); // nach Links verschieben
      Color = vec3(1.0, 0.0, 0.0);                                         // Links Rot
      EmitVertex();
   }
   EndPrimitive();


// Rechte Meshes
   for(int i = 0; i < gl_in.length(); i++)
   {
      gl_Position = gl_in[i].gl_Position + vec4(distance, 0.0, 0.0, 0.0);  // nach Rechts verschieben
      Color = vec3(0.0, 1.0, 0.0);                                         // Rechts Grün
      EmitVertex();
   }
   EndPrimitive();
}



Fragment-Shader

#version 330

in vec3 Color;      // Farbe vom Geometrie-Shader.
out vec4 outColor;  // Ausgegebene Farbe.

void main(void)
{
  outColor = vec4(Color, 0.1);
}


Autor: Mathias

Siehe auch