OpenGL:高效计算变换矩阵

OpenGL: efficiently calculating transformation matrices

本文关键字:变换 计算 高效 OpenGL      更新时间:2023-10-16

所以,我渲染了一堆立方体;就像,屏幕上会同时有数千个立方体。问题在于,事实证明,计算每个立方体的每一帧的转换矩阵并不是很有效:1,000 个立方体以 54 fps 渲染,10,000 个立方体以 6 fps 渲染。我需要能够更改这些转换矩阵,因为玩家将能够遍历它们。

这是我的渲染代码:

void Tester::render()
{
    for (int i = 0; i < numInstances; i++)
        transforms[i] = Commons::PERSPECTIVE_MATRIX * translations[i];
    glBindBuffer(GL_ARRAY_BUFFER, m_transformationMatrixBuffer);
    glBufferData(GL_ARRAY_BUFFER, numInstances * sizeof(glm::mat4), &transforms[0], GL_DYNAMIC_DRAW);
    for (int i = 0; i < 4; i++)
    {
        glVertexAttribPointer(MVP_LOC + i, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4), (const void*)(sizeof(float) * i * 4));
        glEnableVertexAttribArray(MVP_LOC + i);
        glVertexAttribDivisor(MVP_LOC + i, 1);
    }
    glDrawElementsInstanced(GL_TRIANGLES, m_numIndexDataElements, GL_UNSIGNED_SHORT, 0, numInstances);
}

基本上,我的问题是:如何有效地计算每个多维数据集实例的转换矩阵?

有一个操作会很慢:第一个 for 循环。 相反,只需将Commons::PERSPECTIVE_MATRIX作为统一传递,并且仅传递属性中的翻译部分。

然后在顶点着色器中,将它们相乘,然后应用于顶点。

如果您还需要每个实例的旋转,我建议您为此传递一个四元数。