Потенциальная ошибка, если предположить, что структура памяти массива структуры передана в OpenGL - PullRequest
0 голосов
/ 28 мая 2018

Я следую учебному пособию по OpenGL, и в нем то, что делается для передачи данных меша на видеокарту, в основном следующее:

#include <GL/glew.h>
#include <glm/glm.hpp>

struct Vertex {
    ...
private:
    glm::vec3 pos;
    glm::vec2 texCoord;
    glm::vec3 normal;
};

Mesh::Mesh(Vertex * vertices, unsigned int numVertices) {
    ...
    glBufferData(GL_ARRAY_BUFFER, numVertices * sizeof(vertices[0]), vertices, GL_STATIC_DRAW);
    ...
}

Однако я чувствую, что это может вызвать проблемы, потому чтоиз предположения, что вершины будут выложены идеально.Или гарантируется, что поля Vertex будут размещены без заполнения и в таком порядке?Кроме того, я не знаю, каковы макеты или размеры типов glm :: vec *.

Правильно ли я подозреваю, что это может вызвать проблемы?

Что следует сделать вместо этого?

Что может повлиять на макет структуры?

1 Ответ

0 голосов
/ 28 мая 2018

В этом подходе нет ничего плохого, если вы укажете правильные указатели атрибутов, например:

glVertexAttribPointer( ..., 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), offsetof(Vertex, pos));
glVertexAttribPointer( ..., 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), offsetof(Vertex, texCoord));
glVertexAttribPointer( ..., 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), offsetof(Vertex, normal));

и sizeof, и offsetof примут во внимание любые дополнения, которые могут возникнуть.

Если вы хотите больше контроля над фактической компоновкой, вы также можете, конечно, работать с #pragma pack, который не является частью какого-либо стандарта C / C ++, но понятен всем основным компиляторам.На практике ни один реальный компилятор на платформе, где существует реализация OpenGL, не добавит никаких отступов для вашего исходного структурного макета, так что это, вероятно, спорный вопрос.

Кроме того, я не знаючто такое макеты или размеры типов glm::vec*.

Векторы и матрицы GLM представляют собой плотно упакованные массивы соответствующего базового типа, в частности float[N] для glm::vecN.

...