2009-06-25 128 views
1

我有一個簡單的應用程序,我需要讓用戶選擇一個着色器(.fx HLSL或程序集文件,可能有多遍,但只有所有像素着色器)並預覽它。DirectX後期處理着色器

應用程序運行,着色器列表出現,並且一個按鈕啓動「預覽窗口」。 從這個預覽窗口(裏面有一個DirectX視口),用戶選擇一個圖像,着色器在該圖像上運行並顯示。只需渲染一個幀(不是實時的)。

我有一個頂點/像素着色器組合設置,需要一個四邊形並將其渲染到屏幕上,並使用所選圖像進行紋理化。這工作完美。 我需要在第一個效果的輸出上運行另一個效果,純像素着色器,並將最終圖像(後處理)顯示在屏幕上。這根本不起作用。

我已經嘗試了幾天,以獲得它的工作,但沒有明顯的原因,相同的代碼塊用於呈現每個效果只呈現第一個。我可以在第一個着色器文件中添加第二個着色器文件作爲第二遍,並且它可以完美運行(儘管完全無法實現預覽用戶創建的着色器的目標)。當我嘗試使用第二個效果(加載和編譯很好)時,它什麼都不做。 我已經將第一個着色器的結果(使用GetRenderTargetData)並將它們放置在紋理表面(destTex和destSur)中,然後將該紋理設置爲第二遍的輸入(使用dev-> SetTexture和後來的效果 - > SetTexture(「thisframe」,destTex))。

所有調用都成功,效果編譯,紋理加載,四邊形繪製,但效果不可見。 我最初懷疑該設備(使用軟件頂點處理創建)導致了這個問題,但似乎並非如此(我嘗試使用硬件並混合使用)。 此外,使用HAL和REF設備(不是問題,因爲該應用程序不是實時的),第二個着色器不可見。 一切都是用C++編寫的Direct3D 9.

回答

1

嘗試在每次渲染四邊形後清除深度模板緩衝區。

0

爲了讓像素着色器運行,必須有某種頂點輸入和頂點處理(固定功能或着色器)。你是否提供了頂點着色器,如果是的話,你確定它做了像素着色器的期望?你的平局看起來像什麼?

當您試圖使用用戶效果時,可能需要查看應用的PIX跟蹤以查看設備狀態。

1

首先創建一個紋理,然後將第一個着色器直接渲染到該紋理中。最後渲染帶紋理的第二個着色器作爲Backbuffer的輸入。