2D-Strichzeichnung mit Pixel-Shadern

7

Kürzlich stellte ich eine Frage, wie 2D-Linien mit DirectX am schnellsten gerendert werden können , und eine der Antworten erwähnte dieses Papier über schnelle vorgefilterte Linien, bei denen Pixel-Shader zum Zeichnen von Drahtgittern verwendet werden. In diesem Artikel werden Quads pro Liniensegment gezeichnet. Anschließend wird mit einem Pixel-Shader eine Linie gezeichnet, indem der Abstand zwischen Pixel und Linie in der Mitte des Quadrats berechnet wird, bevor mit Linienfarbe oder transparent gefüllt wird.

Ich frage mich also, wie das gemacht werden kann. Mir war nicht bewusst, dass der Pixel-Shader Kenntnisse über die Eingabegeometrie (z. B. das Quad) erhalten kann, mit der er erstellt wird. Ist folgendes möglich? Idealerweise in DirectX9, aber auch in DX10- oder OpenGL-Lösungen!

Geben Sie hier die Bildbeschreibung ein

BEARBEITEN

Es stellt sich heraus, dass ich das Quad nicht so zeichne, aber so. Die Frage ist also: Wie kann ich Informationen über x1y1 x2y2 in den Pixel-Shader übertragen, um die Entfernung zur Linienkante zu berechnen und ein schönes Antialias-Liniensegment zu erhalten?

Geben Sie hier die Bildbeschreibung ein

Dr. ABT
quelle
2
Sie wollen so ein riesiges Quad nicht zeichnen; Es ist eine kolossale Verschwendung von Rechenleistung, da die meisten Pixel, die es berührt, vollständig transparent sind. Zeichnen Sie einfach ein dünnes Quad, das entlang der Linie ausgerichtet ist und nur die Breite der Linie plus den Filterradius auf allen Seiten abdeckt.
Nathan Reed
Ok, lol. Die Methode in diesem Artikel erfordert also, dass Quads eingerichtet werden (ähnlich wie bei meiner aktuellen Geo-Shader-Implementierung). Wird nur der Pixel-Shader verwendet, um die weichen Kanten zu bearbeiten? Wenn ja, bin ich immer noch daran interessiert zu lernen, wie man Informationen über Quad-Eckpunkte in den Pixel-Shader bekommt!
Dr. ABT
Du hast schon ein bisschen Shader-Erfahrung gemacht, oder? Sie wissen also, wie UVs, normale Vektoren usw. vom Vertex-Shader an den Pixel-Shader übergeben werden, indem Sie Ausgabeparameter in den Vertex-Shader schreiben, die mit den Eingabeparametern im Pixel-Shader übereinstimmen. Sie können auch Ausgabeparameter im Geometrie-Shader haben. Erstellen Sie also einfach einige und fügen Sie Ihre Informationen darin ein, und der Pixel-Shader hat wie immer Zugriff darauf.
Nathan Reed
Ja, es war ziemlich einfaches Zeug (einige Licht-Shader, einige GPGPU) und vor vielen Jahren. Ok, lass mich das nachschlagen und nochmals jubeln, dass du mich in die richtige Richtung gelenkt hast.
Dr. ABT
Das Schreiben eines Pixel-Shaders, der Segmente zeichnet, ist ziemlich einfach. Ich denke, das Problem ist, dass Sie anfangen und uns zeigen müssen, was für Sie nicht funktioniert. Sie müssen x0, y0, x1, y1 übergeben (siehe Antwort)
AturSams

Antworten:

2

Siehe Pseudocode Überprüfen Sie zunächst, ob sich das aktuelle Pixel im Bereich befindet:

if(current.x >= - max_distance + min(x0, x1) && current.x =< max_distance + max(x0, x1))
{
    if(current.y >= -max_distance + min(y0, y1) && current.y =< max_distance + max(y0, y1))
    {
        result.color = some_color;
        float distance = simple_function_that_computes_distance_from_segment(x0, x1, y0, y1);
        if(distance < max_distance)    
            result.alpha = (max_distance - distance) / max_distance;
        else
            result.alpha = 0.0;
    }
}

Holen Sie sich ein Tutorial für einen generischen Pixel-Shader und schreiben Sie den Code neu. Um die Entfernung eines Punktes von einem Segment zu berechnen, können Sie googeln.

AturSams
quelle