Использование игрушечного шейдера для генерации очков

Я работаю над своим самым первым вычислительным шейдером и хочу использовать его для генерации точек в рамках более крупного проекта, но мне, кажется, что-то не хватает.

Как мне заставить все играть красиво?

Это мой код вычислительного шейдера (после указания версии 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;
}

Мои шейдеры компилируются без проблем. После прочтения этот В публикации об использовании данных буфера вычисляемых шейдеров в вершинном шейдере я написал следующий код для инициализации 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

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector