gpt4 book ai didi

c++ - 如何渲染大量相似的物体?

转载 作者:行者123 更新时间:2023-11-30 02:36:05 25 4
gpt4 key购买 nike

我有大量对象(至少 10 000 个粒子),例如三角形、正方形、圆形或球体。实际上,现在我有一个对象,我渲染了很多次。它看起来像这样:

for (int i=0; i<totalParticleCount; i++) {
drawObject->pos = hState[i].pos;
drawObject->draw(vp);
}

我的 Circle 对象的绘制函数如下所示,其中变量“vp”是投影矩阵在 View 矩阵上的乘积:

void Circle::draw(const glm::mat4 &vp) {
glUseProgram(programId);
glUniformMatrix4fv(matrixId, 1, GL_FALSE, &(vp * getModelMatrix(pos, scale))[0][0]);

glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

glDrawArrays(GL_TRIANGLE_FAN, 0, vertexNumber);
glDisableVertexAttribArray(0);
}

我发现我的渲染过程太慢了。如何提高渲染性能?如何有效地使用 opengl 渲染相似的对象?

最佳答案

  1. 分解出着色器绑定(bind)和解除绑定(bind)。绑定(bind)着色器一次,绘制使用该着色器的所有内容,然后解除绑定(bind)。按着色器对对象进行分组。如果你有一个更复杂的 Material 系统,你会想要一次绘制所有具有相同 Material 属性的东西(例如像纹理和照明组件这样的制服)。当你在做的时候,保留顶点属性的绑定(bind),只有在你完成后才关闭它们。所有这些都最大限度地减少了您执行的 OpenGL 调用次数。

  2. 如果可以,请将您的几何体打包到最佳大小的 VBO 中(这应该因您的 GPU 而异)。我怀疑您可以将所有形状按顺序打包到一个缓冲区中,然后使用偏移量来选择要绘制的形状。这将为您节省一个 VBO 开关。

  3. 如果您要多次绘制相同的东西,请考虑 instanced rendering

  4. 如果您要多次绘制很多东西,请将它们分成类似类型的批处理。

  5. 如果您正在尝试制作粒子系统,请考虑制作一个 GPU particle system .位置和速度等粒子属性存储在纹理中,然后片段着色器在每次绘制调用时更新这些属性。更新后,一长串索引((u,v) 坐标)作为顶点数据传入,用于索引粒子纹理以检索数据。然后每个粒子在几何着色器中变成三角形或四边形,最后渲染到屏幕上。

关于c++ - 如何渲染大量相似的物体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33162842/

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