我编写了一个简单的粒子类,用于存储粒子演示的位置,方向,速度,颜色等。每个粒子都是一个金字塔(4个三角形),并且在所有顶点上都具有单一颜色。

在每一帧中,我都会循环所有粒子以找到其新位置等,并且我需要每一个粒子以其特定的颜色在屏幕上进行渲染。到目前为止,我知道该怎么做的方法是为每个粒子的顶点颜色填充颜色缓冲区,将其绑定(bind)到属性并将其发送到着色器。

这是我的方法:

GLfloat g_color_buffer_data[3*3*4];

for (int j = 0; j < 3*4 ; j++)
    {
        g_color_buffer_data[j*3]=particles[i].color.r;
        g_color_buffer_data[j*3+1]=particles[i].color.g;
        g_color_buffer_data[j*3+2]=particles[i].color.b;
    }


    // 2nd attribute buffer : colors
    glEnableVertexAttribArray(1);
    glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(g_color_buffer_data), g_color_buffer_data, GL_STATIC_DRAW);
    glVertexAttribPointer(
        1,                                // attribute. No particular reason for 1, but must match the layout in the shader.
        3,                                // size
        GL_FLOAT,                         // type
        GL_FALSE,                         // normalized?
        0,                                // stride
        (void*)0                          // array buffer offset
    );

这意味着我必须为每个粒子的所有12个顶点发送颜色,理想情况下,我只需要发送1个RGB三元组即可为整个粒子着色。顶点着色器为每个顶点获取一种颜色,并将其发送到片段着色器。

现在,此代码插入我的每粒子循环中会使我的帧速度降低40毫秒。没有它,我的帧时间为6毫秒,而现在上升到45毫秒。

问题开始:

有没有一种方法可以为每个基元/粒子发送单一颜色来着色着色器中的整个对象(可能是通过修改颜色缓冲区或其他内容的数据结构)?
这段代码造成如此大的性能损失是否正常?
既然我对所有这些都不熟悉,那么您能指出我哪个调用有这么长的执行时间吗?
可能是由于每个片段使用4个样本,以及为每个粒子发送大的颜色缓冲区到着色器而发生的吗?

注意:我正在测试512粒子。我一直在大约几个小时内更改代码,但是在更早的时候,我认为帧时间为6毫秒(带512个粒子),类似于50毫秒(带2048个粒子)。我使用的是相同的颜色缓冲区和属性绑定(bind)代码以上提供。

最佳答案

是的,您可以使用3D vector (例如glm::vec3)并将x,y,z分量用作rgb值。如果您使用glm::vec4,那么您也可以使用alpha值。

然后,您可以使用类似in vec3 in_colours;的代码将其发送到着色器,其中in_colours是代码中的glm::vec3。

    glm::vec3 in_colours= glm::vec3(r, g, b); // Will need to do in a loop or something for each particle, or add to a std::vector and send that to shader

    glUniform3fv(glGetUniformLocation(shader_program, "in_colours"), 1, glm::value_ptr(in_colours));

然后,在着色器中,您可以根据需要或整体访问x,y,z组件。

关于c++ - 每帧OpenGL彩色缓冲区会增加帧时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22450137/

10-10 21:21