繁体   English   中英

顶点属性-在顶点位置使用short而不是float

[英]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));

现在,我想通过将顶点属性从float更改为short来提高性能。 我试图从顶点位置开始。

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。

这是将顶点属性设置为short的正确方法吗?

还是我必须更改完整的顶点结构? 如果是,执行此操作的最佳方法是什么(带有短裤的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不会神奇地为您完成转换。 但是,如果性能是您的目标……

现在,我想通过将顶点属性从float更改为short来提高性能。

这实际上会损害性能。 GPU已针对将向量作为浮点值进行了优化。 这反过来会影响内存接口,该接口旨在为32位对齐的访问提供最佳性能。 通过提交16位短整数,您可以强制当前的GPU行执行次佳的内存访问和中间转换步骤。

如果您的目标是性能,则坚持单精度浮点数。 如果您不相信我:请进行基准测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM