Geometrie-Shader für mehrere Grundelemente

8

Wie kann ich einen Geometrie-Shader erstellen, der mehrere Grundelemente verarbeiten kann? Wenn ich beispielsweise einen Geometrie-Shader für Dreiecke erstelle, definiere ich ein Layout wie folgt:

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

Wenn ich diesen Shader verwende, werden Linien oder Punkte nicht angezeigt. Also füge hinzu:

layout(triangles) in;
layout(triangle_strip, max_vertices=3) out;
layout(lines) in;
layout(line_strip, max_vertices=2) out;

Der Shader wird kompiliert und ausgeführt, rendert jedoch nur Linien (oder was auch immer das zuletzt definierte Grundelement ist).

Wie definiere ich einen einzelnen Geometrie-Shader, der mehrere Arten von Grundelementen verarbeitet? Oder ist das nicht möglich und ich muss mehrere Shader-Programme erstellen und Shader-Programme ändern, bevor ich jeden Typ zeichne?

MichaelHouse
quelle

Antworten:

7

Ich glaube nicht, dass OpenGL Geometrie-Shader unterstützt, die mehrere Arten von Grundelementen ausgeben. Ich bin tatsächlich überrascht, dass Ihr zweiter Codeblock kompiliert wurde ... Vielleicht hat er nur die Konfiguration überschrieben?

Sie müssen mehrere Shader erstellen und zwischen diesen wechseln, zumindest für Dreiecke / Linien und Punkte. Es gibt tatsächlich einen Trick, den Sie mit einem Fragment-Shader ausführen können, um Dreiecke zu empfangen, aber nur Linien zu rendern, indem Sie Fragmente verwerfen, die gemäß den Schwerpunktkoordinaten zu weit in das Dreieck fallen. Für die genaue Implementierung verweise ich Sie auf das OpenGL Orange Book und seinen Abschnitt über Geometrie-Shader und das Zeichnen eines Drahtgitters (ich werde zurückkommen und es bearbeiten, nachdem ich das genaue Kapitel gefunden habe).

Viel Spaß beim Codieren!

Kevintodisco
quelle
2

Es ist nicht möglich, ein Programm mit Geometrie-Shadern zu erstellen, die mehrere primitive Typen verarbeiten.

Davon abgesehen müssen Sie nicht viel arbeiten, um mehrere primitive Typen zu unterstützen. Dank ARB_separate_shader_objects , die Sie nicht mehr haben zusammen alle Ihre Shader - Stufen zu verbinden. Sie können ein Nur-Scheitelpunkt-Programm, ein Nur-Fragment-Programm und 2-3 Nur-Geometrie-Programme haben, die Sie miteinander mischen und anpassen. Solange sie kompatible Schnittstellen verwenden, ist alles in Ordnung.

Nicol Bolas
quelle