使用SSBO中心的实例四元组

时间:2018-04-09 17:12:59

标签: opengl glsl

我正在创建一个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吗?

0 个答案:

没有答案