2012-10-29 51 views
2

我想寫一個片段着色器來渲染閃電對象,但不使用gl_Normal;所以我必須自己計算正常。在沒有glNormal的片段着色器中計算法線

我想我可以使用函數dFdx和dFdy找到兩個切向量,然後用這些向量積得到法線。

但我不知道發送給那些函數的參數。

+0

你需要每像素平滑正常,還是每個臉? – zacaj

回答

4

我想我可以使用函數dFdx和dFdy找到兩個切向量,然後用這些向量積得到法線。

如果你這樣做,你只會得到正常面部。如果你正在進行分面渲染,那會很好。並且「發送到這些函數的參數」將是片段的位置,無論您在哪個空間進行光照處理。因此顯然,頂點着色器需要計算該片段並將其傳遞給片段着色器。

對於本文的其餘部分,我假設你是而不是做分面渲染。你想要光滑的法線近似光滑的表面。

這樣法線的整點是,它們所代表的實際表面您的多邊形網格是逼近。所以如果你有一個球體,無論你有多少個頂點,每個頂點位置的法線總是應該直接指向球體的中心。

你不能魔法這樣的法線成爲;你必須根據實際表面或啓發式來計算它們。啓發式方法需要查看當前周圍的三角形。片段着色器無法訪問該信息。

每個人都使用頂點法線;這是標準做法。甚至還有特殊的頂點屬性格式來最小化這種法線的大小(最突出的是GL_INT_2_10_10_10_REV)。所以只要做對了。