我编写了一个简单的粒子类,用于存储粒子演示的位置,方向,速度,颜色等。每个粒子都是一个金字塔(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/