2011-08-19 131 views
3

我有一個帶有數千個頂點的OpenGL場景,並希望將它們作爲VBO/IBO傳遞。 執行glGetIntegerv(GL_MAX_ELEMENTS_VERTICES,& maxVertices)命令會顯示2048個最大頂點數的限制,儘管事實上我擁有最近的視頻卡。 除此之外,C中的數組僅限於int,因此最大爲32k頂點。OpenGL中的頂點限制

我該如何解決這些限制,無論如何顯示我的所有對象?

+0

C中的數組僅限於int嗎? – Flexo

+0

當我在括號內使用除整數之外的其他東西(例如MyArray [double_variable])時,它會告訴我「數組下標不是整數」。 –

+2

'double's不能是數組索引,但'long'可以。 「int」和「long」都是整數。在最近的視頻卡平臺上,'int'很少會小到16位。 – Flexo

回答

5

GL_MAX_ELEMENTS_VERTICES常量僅適用於glDrawRangeElements調用,即使此值大於此值也肯定不會使glDrawRangeElements慢於glDrawElements。將批次手動拆分成較小的部分並不是一個好主意,因爲批次應該儘可能大,並儘可能少地進行打電話。忘記這個價值,它已經沒有了真正的意義了。順便說一下,我很確定你的int可以保存比32k大得多的值,就像在現代平臺上(至少那些具有支持VBOs的圖形設備的那些),int至少應該是32位寬(和因此能夠保持像2G/4G這樣的值)。儘管在嵌入式設備上(使用OpenGL ES),您仍可能僅限於16位頂點索引。

+0

謝謝,但在C中的數組只接受一個整數作爲索引,因此32k元素。那麼我怎樣才能達到你的2M? –

+1

@Laurent就像我(和awoodland的評論)所說的那樣,在現代平臺上,一個'int'只有16位寬(這相當於+/- 32k範圍)在C中是不太可能的,它通常應該至少是32位寬(意思是+/- 2G範圍,不僅是2M)。你從哪裏得到關於「int」的信息只有16位? –

+0

謝謝,它開始慢慢對我有意義!我不知道我在哪裏得到這個32k的整數限制,也許在過去的確如此。我正在開發Cocoa/Xcode。無論如何,讓我試試int。 –

2

不是GL_MAX_ELEMENTS_VERTICES只是告訴你可以傳遞給glDrawRangeElements的單個調用的大多數頂點?你有沒有理由不能把你的場景分成幾個比特並逐個呈現比特?

+1

所以基本上我可以有一個30k元素的VBO例子,並使用glDrawRangeElement一塊一塊地傳遞它? –

+0

是的,我認爲是。請參閱文檔:http://www.opengl.org/sdk/docs/man/xhtml/glDrawRangeElements.xml爲了避免可能出現的性能下降,您只需要爲您使用的索引所處的位置劃定界限。 –

1

由2048把你的頂點的總數和創建比許多維也納組織

void glGenBuffersARB(GLsizei n, GLuint* ids) 

因此n將是(總/ 2048)1和IDS。將含有(總/ 2048)+1一個GLuint陣列

+0

謝謝。那麼我應該爲每個VBO執行glBindBuffer,glBufferData,glVertexPointer和glDrawElements,還是僅僅運行一次就足夠了? –