2014-12-05 87 views
0

所以,我渲染了一堆立方体;就像,屏幕上会立刻有成千上万的立方体。问题是,计算每个立方体的每个帧的转换矩阵,结果并不十分有效:1,000个立方体以54 fps呈现,10,000立方以6 fps呈现。我需要能够改变这些转换矩阵,因为玩家将能够遍历它们。OpenGL:高效地计算变换矩阵

这里是我的渲染代码:

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); 
} 

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

+0

为什么你认为你需要调整矩阵计算?你有没有分析?如果你愿意,你可能会感到惊讶。另一件事:你是否真的需要改变每一帧所有10k对象的变换?另外,使用VAO。 – Drop 2014-12-05 05:35:57

+0

你能否通过调整矩阵计算来解释你的意思?你可能没有必要改变每帧10k的变换,但我需要改变至少1k的变换。我会实施VAO。 – hacksoi 2014-12-05 06:05:35

+0

通过调整矩阵我的意思是你问的问题:“高效地计算变换矩阵”。在进行任何优化之前请[profile](http://en.wikipedia.org/wiki/Profiling_%28computer_programming%29)。 – Drop 2014-12-05 06:21:40

回答

0

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

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

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