Выпуски GL VBO: первая и последняя полосы треугольников отображаются неправильно - PullRequest
1 голос
/ 13 сентября 2011

Я не новичок ни в 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)

Ответы [ 3 ]

1 голос
/ 13 сентября 2011

С одной стороны, использование векторов STL прекрасно, как вы выяснили;C ++ гарантирует, что std :: vector <> хранится в памяти как обычный массив.Я сам использовал std :: vector при работе с VBO, и он работает просто отлично, поэтому не стоит беспокоиться здесь.

Кроме этого, у меня нет хороших предложений, извините.Одна небольшая вещь заключается в том, что в теме вы говорите о треугольных полосах, но в коде, который вы отображаете с помощью GL_TRIANGLES, а не GL_TRIANGLE_STRIP.Это намерение?Хотя я бы предположил, что в этом случае будет большая разница в выходных данных, но я полагаю, что проверка никогда не повредит.

1 голос
/ 14 сентября 2011

ОК, я понял свою проблему. Это довольно глупо и смущает. В файлах WFObject хранятся такие индексы, как 1-й, 2-й и т. Д., А не 0-й, 1-й и т. Д.

Хотя да, я загружал в вершинах одинаково и в моем списке отображения, и в VBO, разница была в том, что в моем DL я рисовал на m_Vertices[m_Vindices[i]-1]

Очевидно, что OpenGL не знает, что ему нужно минус 1 от каждого сохраняемого индекса, и это правильно! Это была моя собственная проблема. Так что теперь у меня есть -1 от каждого индекса, так как он хранится в массиве индексов. Проблема решена!

Извините, что потратил ваше время, но спасибо, что заглянули!

0 голосов
/ 13 сентября 2011

Что такое m_Vindices?Вы утверждаете, что это целые числа в комментарии кода - это должно быть std::vector<unsigned int>.

...