目前我有以下設置工作很好遠。頂點屬性 - 使用短而不是浮點的頂點位置
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向量?)。
一個可行的例子會很棒,我找不到任何東西。
這是拋開問題,但你有沒有考慮過半浮體? – 2016-04-21 15:57:30
@WilliamKappler是的,'GL_HALF_FLOAT'工作正常。但是我想使用'GL_SHORT' /'GL_UNSIGNED_SHORT'(尤其是texCoords)和'GL_INT_2_10_10_10_REV'來獲取法線。 –
「*在頂點着色器中重新調整它*」爲什麼不把它放在矩陣本身中?這只是一個規模/翻譯。矩陣可以做到這一點。 –