#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() );