2016-04-21 75 views
0

目前我有以下設置工作很好遠。頂點屬性 - 使用短而不是浮點的頂點位置

struct Vertex { 
    glm::vec3 position; 
    glm::vec3 normal; 
    glm::vec2 texCoord; 
} 
std::vector<Vertex> vertices; 

點 - 屬性:

glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*) offsetof(Vertex, Vertex::position)); 
glEnableVertexAttribArray(1); 
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*) offsetof(Vertex, Vertex::normal)); 
glEnableVertexAttribArray(2); 
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*) offsetof(Vertex, Vertex::texCoord)); 

現在我想通過改變頂點,以增加自己的表現屬性從浮短。 我試着從頂點位置開始。

OpenGL's Vertex Specification Best Practices告訴我這一點:

位置 [...] 要做到這一點,你重新排列你的模型空間中的數據,使所有的位置都裝在一個[-1,1]框周圍起源。您可以通過在所有職位中查找XYZ中的最小/最大值來完成此操作。然後,從所有頂點位置中減去最小/最大框的中心點;然後按最小/最大框的寬度/高度/深度的一半縮放所有位置。你需要保持中心點和縮放因子。 當你建立你的模型到視圖矩陣(或模型到任何矩陣)時,你需要在轉換堆棧的頂部應用中心點偏移和縮放(所以最後,在你繪製之前)。

我也看過這個Thread

這就是爲什麼我添加

vec4 rescaledPos = vec4(in_pos, 1.0) * vec4(halfAxisLengths, 1.0) + vec4(center, 0.0); 
gl_Position = P * V * M * rescaledPos; 

我的頂點屬性使用GL_SHORT,而不是該預處理步驟都映射到頂點[-1,1]

for (auto& v : vertices) { 
    v.position = (v.position - center) * halfAxisLengths; 
} 

和頂點着色器雷卡萊它GL_FLOAT,標準化設置爲GL_TRUE

glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_SHORT, GL_TRUE, sizeof(Vertex), (void*) offsetof(Vertex, Vertex::position)); 

因爲我剛剛得到三角形的混亂,但不是我的模型與增加的fps。

這是設置頂點屬性縮短的正確方法嗎?

或者我必須更改我的完整頂點結構嗎? 如果是,那麼做這件事的最好方法是什麼(帶短褲的glm向量?)。

一個可行的例子會很棒,我找不到任何東西。

+1

這是拋開問題,但你有沒有考慮過半浮體? – 2016-04-21 15:57:30

+1

@WilliamKappler是的,'GL_HALF_FLOAT'工作正常。但是我想使用'GL_SHORT' /'GL_UNSIGNED_SHORT'(尤其是texCoords)和'GL_INT_2_10_10_10_REV'來獲取法線。 –

+0

「*在頂點着色器中重新調整它*」爲什麼不把它放在矩陣本身中?這只是一個規模/翻譯。矩陣可以做到這一點。 –

回答

1

我調整爲頂點緩衝器中的數據結構:

struct newVertex { 
    GLshort position[4]; // for GL_SHORT 
    GLint normal; // for GL_INT_2_10_10_10_REV 
    GLshort texCoord[2]; // for GL_SHORT 
}; 

結果我得到〜20%的提高的性能。

0

或者是否必須更改我的完整頂點結構?

是的,OpenGL不會神奇地爲您做轉換。但如果性能是你的目標...

現在我想通過改變頂點屬性從浮動到短暫來提高我的表現。

這實際上會損害性能。 GPU優化用於將矢量處理爲浮點值。這反過來影響了存儲器接口,該接口旨在爲32位對齊訪問提供最佳性能。以16位短整數提交,你迫使當前的GPU系列執行次優的內存訪問和中間轉換步驟。

如果性能是您的目標,堅持單精度浮點數。如果你不相信我:評估它。

+0

我可以使用第四個向量組件填充32位?人[這裏](http://stackoverflow.com/questions/57188​​46/how-can-i-optimize-the-rendering-of-a-large-model-in-opengl-es-1-1/5721102) 和[這裏](http://stackoverflow.com/questions/1287811/what-does-the-tiler-utilization-statistic-mean-in-the-iphone-opengl-es-instrumen/1316494#1316494)獲得更多的性能通過使用短褲。我認爲傳輸內存的速度會更快,不是嗎? –

+0

「*如果你不相信我:基準測試。*」你是一個聲稱自然界可疑的人,這是在傳統智慧面前飛翔的。所以我會說舉證責任在你身上。但是你是對的,你必須填補這個位置成爲一個4元素的位置。但它仍然可以爲每個頂點節省32位。通過以10/10/10/2格式壓縮法線,並且紋理座標爲16位標準化短褲,您可以節省更多。這從每個頂點的32個字節到16個數據大小的一半。我很確定任何轉換步驟都會比內存訪問更快。 –

+0

@ Mr.X:OpenGL-ES!= OpenGL。在移動GPU上,就像在iPhone中發現的那樣,節省內存帶寬實際上會提高性能。 – datenwolf