Ich schicke ein Dreieck in die Pipeline und möchte es in eine Sierpinski-Dichtung tessellieren. Es fühlt sich so an, als ob das mit der Instanziierung des Geometrie-Shaders so viel einfacher wäre, also sag mir bitte, ob die Idee, es mit Tessellations-Shadern zu machen, einfach falsch ist.Wie kann die ID des aktuellen Eckpunkts während der TES-Phase identifiziert werden?
Während der Tessellationskontrolle überprüfe ich die ID gegen 0-11
und speichere die Eckpunktposition und Farbe an der Position der aktuellen ID.
Ich definiere glPatchParameteri(GL_PATCH_VERTICES, 3);
und layout(vertices = 12) out;
für meine Tesselation Control Shader, wie ich jedes Dreieck in 4 Dreiecke tesselated wollen.
Es sieht aus wie während meines Tessellation Evaluation Shader die in vec3 tcPosition[];
und in vec3 tcColor[];
Arrays die richtigen 12
Werte in der richtigen Reihenfolge enthalten. Allerdings: Wie ordne ich sie bei der Auswertung richtig zu? Gibt es so etwas wie gl_primitiveID
während der Tessellation-Auswertung? Ich würde einen Ersatz für gl_primitiveID
benötigen, der 0
für alle generierten Scheitelpunkte ist, da sie aus dem gleichen Patch hervorgebracht werden. Zur Zeit verwende ich nur die Information der ersten drei Eckpunkte (0
, 1
, 2
), aber ich müsste diese Indizes nach jedem generierten Dreieck um 3 verschieben.
void main(){
vec3 p0 = gl_TessCoord.x * tcPosition[0];
vec3 p1 = gl_TessCoord.y * tcPosition[1];
vec3 p2 = gl_TessCoord.z * tcPosition[2];
tePosition = p0 + p1 + p2;
teColor = gl_TessCoord.x * tcColor[0] + gl_TessCoord.y * tcColor[1] + gl_TessCoord.z * tcColor[2];
gl_Position = mvp * vec4(tePosition, 1);
}
Keine Erkenntnisse oder Ideen, wie tessellate das Dreieck geschickt, so dass ich später in der Lage bin Feedback für Ping-Pong-Rendering verwendet verwandeln werden sehr geschätzt.
Vielen Dank für das ausführliche Feedback. Dies hat mir geholfen, nicht zusätzliche Tage in den Versuch zu investieren, einen Weg zu finden, Arbeit zu machen, was nicht funktionieren kann. Ich werde mit der GS fortfahren, da ich weiß, wie viele Rekursionsebenen zusammen mit Ping-Pong-Rendering verwendet werden können (ein Durchgang gibt 12 Eckpunkte pro Dreieck aus und dann wird das Ergebnis mit Transformations-Feedback zurückgelesen und dann komplett gestartet neue Iteration). – NoxMortem
@NoxMortem: "* Ein Durchlauf gibt 12 Scheitelpunkte pro Dreieck aus und dann wird das Ergebnis mit Transformationsrückmeldung zurückgelesen, dann wird eine komplett neue Iteration gestartet *" ... An diesem Punkt wäre es schneller, die CPU zu verwenden. Alles, was vor dem Start der nächsten Iteration anhält, ist langsamer als ein optimierter CPU-Algorithmus. Zumindest könnten Sie einen Compute Shader verwenden. –