我正在创建一个GPU粒子系统。我使用计算着色器来平滑存储在SSBO中的粒子:
// Storing x y and z although only looking at 2D for now
float pos[3 * NUM_PARTICLES] // { x1, y1, z1, ... xn, yn, zn }
我还有一个包含基数x,y
的VBO,用于四边形的四个顶点
float vert[4 * 4] = { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f };
即。当我的MVP将[0 1]映射到完整视口时,四边形填充视口。
我想使用glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, NUM_PARTICLES)
,而不是使用存储在VBO中的每个实例数据并使用glVertexAttribDivisor
设置它们,因为我想直接为每个实例使用SSBO中的数据。我最初的想法是修改顶点着色器,如下所示:
#version 430 core
// Inputs of the quad (triangle strip) to render
uniform mat4 mvp;
in vec2 inPos;
// Position of particles and hence quad centres
layout(binding = 7) buffer particlePosBlock
{
float pos[ ];
};
void main()
{
// Get quad centre for this instance as a vec2
vec2 quadcentre = vec2(pos[0 + gl_InstanceID * 3], pos[0 + gl_InstanceID * 3]);
// Scale and shift the vertex positions from the base quad data
gl_Position = mvp * vec4(inPos, 0.0, 1.0);
}
但是如何修改gl_Position
值以根据SSBO数据缩放和移动实例?我假设某种矩阵变换?还会像这样杀死性能索引到SSBO吗?