2015-07-27 2 views
-1

Я создаю парсер OBJ, который читает файл и рисует его с помощью glDrawElements. Дело в том, что модель правильно рисуется, но когда я пытаюсь дать ей текстуру, она неправильно отображается. Я прочитал here, что «OpenGL может использовать только один буфер индекса, тогда как OBJ использует один буфер индекса по атрибуту». Я также исследовал неправильное отображение текстур при использовании glDrawElements и выяснил, что мне нужно изменить структуру текстур, потому что только вершины являются общими, но не текстурами. Сказав все это, как мне следует переупорядочить текстуры? Должен ли я дублировать некоторые текстуры? Пожалуйста, обратитесь к этому link за образцом, который я получаю.OpenGL - текстуры неправильно отображаются с использованием glDrawElements

ответ

2

Формат OBJ определяет УНИКАЛЬНЫЕ координаты, вершины и грани текстуры.

Opengl не имеет никакого отношения к OBJ, конечно, поэтому все, что он хочет, это правильная информация в нужном месте.

Представьте себе два лица, как это в вашем OBJ (уведомление вершины 1 texcoords в обе стороны)

f: v1 |t1|  v2 t2  v3 t3 
f: v1 |t2|  v4 t4  v5 t5 

Ваш индекс буфера так:

1 2 3  1 4 5 

Ваш OpenGL VERTEX буфер первый выглядит следующим образом:

v1 v2 v3 v4 v5 

Если вы хотите добавить координаты текстуры, где их добавить? Как это?

v1 t1  v2 t2  v3 t3  v4 t4  v5 t5 

Это, вероятно, что у вас есть сейчас, его неправильно, потому что OpenGL делает лицо, как это:

f: v1 |t1|  v2 t2  v3 t3 
f: v1 |t1|  v4 t4  v5 t5 

Поскольку v1 и t1 связаны друг с другом вашего indexbuffer, обратите внимание на разницу между вершинами в OBJ и OpenGL.

Существует несколько способов решить эту проблему. Я бы рекомендовал избавиться от indexbuffer, потому что это только усложняет все. Без индексного буфера вы просто поставляете все грани, как если бы они были уникальными, и использовали другой призыв рисования (glDrawArrays). Ваш буфер вершин будет выглядеть следующим образом:

v1 |t1|  v2 t2  v3 t3  v1 |t2|  v4 t4  v5 t5 

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

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

+1

Спасибо за ответ и извините за поздний ответ.Это действительно полезно для меня, и теперь ясно. Буфер индекса использовался, потому что я намерен использовать GL_TRIANGLE_STRIP, и я не могу заставить его работать в glDrawArrays. – zyneragetro

0

Я не слишком хорошо знаком с OBJ, но вы говорите, что OBJ может ссылаться на разные атрибуты по индексу на вершину. У вас есть один большой массив xyz, еще один большой массив uv. И каждая вершина затем имеет индекс в массив xyz и другой индекс в массив uv. Но opengl имеет только один индекс на вершину! Поэтому, если индекс xyz и uv отличается, opengl не будет работать. Один простой способ исправить это - перебрать все вершины, и если их индекс uv не совпадает с индексом xyz, просто скопируйте данные обоих в конец их буферов и установите для этого индекс.

+0

Я буду иметь это в виду, поскольку я действительно хочу, чтобы он работал с glDrawElements. Мне просто интересно, должен ли я действительно скопировать оба конца буфера или это может быть только текстура? – zyneragetro

Смежные вопросы