2013-08-25 68 views
2

我正在使用C#,Monogame和XNA 4.0。在我的場景中,我有很多立方體。有些是連接的,有些不是。我想用另一個着色器渲染立方體的邊緣而不是填充。除此之外,我想用另一種顏色(或更厚)渲染連接立方體的外邊緣,而不是立方體對象內的邊緣。這是一幅小畫,用於表明我想要做什麼(抱歉我的繪畫技巧不好,但我認爲你會得到它)。如何渲染與填充XNA不同的立方體的特定邊緣? (Monogame)

Desired Results

  1. 我知道如何使一個立方體與特定的着色器,我也能夠呈現線框但我不能夠連接這兩種方法。貝斯德說,外線不能用這種方法呈現不同。

  2. 我喜歡漫畫着色器的edgefinding後的效果嘗試過,但在這種方式我不能只渲染特定的邊緣。除此之外,如果兩個立方體彼此相鄰,則着色器不能識別邊緣。

我不是搜索從您準備使用的解決方案,但我很高興能得到一些提示/方法/教程/類似項目的/ etc如何實現我的目標。那裏有一些着色專家嗎?我不知道該怎麼做。

(不過,若你想發佈一個準備使用的解決方案,我也不會米菲:d)

回答

0

這是你不使用延遲着色一個恥辱,這將是非常簡單的實現,如果你之前是。

如果您可以通過紋理查找訪問屏幕上每個像素的法線和材質,則可以輕鬆地對其進行後處理。您可以使用3x3濾波器內核並搜索足夠大的正常不連續點(這將捕捉輪廓邊),並搜索位於材質ID之間轉換的像素(這將捕獲藍色和橙色立方體之間的邊緣)。如果您的過濾器鄰域滿足這兩個條件中的任何一個,則繪製黑色像素以形成輪廓。

你應該可以,如果你使用MRT渲染要做到這一點,當你畫你的立方體,和正常+材料ID編碼爲RGBA紋理(X,Y,Z,材料)。

基本理論在this paper(第13頁)中描述。在這種情況下,您可以使用材質(或對象ID,如果您希望每個立方體都有輪廓),而不是將深度用作輪廓的次要特徵。

+0

謝謝你的回答,現在聽起來很複雜,但我會閱讀這篇論文,並試試儘量遠離工作崗位。在這種情況下我不明白 - 那麼我將如何呈現紅色輪廓呢?在着色器中,我不知道像素是在上邊還是在邊上。 – nidhoeggr09

+0

是的,這有點複雜。我傾向於使用圖像處理技術來解決這些問題,因爲我在延期着色方面工作如此沉重。至於爲不同的輪廓着色,這種方法的優點在於,在搜索過濾器中有兩個單獨的條件,您可以根據哪些條件通過,分配不同的顏色(或甚至是兩種顏色的組合)。 –

+0

由於您更喜歡着色與立方體/立方體邊緣不同的外部邊緣,因此我實際上建議您在紋理中使用眼睛空間深度和立方體ID。你仍然會尋找不連續性,它只是這兩個屬性可能會給你從你的樣本圖像的結果。 –