使用玩具计算着色器生成点

时间:2016-07-09 00:36:30

标签: c++ opengl shader compute-shader

我正在使用我的第一个计算着色器,并且我想使用它生成点作为更大项目的一部分,但我似乎错过了一些东西。

如何让一切变得美好?

这是我的计算着色器代码(在指定版本450之后):

struct point {
    vec3 p;
    float padding;
    vec4 c;
};

layout(std140, binding=4) buffer particlebuffer{
      point pt[];
};

void main() {
     int index = int(gl_GlobalInvocationID);
     pt[index].p = vec3(index/50,index/50,index/50);
     pt[index].c = vec4(1.0, 0.0, 0.0, 1.0);
}

(我在某处读到计算着色器最适合包含填充的结构。)

我还有一个顶点和片段着色器,我在实际点上测试过,称为shaderProgram。我知道shaderProgram适用于我的mvp矩阵。

这是我的顶点着色器:

uniform mat4 mvp;

layout (location = 0) in vec3 position;

in vec4 color;
out vec4 vertcolor;

void main()
{
    gl_Position = mvp * vec4(position, 1.0f);
    endcolor = color;
}

这是我的碎片着色器:

in vec4 vertcolor;
out vec4 finalcolor;

void main()
{
    finalcolor = vertcolor;
}

我的着色器编译时没有任何问题。在使用顶点着色器中的计算着色器缓冲区数据阅读this后,我编写了以下代码来初始化GL_SHADER_STORAGE_BUFFER以保存生成的点,以及VAO来接收这些点:

glGenBuffers(1, &particlebuffer);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, particlebuffer);
glBufferData(GL_SHADER_STORAGE_BUFFER, 8 * numparticles, &particlebuffer, GL_STATIC_DRAW);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, particlebuffer);

glUseProgram(compShaderProgram);
glDispatchCompute(1, 1, 1);
glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT | GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT);

glUseProgram(shaderProgram);
glGenVertexArrays(1, &computeVAO);
glBindBuffer(GL_ARRAY_BUFFER, particlebuffer)

positionLoc = glGetUniformLocation(shaderProgram, "position");
glEnableVertexAttribArray(positionLoc);
glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), 0);

colorLoc = glGetUniformLocation(shaderProgram, "color");
glEnableVertexAttribArray(colorLoc);
glVertexAttribPointer(colorLoc, 4, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (GLvoid *)16);

glBindVertexArray(0);

然后我在绘制循环中有这个:

glUseProgram(shaderProgram);
glBindVertexArray(computeVAO);
glDrawArrays(GL_POINTS, 0, numparticles);
glBindVertexArray(0);

我是OpenGL的新手 - 非常感谢任何帮助和建议

0 个答案:

没有答案
相关问题