2012-12-07 65 views
4

如果我使用定點(或用1描述最小遊戲單元的整數)來描述我的頂點向量,我如何設置OpenGL/eigen轉換來處理它?如果我這樣做,我的頂點着色器:使用頂點着色器的定點運算

gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(in_Position, 1.0) 

如果我在傳遞IN_POSITION作爲GL_INT的VEC 3,我過去在矩陣作爲GL_FLOAT MAT4,將適當的鑄造做些什麼呢?是否有性能成本?

是否有可能準備我的轉換矩陣也是定點的?

這是一個2D遊戲,我認爲它比3D更可行。我真的更喜歡精確度,因爲當事情遠離原點時,似乎在大地圖上的位置已經退化。我意識到我可以逃脫只有對象位置是一個整數,而頂點仍然被描述爲浮動。但是,我認爲我的碰撞方案可以更好地處理定點頂點。性能差異通常是什麼?

回答

0

好的,經過一番實驗,我已經解決了一個解決方案。

gl_Position = projviewMatrix * vec4(ivec3(in_Position - camera), 1.0); 

camerauniform uvec3,和in_Positionuvec3位置輸入。翻譯是作爲一個單獨的操作來執行的,而視圖縮放,旋轉和投影是通常使用浮動(projviewMatrix)的mat4完成的。

必須注意確保使用正確的類型和輸入命令(glVertexAttribIPointer)。 OpenGL似乎非常渴望轉換爲浮點數,但將數據保留爲整數類型,因此任何小錯誤都會導致輸入錯亂。

在定點執行projviewMatrix乘法根本不可行,因爲您無法訪問用於乘法的中間64位存儲。只有當in_PositionprojviewMatrix使用的位數總和爲32時,它纔會接近可用性,但考慮到渲染的座標將非常接近原點,並且不會獲得額外的操作(在乘法之後仍然需要轉換,GPU將花費更長的時間作爲整數浮動),沒有理由在位置被攝像機居中後執行定點算術。

當然,這是無視皇室的痛苦,它實際上是操縱整數位置數據。我真的不會推薦它。

1

這將意味着一個int浮點轉換,將懲罰你的表現。你應該在CPU上將vec3投影到GPU拷貝時間。如果您使用Matrix對象,將它們存儲在CPU,你可以丟掉。

MatrixXf data_as_float = data_as_int.cast<float>(); 

然後調用glBufferData與data_as_float。