Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL:高效计算变换矩阵_C++_Opengl_Matrix - Fatal编程技术网

C++ OpenGL:高效计算变换矩阵

C++ OpenGL:高效计算变换矩阵,c++,opengl,matrix,C++,Opengl,Matrix,所以,我渲染了一堆立方体;比如,屏幕上会同时出现数千个立方体。问题是,为每个立方体计算每一帧的变换矩阵并不是很有效:1000个立方体以54 fps的速度渲染,10000个立方体以6 fps的速度渲染。我需要能够改变这些变换矩阵,因为玩家将能够遍历它们 以下是我的渲染代码: void Tester::render() { for (int i = 0; i < numInstances; i++) transforms[i] = Commons::PERSPECTIV

所以,我渲染了一堆立方体;比如,屏幕上会同时出现数千个立方体。问题是,为每个立方体计算每一帧的变换矩阵并不是很有效:1000个立方体以54 fps的速度渲染,10000个立方体以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_矩阵作为一个统一的传递,并且只传递属性中的转换部分

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


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

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