2011-12-10 34 views
0

我在應用程序中使用了各種「嵌套」上下文(用於着色器和幾何共享),所以我不能使用VAO,因爲它們不能在上下文之間共享。沒有VAO的每個着色器屬性的VBO或不同的方法?

我的網格數據被存儲在一個VBO作爲一種獨特的頂點的「池」,而在另一個VBO我存儲彌補臉上的指標。我目前在我的CAD應用程序中成功地使用了線框渲染,但我想添加一個平坦的陰影模式 - 爲此我需要臉部法線。

如果我需要頂點法線,我只是將數據附加到頂點位置數據,但是我不能這樣做,因爲根據頂點屬於哪個面被渲染,頂點將具有不同的面。理想情況下,我想創建另一個維持我的臉部法線和指數的VBO對,但是我不能將兩個VBO綁定到同一個目標,即使它們用於不同的屬性。

我明白,正常的途徑是使用沒有讓你指定多個駐國際中心組織到同一個目標進行VAO,而是因爲我的幾何背景是共享的,VAOs不是我不能使用它們。這個問題有其他解決方案嗎?

回答

4

如果我需要頂點法線,我只是將數據附加到頂點位置數據,但我不能這樣做,因爲頂點根據它屬於哪個面而具有不同的面常態渲染。理想情況下,我想創建另一個維持我的臉部法線和指數的VBO對,但是我不能將兩個VBO綁定到同一個目標,即使它們用於不同的屬性。

您的問題無關VAOs或緩衝對象。 VAO不允許你有多個索引列表。他們不允許你「面對正常」。

一個vertex array objects無非是存儲頂點屬性綁定一個容器更容易。他們不能讓你去做任何你離不開它們的事情;只需要一種方便的方法來更改所有屬性綁定。

您需要打破你的頂點位置分成不同的面孔。所以你需要重複位置值,以便每個唯一的位置/正常對是正確的唯一。 VAO不會繞過這個限制。

FYI:VAOs不共享的原因是因爲他們太簡單打擾共享。您可以輕鬆地在兩種不同的上下文中設置相同的VAO。只要在你想使用它的上下文中創建一個VAO,並按照你通常的做法來設置它。這只是一個簡單的狀態對象;它並不包含任何東西。

+0

感謝您的快速回答。我懷疑這可能是這種情況,但是我拋出的是OpenGL Superbible 5ed中的一個部分''當前綁定緩衝區的記錄是在當前VAO中創建的,並用於該屬性。也就是說,glVertexAttribPointer不僅告訴OpenGL在緩衝區中可以找到頂點屬性的偏移量,但它也告訴OpenGL哪個緩衝區包含數據,因此可以使用多個緩衝區 - 每個屬性一個 - 同時...「'。這讓我感到困惑,因爲綁定一個緩衝區到一個綁定目標,解除綁定舊的緩衝區。 – cmannett85

+0

@ cbamber85:的確如此。但是你使用不同緩衝區對象的事實並不意味着你使用不同的索引來訪問它們。對於多個屬性使用相同的緩衝區和爲多個屬性使用多個緩衝區之間沒有功能差異。唯一的區別是屬性數據來自何處。 –

+0

啊,這是有道理的,並完全與我所看到的。 – cmannett85

相關問題