【问题标题】:OpenGL: efficiently calculating transformation matricesOpenGL:高效计算变换矩阵
【发布时间】:2014-12-05 05:18:11
【问题描述】:

所以,我正在渲染一堆立方体;就像,屏幕上会同时出现数千个立方体。问题在于为每个立方体计算每帧的变换矩阵,事实证明,效率不是很高: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);
}

基本上,我的问题是:如何有效地计算每个立方体实例的转换矩阵?

【问题讨论】:

  • 您认为为什么需要调整矩阵计算?你做过剖析吗?如果你愿意,你可能会感到惊讶。另一件事:你真的需要在每一帧都改变所有 10k 对象的变换吗?另外,使用 VAO。
  • 您能解释一下您所说的调整矩阵计算是什么意思吗?关于不需要每帧更改 10k 变换,您可能是对的,但我需要更改至少 1k 变换。我将实施 VAO。
  • 通过调整矩阵我的意思是你问的问题:“有效地计算转换矩阵”。请在进行任何优化之前profile
  • 不进行分析是徒劳的。

标签: c++ opengl matrix


【解决方案1】:

有一个操作会很慢:第一个 for 循环。而是将Commons::PERSPECTIVE_MATRIX 作为统一传递,而只是传递属性中的翻译部分。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    相关资源
    最近更新 更多