2011-05-07 46 views
5

我正在使用OpenGL ES 1.1,並將從Blender的OBJ導出轉換爲包含頂點數據的一些二進制文件。我其實已經有了一個工作工具,但我正在努力改變一些事情並且遇到一個問題。OBJ格式和平VS光滑底紋

即使使用平滑陰影,似乎使用正確的法線(垂直於臉部平面),它可以獲得臉部的平整外觀。啓用平滑着色和正確的法線(只需通過在Blender中標記爲尖銳的邊緣和應用了邊緣分割修改器),就可以獲得平滑部分和銳利邊緣的效果。

我要去哪裏帶來2個問題。

  1. 是「S 1」或「S關閉」,其中平滑的或平坦的陰影在OBJ文件從一個平滑陰影和使用法線的角度來看的完全不必要表示行?

  2. 當在OpenGL中實際設置爲平面着色時,是否完全忽略了法線(或者只是假設所有都垂直於面)?

回答

9

要使頂點看起來平滑,其法線必須是相鄰面法線的平均值(或類似的東西),但不垂直於面平面(除非您已將所有相鄰面的平均面)。 GL_FLAT意味着,臉部的顏色不是在三角形內插的,而是從單個三角形角落(不知道是哪個,第一個還是最後一個)。這種顏色來自頂點顏色或頂點光照,所以實際上你可以得到每個面的法線,但這並不一定是面的方向,而是角頂點的法線。

如果您在OBJ文件中獲得了每個頂點法線,則不需要s部分。但您可以使用這些來計算頂點法線。 s部分是平滑組,並被解釋爲32位位域。所以實際上有32個不同的平滑組,每個面都可以是多個平面組的一部分。因此,在「5」行之後的所有面都是平滑組1和3(設置的第一和第三位)的一部分。當兩個相鄰的面是同一平滑組的一部分時,它們之間的邊是平滑的(頂點共享法線)。這樣你就可以重建必要的每頂點法線。

+0

OBJ規範中沒有任何內容說平滑組應該被解釋爲位掩碼,但是以這種方式使用它們非常方便,所以我可以明白爲什麼遊戲引擎可能會以這種方式對待它們。 – ideasman42 2013-08-26 21:14:18

+0

@ ideasman42嗯,也許我從3DS格式中得到了這個,因爲它們肯定是以這種方式使用的。當把他們作爲光滑的組ID時,你不能讓一個臉部屬於多個組。 – 2013-08-26 21:23:43

+1

不應該在5號線之後的所有面都是平滑組1和3的一部分,而是平滑組1和4。 – PinkTurtle 2016-02-09 13:53:21

1

更改gl_flat和gl_smooth之間的模式似乎不影響我使用每個頂點法線時的渲染效果。我可以告訴你的問題是每個人臉只有一個正常人。爲了平滑着色,每張臉應該有三個法線,每個頂點一個,它們應該都是不同的。例如,圓柱體的法線如果投影到圓柱體內部,則應該全部相交於圓柱體的軸線。如果您的模型具有平滑法線,則應該按照頂點法線輸出OBJ導出。這聽起來像你可能分配每個臉部法線。就OpenGL-ES中的渲染而言,不使用平滑組,僅使用法線。