2017-07-04 4 views
0

Wie es möglich ist, Daten über Shader zu übergeben, wenn Vertex, Tess. Kontrolle, tess. Evaluations-, Geometrie- und Fragment-Shader. Ich habe versucht, den Schnittstellenblock auf diese Weise zu verwenden.Weitergabe von Daten über Shader

//vertex shaders 
out VS_OUT { ... } vs_out; 

als ich diesen Code in Tessellation Steuer Shader geschrieben:

in VS_OUT { ... } tc_in; 
out TC_OUT { ... } tc_out; 

So tesselation Kontrolle Shader einmal für jeden Knoten genannt. Bedeutet dies, dass tc_in nicht Array, sondern einzelne Variable sein muss. Ich bin nicht wirklich sicher wegen der hinterhältigen gl_InvocationID.

Dann wird es hart. Tessellations-Evaluierungs-Shader Etwas sagt mir, dass der Evaluations-Shader den Schnittstellenblock als Array nehmen sollte.

in TC_OUT { ... } te_in[]; 
out TE_OUT { ... } te_out[]; 

Wechsel zum Geometrieshader. Der Geometrie-Shader benötigt mehrere Vertices, also Array-Block.

Scheint echt für mich, aber Daten kamen nicht zu Fragment Shader.

Ich würde mich über jeden Hinweis freuen.

Antwort

2

Tessellation Steuer Shadern nehmen die Scheitelpunkte eines Pflasters als sie in irgendeiner Weise zu modifizieren, so dass ihre Eingabe und Ausgabe ist

in VS_OUT { ... } tc_in[]; 
out TC_OUT { ... } tc_out[]; 

Die Steuer Shader für jeden Patch Scheitelpunkt (sehen, welche durch die Verwendung gl_InvocationID) aufgerufen wird, , so dass Sie normalerweise keine Schleifen benötigen, um es zu implementieren.

Tessellation Auswertung Shadern nehmen diese modifizierten Vertices und zum Ausgeben eines einzigen Eckpunkt pro Aufruf, so haben wir

in TC_OUT { ... } te_in[]; 
out TE_OUT { ... } te_out; 

Geometry-Shader mehrere Scheitelpunkte übernehmen und ausgeben kann, eine andere Anzahl von Scheitelpunkten, aber diese sind explizit konstruiert Verwendung EmitVertex und EmitPrimitive, so gibt es nur ein Ausgangselement, das vor jedem Aufruf von EmitVertex gefüllt werden muss:

in TE_OUT { ... } gs_in[]; 
out GS_OUT { ... } gs_out; 

Aber vergessen Sie nicht, glPosition in Ihrem Geometrieshader zu setzen, sonst weiß OpenGL nicht, wo Sie Ihre Scheitelpunkte platzieren müssen.

Die interpolierten Werte von gs_out werden dann an den Fragment-Shader übergeben.

+0

Vielen Dank! Du hast sehr geholfen! – Peter

+0

Ich bin froh, Ihnen helfen zu können. Wenn Sie ein paar Beispiele haben wollen, als ich zum ersten Mal Tessellations-Shader benutzte, half mir dieser Artikel (http://prideout.net/blog/?p=48), die Konzepte und die Implementierung zu verstehen. –

Verwandte Themen