Я не новичок ни в C ++, ни в OpenGL, однако я новичок в использовании VBO. До сих пор я ленился и просто использовал списки отображения в основном для всего.
Моя проблема, скорее всего, довольно простая, но она раздражает! Кажется, что первый и последний список треугольников не отображаются должным образом, в этом примере я загружаю сферу из простого файла obj модели волны. Я загружаю его из файла obj одинаково как для списка отображения, так и для VBO, и я убедился, что они получают одинаковые числа из файла obj.
В этом примере я использовал вектор STL для хранения вершин и индексов вершин. Однако я и раньше пытался использовать float * и int *, но это дало точно такой же результат.
Итак, вот экран сферы, взятой из VBO
edit: я удалил эту гиперссылку, так как не могу опубликовать больше 2, так как мой аккаунт все еще новичок ...
Как вы можете видеть, с противоположной стороны, идущей к середине сферы, нарисован огромный конус, это трудно увидеть, но полоса треугольников от ближайшей стороны к самой дальней стороне также неверна, это станет очевидно на одном из следующих нескольких экранов
Вот та же самая сфера, нарисованная из DL
edit: я удалил эту гиперссылку, так как не могу опубликовать больше 2, так как мой аккаунт все еще новичок ...
Вы можете видеть там, что DL рисует это правильно
Вот они оба рисуются одновременно, вы увидите самую большую разницу, где линии зеленые, как они должны быть
edit: я удалил эту гиперссылку, так как не могу опубликовать больше 2, так как мой аккаунт все еще новичок ...
Здесь более очевидно, что верхняя полоса неправильно рисуется из VBO
Затем я попытался добавить большое число к значению y каждой вершины, которое показывает, что с моим VBO определенно что-то не так, потому что вершина конуса внутри сферы никогда не движется!
Хорошо, теперь, когда у вас есть наглядное представление о проблеме, я подумал, что я добавлю сюда какой-нибудь код, возможно, я просто пропустил шаг или набрал неправильный номер. Пожалуйста, посмотрите
так я создаю vbo
void VBOWFModel::Create_VBO()
{
// Vertex Array VBO handle
glGenBuffers(1, &m_VAVBO_handle);
glBindBuffer(GL_ARRAY_BUFFER, m_VAVBO_handle);
glBufferData(GL_ARRAY_BUFFER,
m_vertices.size()*sizeof(Vec3f),
&m_vertices[0].x, GL_STATIC_DRAW);
}
Где m_vertices - это вектор STL в Vec3f, который просто содержит x, y, z. Я пробовал это как вектор, и это дало ту же проблему, так что переход на вектор или плавание * не проблема.
Хорошо, теперь туда, где я рисую, у меня такое ощущение, что я делаю что-то не так
void VBOWFModel::Render()
{
glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, m_VAVBO_handle);
glVertexPointer(3, GL_FLOAT, sizeof(Vec3f), (float*) NULL);
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
// m_Vindices are the vertex indices, not the greatest naming convention but hey...
// it is an STL vector of integers
glDrawElements(GL_TRIANGLES, m_Vindices.size(), GL_UNSIGNED_INT, &m_Vindices[0]);
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
glDisableClientState(GL_VERTEX_ARRAY);
}
Я рисую, используя glPolygonMode (GL_FRONT_AND_BACK, GL_LINE); просто для целей отладки, потому что лучше всего показывает проблему с неправильными треугольниками.
Может кто-нибудь увидеть, сделал ли я что-то не так? Я что-то неправильно инициализировал? Я пропускаю шаг? Я просмотрел различные уроки и немного погуглил, похоже, я не сильно отличаюсь от всех остальных. Большинство уроков использовали float * вместо вектора stl, но, опять же, я уже сделал это, и он дал тот же результат.
Не уверен, есть ли еще какая-то информация, которую я должен дать, я просто включаю glew и freeglut (последний из обоих .. на windows)