Как сказать VBO обрабатывать данные данные? (имитация ткани) - PullRequest
0 голосов
/ 26 июня 2018

Я работаю над созданием симуляции одежды в 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?

1 Ответ

0 голосов
/ 26 июня 2018

Я не вижу ничего плохого в коде. Но с атрибутами 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 каждый шаг симуляции. Вы можете либо обновить его на своем ЦП (что может быть медленным), но это может быть значительно быстрее, чем в вычислительном шейдере.

...