我编写了一个简单的粒子类,用于存储粒子演示的位置,方向,速度,颜色等。每个粒子都是金字塔(4个三角形),并且在它的所有顶点都有一个颜色。
每一帧我循环所有粒子以找到他们的新位置等我需要每一个在屏幕上呈现它的特定颜色。到目前为止我知道如何做到这一点的方法是,为每个粒子的顶点颜色填充颜色缓冲区,将其绑定到属性并将其发送到着色器。
我就是这样做的:
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三元组来为整个粒子着色。顶点着色器为每个顶点获取颜色并将其发送到片段着色器。
现在,此代码插入到我的per-particle循环中会使帧减慢40 ms。没有它,我的帧时间为6毫秒,升高到45毫秒。
问题开始:
有没有办法发送单个颜色的每个基元/粒子为着色器内的整个事物着色(可能通过修改颜色缓冲区的数据结构或其他东西)? 此代码导致如此大的性能损失是正常的吗? 既然我是所有这一切的新手,你能指出我哪个电话有这么大的执行时间吗? 也许这是因为每个片段使用4个样本,除了为每个粒子发送大色缓冲到着色器之外?
注意:我正在测试512个粒子。我一直在改变代码几个小时,但在某些时候,我想想我确实有一个6毫秒的帧时间,512个粒子,50毫秒,2048个。我使用相同的颜色我在上面提供的缓冲区和属性绑定代码。
答案 0 :(得分:2)
是的,您可以使用3D矢量(例如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组件。