【发布时间】:2016-08-14 23:01:19
【问题描述】:
目前我有以下设置,目前运行良好。
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。
这就是为什么我添加了这个预处理步骤,将所有顶点映射到 [-1,1]
for (auto& v : vertices) {
v.position = (v.position - center) * halfAxisLengths;
}
并在顶点着色器中重新调整
vec4 rescaledPos = vec4(in_pos, 1.0) * vec4(halfAxisLengths, 1.0) + vec4(center, 0.0);
gl_Position = P * V * M * rescaledPos;
我的顶点属性使用GL_SHORT而不是GL_FLOAT,并且规范化设置为GL_TRUE:
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_SHORT, GL_TRUE, sizeof(Vertex), (void*) offsetof(Vertex, Vertex::position));
结果我只是得到一个三角形的混乱,但不是我的模型增加了 fps。
这是将顶点属性设置为短的正确方法吗?
或者我是否必须更改我的完整顶点结构? 如果是,那么最好的方法是什么(带短裤的 glm 向量?)。
一个可行的例子会很棒,我找不到。
【问题讨论】:
-
这个问题暂且不论,但你考虑过半浮动吗?
-
@WilliamKappler 是的,
GL_HALF_FLOAT工作正常。但我想使用GL_SHORT/GL_UNSIGNED_SHORT(特别是对于texCoords)和GL_INT_2_10_10_10_REV作为法线。 -
"recale it in the vertex-shader" 你为什么不把它放在矩阵本身呢?这只是一个比例/翻译。矩阵可以做到这一点。
-
我会这样做的。现在我处于“只是测试”状态。
标签: c++ opengl glsl glm-math vertex-attributes