2014-11-13 38 views
0

因此,我正在研究OpenGL ES 2.0地形渲染程序。 我有奇怪的繪圖發生在脊頂部。我猜這是由於曲面法線沒有被應用。表面法線OpenGL

所以,我計算了法線。 我知道在其他版本的OpenGL中,您可以激活普通數組並將其用於剔除。 要在OpenGL ES中使用法線,我可以只激活法線,還是必須在着色器中使用光照算法?

謝謝

+0

你能提供任何截圖嗎? – Tommy

+0

在SO上,計算機圖形學更多是一個利基。然而,一張圖片可能會告訴經驗豐富的開發者一千多字。 –

回答

0

OpenGL不使用法線進行剔除。它根據投影的三角形的頂點是順時針還是逆時針排列來進行剔除。具體的決定是基於(i)你認爲哪種方式被認爲是前面通過glFrontFace; (ii)您要求通過glCullFace撲滅哪個前向和/或後向三角形;和(iii)是否通過glEnable/glDisable啓用剔除。

剔除在ES 1.x和2.x中都是相同的。這是一個固定的硬件功能。它是可編程管線的外部(並且實際上,在ES 2.x可編程管線內很難再現,因爲沒有每個三角形忽略的着色器)。

如果您沒有啓用剔除功能,那麼您更有可能看到在脊處的深度緩衝區戰鬥,因爲其背對着相機的臉部以及正面對着相機的臉部具有非常接近的深度脊和有限的精度會使它們無法正確區分。

ES 1.x中的照明從法線計算。每頂點照明會在硬脊上產生奇怪的問題,因爲頂點的法線通常是在頂點處連接的面的法線的平均值,例如,形狀像\/\/\/\/\的固定網格在每個頂點處以完全相同的法線結束。但是如果你不使用1.x,那就不會發生什麼。

要在ES 2.x中實現照明,您需要在着色器內執行此操作。由於這個原因,法線沒有用於任何其他目的,所以沒有正式的方法來將法線指定爲任何特殊的東西。它們只是另一個頂點屬性,您可以隨意使用它們。

+0

我正在使用ES 2.0。我確實啓用了淘汰,並且我的收貨順序很好。有趣的是,在1.0的照明是從法線計算。我聽說過一些關於Z戰鬥的問題,這可能是一個問題。 – Fra

+0

...在這種情況下,後續問題是您的投影矩陣是否儘可能使用可用的深度範圍,如果您正在做地形,是否以足夠規則的方式排列(例如,它的高度地圖),您可以在沒有深度緩衝區的情況下正確渲染它。如果是這樣,那麼最聰明的事情可能是用正確的值填充深度緩衝區,然後用稍微的偏移量進行背對背渲染。所以前面仍然透支的地方有模棱兩可的地方,但是啓動會希望丟棄大部分昂貴的片段計算。 – Tommy

+0

(在真實繪製過程中禁用了深度寫入功能,因此您可以按照慣例渲染非地形對象) – Tommy