2014-09-04 56 views
0

假設我正在渲染一個3d GL_TRIANGLE。該對象需要3個頂點來定義它:A,B,C。我將這些數據放入緩衝區,並通過glVertexAttribPointer將其綁定到着色器。OpenGL glVertexAttribPointer正常

現在我想在正常情況下傳遞給着色器。對於每個三角形,應該有1個法線向量,但如果我嘗試通過glVertexAttribPointer傳入,我需要爲點A,B,C定義相同的法線3次。 是否有可能在glVertexAttribPointer中每3個其他頂點傳入一個頂點以避免這種情況?

或者它是一個好主意,通過它的所有頂點?

+1

這並不容易。如果不同屬性的數組不匹配,則需要爲每個屬性指定單獨的索引數組以將屬性分配給頂點。這不支持。我在這裏回答了類似的問題,詳細闡述了這一點:http://stackoverflow.com/questions/25349620/use-one-gl-element-array-buffer-to-reference-each-attribute-from-0/25352461#25352461 。 – 2014-09-04 04:30:41

回答

2

現在我想正常傳遞給着色器。對於每個三角形,應該有1個法線向量

不,有3個法線。每個頂點一個。

是否有可能在glVertexAttribPointer中每隔3個頂點傳入1個頂點以避免這種情況?

不,因爲頂點屬性屬於一起,不能分開。

或者它是一個好主意,通過它的所有頂點?

當然。讓每個人都變得更加輕鬆。

+0

好的。也是最後一個小相關問題。我試圖使用一個元素緩衝區的高度圖(定義所有點一次,並繪製它們與GL_ELEMENT_ARRAY)。然而,似乎用這種方法沒有計算和將法線放入頂點緩衝區的空間。我將如何能夠存儲和通過這樣一個結構的正常? – sgtHale 2014-09-04 19:40:12

+1

@sgtHale:無論如何你都不想擁​​有臉部法線的高度圖。你需要每個頂點的法線,其中每個頂點的法線是頂點所在面的法線的平均值。 – datenwolf 2014-09-04 21:15:57

+0

@sgtHale:請注意,如果你想要一個平坦的陰影效果(這導致了一個多面的外觀),你可以指定,某些頂點屬性不應該在臉上插值;在該集合中,只考慮爲面部的第一個頂點指定的值。如果你仔細想想,頂點和麪之間有一個嚴格的偏移量,這意味着你可以簡單地將每個面的法向賦值給頂點,而事情按預期工作。 – datenwolf 2014-09-04 21:24:09