8
CG (Subject) / Tesselation Shader (Lesson)
Tesselation verfeinert die Geometrie. Der Tesselation-Shader befindet sich zwischen Primitive-Assembly und Geometry-Shader.
This lesson was created by Missunderstand.
This lesson is not released for learning.
- Eingabe Die Eingabe des Tesselation-Shaders ist die Ausgabe des Vertex-Shaders. Es wird ein neuer Primitive-Typ GL_PATCHES eingeführt. Dieser hat bis zu 32 Vertices und wird definiert durch glPatchParameteri(GL_PATCH_VERTICES, value) . Der Default ist 3. Die Vertices vom Vertex-Shader werden gebündelt, bis value erreicht wird. Dieses Patch definiert dann die Eingabe für den Tesselation- Shader.
- Tesselation-Pipeline TCS: Tesselation-Control-Shader (progammierbar) Tesselator (nicht programmierbar) TES: Tesselation-Evaluation-Shader (programmierbar)
- Tesselation-Control-Shader Der TCS steuert, wie weit die Geometrie verfeinert wird. Hier kann jede Seite und die Zwischenverbindung in bis zu 64 einzelne Stücke aufgeteilt werden. Diese Entscheidung kann z.B. abhängig von der Entfernung der Kamera sein. Der TCS wird für jeden Output-Vertex aufgerufen.
- Quads Jedes Rechteck (Quad) von vier Vertices wird in ein äußeres und ein inneres Quad aufgeteilt. Die Verfeinerung der Geometrie ist für beide Quads undabhängig bestimmbar. Dies lässt sich steuern über: glTessLevelInner(0) //Die untere und obere Seite des inneren Quads. glTessLevelInner(1) //Die linke und rechte Seite des inneren Quads. glTessLevelOuter(i) //Die Seiten des äußeren Quads einzeln im Uhrzeigersinn, beginnt mit links (i=0)und endet mit oben (i=3).
- Code von TCS version 430 core layout (vertices = 4) out; void main(void) { if(gl_InvocationID == 0) { glTessLevelInner[0] = 9.0; glTessLevelInner[1] = 7.0; glTessLevelOuter[0] = 3.0; ... } gl_out[glInvocationID].gl_Position =gl_in[glInvocationID].gl_Position; }
- Tesselation-Evaluation-Shader Der TES erhält die verfeinerte Geometrie und verändert diese. Er wird pro erzeugtem Punkt aufgerufen und erhält die baryzentrischen Koordinaten von diesem mit glTessCoord Ersetzt i.d.R. die Position, aber z.B. auch Normale und Texturkoordinate. Der Layout-Qualifier muss spezifizieren: 1. Ob Quads als quads oder Dreiecke als triangles ankommen 2. Ob die Koordinaten äquidistant (equal_spacing), oder fraktal (fractional_even_spacing) bzw. (fractional_odd_spacing) unterteilt werden sollen 3. Ob die Orientierung der Koordinaten im cw oder ccw ist
- Code minimaler TES #version 440 core layout(triangles, equal_spacing, cw) in; in vec4 tcPosition[]; out vec4 tePostition; uniform mat4 uniformTransformation; void main() { vec4 p0 = glTessCoord.x * tcPosition[0]; vec4 p1 = glTessCoord.y * tcPosition[1]; vec4 p2 = glTessCoord.z * tcPosition[2]; tePosition = (p0 + p1 + p2); gl_Position = uniformTransformation * tePosition; }
- Anwendungen vom TES Rendern von Terrain mithilfe einer Height-Map. Subdivision Surfaces Bézierkurven Dynamische Generierung von Objekten wie z.B. Wiese
Advertisement