10

CG (Fach) / Geometry Shader (Lektion)

-

Diese Lektion wurde von Missunderstand erstellt.

Lektion lernen

Diese Lektion ist leider nicht zum lernen freigegeben.

  • Geometry Shader Der Geometry-Shader hat nicht nur Zugriff auf einen Vertex, sondern auf alle Vertices eines Primitivs. Er befindet sich in der Pipeline nach der Primitive-Assembly (bzw. nach dem Tesselation-Shader, sollte dieser existieren). Dadurch kann mit einem Primitiv neue Geometrie erzeugt werden. Es kann auch der Primitiv-Typ geändert oder Primitive gelöscht werden. 
  • Neue Primitive GL_LINES_ADJACENCY GL_LINE_STRIP_ADJACENCY GL_TRIANGLES_ADJACENCY GL_TRIANGLE_STRIP_ADJACENCY 
  • Shaderfunktionen Am Anfang des Geometry-Shaders werden Ein- und Ausgabetyp der Primitive benannt. Zudem wird zur Speicherallokierung die maximale Anzahl der auszugebenden Vertices deklariert:  JederAufruf von EmitVertex() beendet die Konstruktion eines Vertex und gibt die aktuelle Belegung von gl_Position aus. Der Zugriff auf die Eingabevertices erfolgt über gl_in . Die Model-View-Projection- Matrix sollte an dieser Stelle mit jedem erstellten Punkt verrechnet werden. Ein Aufruf von EndPrimitive() gibt das Primitive weiter und beendet den Shader. Dabei können neue Vertices erstellt und bestehende ausgelassen werden: 
  • Code von Geometry Shader #version 330 layout (triangles) in; layout (line_strip, max_vertices = 8) out;  gl_Position = MVP * gl_in[i].gl_Position;  EmitVertex(); ... EndPrimitive(); 
  • Ausgabe Geometra Shader Die Ausgabe des Geometry-Shaders kann nur von den Typen points , line_strip oder triangle_strip sein. 
  • Anwendungsmöglichkeiten Vervielfachung von Geometrie Steuerung und Änderung von Geometrie (z.B. Level of Detail)Tesselation (hat über den GS aber Performance-Schwächen) Darstellung von HaarenDarstellung von Normalen zum Debuggen 
  • Mehrfache Ausführung Seit OpenGL 4 kann der Geometry-Shader auch direkt mehrfach nacheinander ausgeführt werden. Dies wird mit          layout(invocations = number) in festgelegt. Innerhalb des Shaders kann mit        glInvocationID überprüft werden, welche Ausführung dieser ist. 
  • Transform Feedback Man kann das Ergebnis eines Geometry-Shaders als erneuten Input für den Vertex-Shader nutzen. Die Zwischenergebnisse müssen dafür zwischen den Shaderaufrufen in einem neuen VBO gespeichert werden. Dieses VBO wird dann erneut an die Pipeline übergeben. Dieses Verfahren kann auch wiederholt ausgeführt werden, indem das alte und das neue VBO zwischen den Aufrufen jeweils gewechselt werden. So erhält man fein-granulare Ergebnisse (z.B. bei rekursiv erstellten Objekten wie Fraktalen). 
  • Code vom Transform Feedback GLchar const * Strings[] = {"gl_Position"}; glTransformFeedbackVaryings(programHandle, 1, Strings, GL_SEPERATE_ATTRIBS) ;  void glTransformFeedbackVaryings( GLuint program, GLsizei count, // Anzahl der Variablen const GLchar **varying,GLenum bufferMode);  glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, vbo); glBeginTransformFeedback(GL_LINES); glDrawArrays(GL_LINES, 0, sizei); glEndTransformFeedback(); 
  • Partikelsysteme Partikel werden als einzelne Vertices in einem VBO gespeichert. Diese Vertices werden durch das Transform- Feedback einmal pro Frame verändert. Dies ist effizient, da jeweils nur ein VBO geändert werden muss.  ! Nachteil: Abhängigkeit von der Framerate. Verfeinerung über Zeit zwischen Frames. 
Anzeige