OpenGL:有效地计算转换矩阵

时间:2014-12-05 05:18:12

标签: c++ opengl matrix

所以,我要渲染一堆立方体;比如,屏幕上会立刻有数千个立方体。问题在于,计算每个立方体的每个帧的变换矩阵是非常有效的: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);
}

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

1 个答案:

答案 0 :(得分:0)

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

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

如果你需要进行每个实例的轮换,我建议传递一个四元数。