2010-11-22 8 views
2

Ich habe seit Tagen gekämpft, um irgendwelche Ressourcen zu finden, die mir helfen, einen einfachen Glow/Blur Shader mit High Level Shader Language und DirectX 9 Managed Libraries zu schreiben.Einfacher HLSL Glow/Blur Effekt in DirectX9

Alles, was ich tun muss, ist ein Array von CustomVertex.TransformedColored Vertices als einfache Linien gezeichnet und dann durch den HLSL-Effekt verschwommen/leuchtet.

Ich habe das Internet für etwa drei Tage jetzt mit einigen Ergebnissen gesucht, aber ich kann einfach kein wirklich gutes Tutorial oder Beispiel finden. Ich habe ein grundlegendes Verständnis von HLSL, aber ich verstehe es nicht genug, um herauszufinden, wie man diesen Shader schreibt (ich habe das Kapitel HLLL auch in 3 DirectX-Büchern gelesen).

Hier einig (verkürzt) Code:

CustomVertex.TransformedColored[] glowVertices = new CustomVertex.TransformedColored[4]; 
glowVertices[0] = new CustomVertex.TransformedColored(random.Next(this.render.Width), random.Next(this.render.Height), 1, 1, Color.Cyan.ToArgb()); 
glowVertices[1] = new CustomVertex.TransformedColored(random.Next(this.render.Width), random.Next(this.render.Height), 1, 1, Color.Blue.ToArgb()); 
glowVertices[2] = new CustomVertex.TransformedColored(random.Next(this.render.Width), random.Next(this.render.Height), 1, 1, Color.Cyan.ToArgb()); 
glowVertices[3] = new CustomVertex.TransformedColored(random.Next(this.render.Width), random.Next(this.render.Height), 1, 1, Color.Blue.ToArgb()); 

this.device.BeginScene(); 
int passes = this.glowEffect.Begin(0); 
for (int i = 0; i < passes; i++) 
{ 
    this.glowEffect.BeginPass(i); 
    this.device.DrawUserPrimitives(PrimitiveType.LineStrip, glowVertices.Length - 1, glowVertices); 
    this.glowEffect.EndPass(); 
} 
this.glowEffect.End(); 
this.device.EndScene(); 

Ich glaube, ich bin für Hilfe zu einem bestimmten Teil von HLSL nicht so sehr suchen, da die Anzahl der Fragen und die Menge an Code ich hätte Post Ich suche wirklich nur Hilfe bei der Suche nach Ressourcen!

Antwort

6

Das unmittelbare Problem, das ich mit Ihrem Code sehe, ist, dass Sie einen Shader auf die Zeilen selbst anwenden. Pixel-Shader funktionieren nicht so. Sie können mit keinem der Pixel um das Pixel, das schattiert wird, interagieren. Alles, was Sie bekommen, sind Register (Position, Farbe, Texturkoordinate usw.) und Sampler (Texturen) für dieses eine Pixel, das ausgegeben wird.

Um dies zu umgehen, besteht der grundlegende Prozess zum Erstellen eines Unschärfeeffekts (z. B. für Glühen oder Bloom) darin, die Szene, die Sie unscharf machen möchten, auf ein Renderziel zu zeichnen. Verwenden Sie dieses Renderziel dann als Textur auf einem Full-Screen-Quad, das Sie mit einem Unschärfe-Shader zeichnen. Ein einfacher Unschärfe-Shader nimmt mehrere Samples aus dieser Textur - jede mit einer leicht verschobenen Texturkoordinate. Das Ergebnis ist ein verschwommenes Bild der Textur.

In der Regel wiederholen Sie diesen Vorgang (Rendering-Target-auf-Vollbild-Quad auf ein anderes Renderziel), wobei Sie eine Unschärfe horizontal und eine vertikal verwischen, um die geringste Unschärfe zu erzielen Proben.

Ich empfehle das Betrachten der XNA Bloom Sample. Es gibt eine umfangreichere Dokumentation über den Prozess dort. Während die API XNA ist, nicht DirectX, sind sie ziemlich ähnlich und beide verwenden HLSL.

+0

Ja, ich denke ich war nicht zu klar. Ich bin mir dessen bewusst, was Sie gesagt haben, ich rendere die Linien zu einer Textur, verwende sie auf ein Quad und rendere dieses Quad mit meinem HLSL. Ich denke, was ich suche, ist der HLSL-Aspekt, der damit einhergehen würde. Danke für die Bloom-Probe, ich werde es untersuchen :) – tbridge

+0

Das Beispiel erwies sich als sehr nützlich. Endlich ein einfaches/mächtiges HLSL-Beispiel, das keine hundert Zeilen-Shader hatte. – tbridge