顶点属性 - 使用short而不是float来表示顶点位置

时间:2016-04-21 15:54:19

标签: c++ opengl glsl glm-math vertex-attributes

目前我有以下设置可以正常工作。

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's Vertex Specification Best Practices告诉我:

  

职位 [...]   为此,您需要重新排列模型空间数据,以便所有位置都打包在原点周围的[-1,1]框中。您可以通过在所有位置中查找XYZ中的最小/最大值来实现。然后从所有顶点位置减去最小/最大框的中心点;然后将所有位置缩放最小/最大框的宽度/高度/深度的一半。您需要保持中心点和缩放因子。   当您构建模型到视图矩阵(或模型到任意矩阵)时,您需要在变换堆栈的顶部应用中心点偏移和缩放(所以在绘制之前的末尾)。< / p>

我也读过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。

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

或者我是否必须更改完整的顶点结构? 如果是,那么最好的方法是什么(glm vector with shorts?)。

一个工作的例子很棒,我找不到。

2 个答案:

答案 0 :(得分:1)

我调整了顶点缓冲区的数据结构:

angular.module('myApp',[])
      .filter('customFilter', function ($sce) {
            return function (number) {
                if (isNaN(number) || number > 1) {
                    return number;
                } else {
                    if (number === 1) {
                        return $sce.trustAsHtml("&#x2714;");
                    } else if (number === 0) {
                        return $sce.trustAsHtml("&#x2718;");
                    }
                }
            }
        });

结果我的性能提高了约20%。

答案 1 :(得分:0)

  

或者我是否必须更改完整的顶点结构?

是的,OpenGL不会神奇地为你做转换。但如果表现是你的目标......

  

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

这实际上会损害性能。 GPU被优化用于处理向量作为浮点值。这又会影响存储器接口,该接口旨在为32位对齐访问提供最佳性能。 Bysubmitting为16位短整数,迫使当前的GPU行执行次优的内存访问和中间转换步骤。

如果性能是你的目标坚持单精度浮动。如果你不相信我:基准吧。