Как сказать VBO обрабатывать данные данные? (имитация ткани)

Я работаю над созданием симуляции одежды в openGL и пытаюсь использовать VAO и VBO для рендеринга, а не в старом непосредственном режиме (glBegin, glEnd).

Я считаю, что будет лучше, если я предоставлю только соответствующие части кода, а не все. Поэтому у меня есть класс Cloth, который хранит массу (узлы) в векторе.

class Cloth {
private:
std::vector<Mass>masses;
public:
std::vector<Mass> getMasses() { return masses; };
// functions below

И класс, Массачусетс

class Mass {
glm::vec3 currentPos;
glm::vec3 oldPos;
glm::vec3 acceleration;
// functions below

Я создал VBO, как так

glGenBuffers(1, &VBO_ID);
glBindBuffer(GL_ARRAY_BUFFER, VBO_ID);
glBufferData(GL_ARRAY_BUFFER, cloth.getMasses().size() * sizeof(Mass), &cloth.getMasses().front(), GL_DYNAMIC_DRAW);

и ВАО

glGenVertexArrays(1, &VAO_ID);
glBindVertexArray(VAO_ID);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GL_FLOAT), 3*sizeof(GL_FLOAT)); // unsure about this part

Из того, что я собрал, вызывая glVertexAttribPointer, вы сообщаете VBO, как обрабатывать данные, которые ему были переданы. Я дал ему вектор типа Масса.
Что бы мне было правильно сказать, как обрабатывать данные, чтобы они использовали currentPos в качестве вершин?
а также
Есть ли лучший (с точки зрения производительности) способ сделать это, и если да, то как и почему?
Например, было бы лучше использовать структуру для хранения currentPos?

0

Решение

Я не вижу ничего плохого в коде. Но с атрибутами vertexBuffer вам не нужно указывать конечному автомату openGL использовать currentPos в качестве вершины, это будет сделано в вершинном шейдере.

РЕДАКТИРОВАТЬ Я вижу что-то не так с кодом. Я думал, что вы отправили только примитивные типы. Вы не можете отправить свой класс на свой код GLSL и надеяться, что он будет работать. Вы можете отправлять данные, а glVertexAttribPointer сообщает вашему шейдеру расположение ваших данных. То, что вы делаете, не может работать.

Я бы посоветовал вам взглянуть на https://learnopengl.com/ это мне очень помогло и очень полно.

Вы будете иметь:

layout (location = 0) in vec3 currentPos;
layout (location = 1) in vec3 oldPos;
layout (location = 2) in vec2 acceleration;

Затем вы выводите положение вершины следующим образом:

gl_Position = mvp*vec4(currentPos, 1.0);

mvp — матрица проекции вида модели, которую вы, вероятно, отправите как униформу.

Что будет дальше, немного выходит за рамки вашего ответа, но может быть интересно:

Хотя я не знаю точно, что вы пытаетесь сделать, вы должны знать, что в вершинном шейдере вы не можете редактировать атрибуты вершины, это означает, что, учитывая то, как ваш код выглядит прямо сейчас, вам придется обновлять VBO каждый раз шаг симуляции. Вы можете либо обновить его на своем процессоре (что может быть медленным), но это может быть значительно быстрее, чем в вычислительном шейдере.

0

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

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

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