Использование собственного :: Vector3f с Opengl ES 2.0 VBO

#c #opengl-es

#c #opengl-es

Вопрос:

У меня возникли проблемы с получением Eigen :: Vector3f и Opengl ES 2.0 VBO для совместной работы. Моей первоначальной попыткой был glVertexAttribPointer(ВЕРШИНА, 3, GL_FLOAT , sizeof(вершина), 0). Хотя это ничего не дает, если я начну играть со значениями шага, я увижу сломанную сетку. Это мой текущий код, который приводит к сбою. В моем старом коде я использовал простой класс vector3, состоящий из 3 элементов с плавающей запятой, который работал нормально.

 struct Vertex {

    Eigen::Vector3f pos ;

    Eigen::Vector3f normal;
};


std::vector<Vertex> Vertices;

std::vector<ushort16> Indices;

...


GLuint vao;
uint32 vboID, vboID2;

glGenVertexArraysOES(1, amp;vao);
glBindVertexArrayOES(vao);


glGenBuffers(1, amp;vboID);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glBufferData(GL_ARRAY_BUFFER, GL_STATIC_DRAW , sizeof(Vertex) * Vertices.size(), amp;Vertices[0]);
glBindBuffer(GL_ARRAY_BUFFER, 0);


glGenBuffers(1, amp;vboID2);
glBindBuffer(GL_ARRAY_BUFFER, vboID2);
glBufferData(GL_ARRAY_BUFFER, GL_STATIC_DRAW , sizeof(ushort16) * m_vIndices.size(), amp;Indices[0]);
glBindBuffer(GL_ARRAY_BUFFER, 0);


glBindBuffer(GL_ARRAY_BUFFER, vboID);
glEnableVertexAttribArray(VERTEX);
glVertexAttribPointer(VERTEX, 3, GL_FLOAT , sizeof(Vertex), amp;Vertices[0].pos );

glEnableVertexAttribArray(NORMAL);
glVertexAttribPointer(NORMAL, 3, GL_FLOAT , sizeof(Vertex), amp;Vertices[0].normal );

glBindBuffer(GL_ARRAY_BUFFER, vboID2);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArrayOES(0);


...
 

Комментарии:

1. Ваш вопрос, похоже, указывает на то, что вы используете объекты буфера вершин, но в показанном вами коде используется адрес клиентской памяти. Вы вырезали слишком много важных строк, чтобы знать, что происходит на самом деле.

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

3. Ну, нет вызова draw, нет glBindBuffer вызова, и вы, по-видимому, загружаете свои индексы в неправильный целевой объект buffer (при условии, что у вас есть индексный буфер, привязанный к GL_ELEMENT_ARRAY_BUFFER и нет GL_ARRAY_BUFFER ). Вы можете свободно загружать данные в объект buffer, привязывая его в любом месте, где захотите, но позже, когда вы вызываете glVertexAttribPointer (...) это, требуется, чтобы он был привязан к GL_ARRAY_BUFFER и glDrawElements (...) требует, чтобы он был привязан GL_ELEMENT_ARRAY_BUFFER .

4. Спасибо, что указали, что я обновил соответствующие части кода, дайте мне знать, если допустили какие-либо другие ошибки.

Ответ №1:

это решило мою проблему:

Я удалил:

 glBufferData(GL_ARRAY_BUFFER, GL_STATIC_DRAW , sizeof(Vertex) * Vertices.size(), amp;Vertices[0]);
 

И я изменил эти строки на

 glVertexAttribPointer(VERTEX, 3, GL_FLOAT , sizeof(Vertex), Vertices[0].pos.data() );

....
glVertexAttribPointer(NORMAL, 3, GL_FLOAT , sizeof(Vertex), Vertices[0].normal.data() );