gpt4 book ai didi

openGL - 批量渲染 - 对象矩阵/等更新

转载 作者:行者123 更新时间:2023-12-04 08:06:52 25 4
gpt4 key购买 nike

我试图围绕一些 openGL 渲染选项。

现在我的 sudo 代码是这样的:

void paint() {
...
for (auto &obj:objList) {
obj.draw(matrix)
}
}


void draw(matrix &m){
shaderProgram->bind();
meshVao->bind();
meshVertex->bind();
meshIndices->bind();
shaderProgram->setUniformValue("mvp_matrix", m * getObjTrans());
shaderProgram->setUniformValue("un_color", QVector4D(1, 1, 1, 1));
shaderProgram->enableAttributeArray("position");
shaderProgram->setAttributeBuffer("position", GL_FLOAT, 0, 3);
glDrawElements(GL_TRIANGLES, mMeshData->mIndices.size(), GL_UNSIGNED_INT, 0);
}

现在这只是将每个对象一一绑定(bind),设置其矩阵并绘制它。它相当无用,可以说 5-20k + 对象。

现在我最近在阅读,据我所知,我还可以将所有对象数据加载到 1 个 VAO 下的 1-2 个 VBO 中,然后在 1 个调用中将它们全部绘制出来。因此,如果我将所有索引放入 1 个向量,并将所有顶点放入 1 个向量,然后我可以仅绑定(bind)这 2 个 vbo 对象并在 1 个调用中绘制所有对象。我试图理解的问题是,如何为向量中的每个对象传递一个矩阵?
在上面的函数中,我在绘制之前将一个矩阵传递给每个 obj,但是如果我的所有对象都在 1-2 个向量中,我如何分别将矩阵传递给它们?

最后一个粗略的想法是创建一个向量矩阵。并将所有矩阵传递给该 1 向量并将其传递给片段/像素着色器。然后在那里有一个偏移计数器,然后每个下一个对象渲染,只需执行 matrix[offset*16]这将为我提供该对象的矩阵。一旦到了那里,我所需要的就是 matrix[offset*16]直到 matrix[offset*16+16]让所有 16 个浮点数创建矩阵并用于绘制对象?

这是正确的方向吗?

最佳答案

看看Approaching Zero Driver Overhead (ADZO) techniques .特别是看一下 ARB_multi_draw_indirect (自 OpenGL 4.3 起成为核心)和 ARB_shader_draw_parameters (自 OpenGL 4.6 以来的核心)。后者会给你一个gl_DrawID顶点着色器的输入,可用于索引 UBO、SSBO 或 TBO,其中包含模型矩阵、纹理阵列层、 Material 等每个对象的数据。

对于 gl_DrawID 的情况不可用(GL 4.6 支持目前不普遍),有一个相对聪明的解决方法: http://www.g-truc.net/post-0518.html .通过使用 glglVertexAttribDivisor为 1 时,单个属性值用于一个实例的所有数据 - 非实例绘图调用被定义为等同于实例计数为 1 的实例绘图调用- 所以你在那个特定的绘图调用中为所有顶点获得相同的值。这样,你只需要一个相对较小的缓冲区,每个对象只有一个 ID,你不必为对象的每个顶点复制它。并且使用多绘制间接调用,您可以指定许多只使用单个实际绘制调用的调用。

关于openGL - 批量渲染 - 对象矩阵/等更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53894871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com