顶点属性 - 对顶点位置使用短点而不是浮点数
Vertex attributes - using short instead of float for vertex positions
目前我有以下设置,到目前为止工作正常。
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的顶点规范最佳实践告诉我:
职位 [...] 为此,请重新排列模型空间数据,以便将所有位置打包在原点周围的 [-1, 1] 框中。您可以通过在所有位置中查找 XYZ 中的最小/最大值来做到这一点。然后从所有顶点位置减去最小/最大框的中心点;然后将所有位置缩放最小/最大框的宽度/高度/深度的一半。您需要保持中心点和比例因子。 构建模型到视图矩阵(或模型到任意矩阵)时,需要在转换堆栈的顶部应用中心点偏移和缩放(因此在最后,就在绘制之前)。
我也读了这个线程。
这就是为什么我添加了这个预处理步骤,将所有顶点映射到 [-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矢量?
一个工作的例子会很棒,我找不到。
我调整了顶点缓冲区的数据结构:
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%的性能提升。
还是必须更改完整的顶点结构?
是的,OpenGL不会神奇地为您进行转换。但是,如果性能是您的目标...
现在,我想通过将顶点属性从浮点数更改为短线来提高性能。
这实际上会损害性能。GPU 针对将矢量处理为浮点值进行了优化。这反过来又会影响内存接口,该接口旨在为 32 位对齐的访问提供最佳性能。通过提交为 16 位短整数,您将强制当前 GPU 行执行次优内存访问和中间转换步骤。
如果性能是您的目标,请坚持单精度浮点数。如果你不相信我:基准测试它。
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 使用提升将数据从 PyObject 复制到浮点数 *
- 使用浮点数和双精度数的非常小数字的数学
- 使用英特尔内联函数将打包的 8 位整数乘以浮点数向量
- 如何在 c++ 中将小数点后两位数的浮点数分配给另一个浮点数
- 返回浮点数的小数位数
- txt 文件中浮点数的最大和最小值
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- 将浮点数转换为无符号字符数组并打印出来
- 如何将时间字符串 (M:SS) 转换为浮点数
- 如何将浮点数(*)[6]转换为浮点**类型?
- C++将浮点数乘以分数
- 如何将浮点数转换为uint8_t?
- 将字符串转换为浮点数或整数,而无需使用内置函数(如 atoi 或 atof)
- 如何在C++(Arduino)中将浮点数组转换为字节数组
- 在数学上将浮点数四舍五入到 N 位小数
- 将 std::顶点结构的矢量转换为浮点数*
- 顶点属性 - 对顶点位置使用短点而不是浮点数