2012-09-07 24 views
1

我對3D開發比較陌生,目前使用ActionScript,Stage3D和AGAL進行學習。我正在嘗試創建一個帶有平坦陰影的簡單程序網格的場景。然而,我被困在我應該如何將表面法線傳遞給照明着色器。我真的很想爲每個三角形使用一個單一的曲面法線並做平整,甚至爲每個三角形着色。我知道用每個頂點的法線很容易達到更好的照明效果,但這是我追求的樣子。簡單的平面着色使用Stage3D/AGAL

由於着色器通常會處理每個頂點,而不是每個三角形,所以我可能只通過每個三角形的單個法線,而不是每個頂點一個?我的想法完全離開這裏嗎?如果任何人有一個簡單,平坦的陰影的工作示例,我將不勝感激。

+0

陰影依賴於每個像素的法線,它本身取決於您使用的插值方法。我不知道你使用的技術,我只能給你一個提示。你想要的只是一個插值,它爲每個像素取三角形頂點的平均值。 – Yno

+0

好的,有道理。我認爲現在對我來說這個問題更加清楚:鑑於片段着色器處理法線的方式,如果我想要有平坦的陰影(每個面的一種顏色,沒有漸變),我需要確保我的頂點沒有在三角形之間共享?就目前而言,我正在分享頂點。如果我複製頂點以便共享頂點,那麼我可以確定每個頂點上的每個三角形都具有相同的法線,從而消除了像素間發生的任何插值。 –

+0

複製頂點是可行的,但使用適當的插值是一種可行的方法。 – Yno

回答

2

我在這裏挖掘一個老問題,因爲我偶然發現它通過谷歌,可以看到沒有接受的答案。

Stage3D沒有與其着色引擎等價的「GL_FLAT」選項。這意味着片段着色器程序總是從三個頂點程序的輸出中接收到一個「變化的」或插值的值(通過頂點程序)。如果你想扁的陰影,你已經基本上只有一個選項:

創建每個三角形的三個獨特的頂點,並設置正常 每個頂點的面法線的三角形。這樣,每個頂點 將計算相同的光照併產生相同的頂點顏色。 當片段着色器插值時,它將內插三個相同的值,產生平坦的陰影。

這真是蹩腳。每個三角形的唯一頂點要求意味着您不能在三角形之間共享頂點。這肯定會增加您的頂點數量,導致VertexBuffer3D上傳過程中的延遲以及整體較低的幀速率。但是,我還沒有在任何地方看到更好的解決方案。

相關問題