2010-11-22 66 views
2

我一直在掙扎了好幾天找到任何資源來幫我寫使用高級着色語言和DirectX 9託管庫一個簡單的光芒/模糊着色器。簡單的HLSL閃爍/模糊效果的DirectX9

所有我需要做的是有畫成簡單的線條CustomVertex.TransformedColored頂點,然後模糊/由HLSL效果閃着陣列。

...我已經尋找三天左右的互聯網現在一些成果,但我不能找到一個很好的教程或例子。我對HLSL有一個基本的瞭解,但我不明白如何編寫這個着色器(我已經閱讀了3本DirectX書中的HLSL章節)。

下面是一些(有刪節)代碼:

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(); 

我想我沒有那麼多尋找關於HLSL的特定部分的幫助下,給定的問題的數量,我將不得不代碼的數量發佈我真的只是尋找一些幫助尋找資源!

回答

6

我在代碼中看到的直接問題是,您正在將着色器應用於線條本身。像素着色器實際上並不這樣。您無法與被陰影處理的像素周圍的任何像素進行交互。所有你得到的是正在輸出的那個像素的寄存器(位置,顏色,紋理座標等)和採樣器(紋理)。

要解決這個問題,做一個模糊的效果(如發光或開花)的基本過程是繪製要模糊的渲染目標的情景。然後使用該渲染目標作爲您使用模糊着色器繪製的全屏幕四邊形上的紋理。一個簡單的模糊着色器需要從該紋理獲取多個樣本 - 每個樣本都具有略微偏移的紋理座標。結果是紋理的模糊圖像。

通常您會重複此過程(現在將渲染目標放在另一個渲染目標上),水平和垂直地進行一個模糊處理,以最少的數量進行模糊處理樣本。

我建議看XNA Bloom Sample。那裏有更多關於這個過程的文檔。雖然API是XNA,而不是DirectX,但它們非常相似,都使用HLSL。

+0

是的,我想我不太清楚。我意識到你所說的一切,我把紋理渲染成紋理,將它應用到四邊形,並用我的HLSL渲染四邊形。我想我正在尋找的是與之相伴隨的HLSL方面。 感謝Bloom Sample,我會研究它:) – tbridge 2010-11-23 00:24:46