Я создаю парсер OBJ, который читает файл и рисует его с помощью glDrawElements. Дело в том, что модель правильно рисуется, но когда я пытаюсь дать ей текстуру, она неправильно отображается. Я прочитал here, что «OpenGL может использовать только один буфер индекса, тогда как OBJ использует один буфер индекса по атрибуту». Я также исследовал неправильное отображение текстур при использовании glDrawElements и выяснил, что мне нужно изменить структуру текстур, потому что только вершины являются общими, но не текстурами. Сказав все это, как мне следует переупорядочить текстуры? Должен ли я дублировать некоторые текстуры? Пожалуйста, обратитесь к этому link за образцом, который я получаю.OpenGL - текстуры неправильно отображаются с использованием glDrawElements
ответ
Формат 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, но на самом деле его не так много дополнительных данных, большую часть времени, так как вам не придется больше задавать буфер индексов.
Этот материал действительно раздражает, о чем я думаю, я изо всех сил старался сделать его доступным, и я надеюсь, что не ошибался.
Я не слишком хорошо знаком с OBJ, но вы говорите, что OBJ может ссылаться на разные атрибуты по индексу на вершину. У вас есть один большой массив xyz, еще один большой массив uv. И каждая вершина затем имеет индекс в массив xyz и другой индекс в массив uv. Но opengl имеет только один индекс на вершину! Поэтому, если индекс xyz и uv отличается, opengl не будет работать. Один простой способ исправить это - перебрать все вершины, и если их индекс uv не совпадает с индексом xyz, просто скопируйте данные обоих в конец их буферов и установите для этого индекс.
Я буду иметь это в виду, поскольку я действительно хочу, чтобы он работал с glDrawElements. Мне просто интересно, должен ли я действительно скопировать оба конца буфера или это может быть только текстура? – zyneragetro
- 1. OpenGL - Текстуры загрузки неправильно
- 2. OpenGL и GL_Blend с glDrawElements
- 3. Кубический рендеринг: текстуры отображаются неправильно
- 4. OpenGL glDrawElements перевод на OpenGL es glDrawElements
- 5. OpenGL glDrawElements
- 6. OPENGL: Печать с glDrawElements
- 7. OpenGL с использованием glNewList и glDrawElements
- 8. Аналоговые часы OpenGL отображаются неправильно?
- 9. Текстуры массива OpenGL вообще не отображаются
- 10. openGL glDrawElements с чередующимися буферами
- 11. Текстуры skybox не отображаются в opengl
- 12. Текстуры не отображаются правильно C++ opengl SOIL
- 13. C++ - сбой OpenGL на glDrawElements()
- 14. opengl glDrawElements Issues
- 15. OpenGL SegFault в glDrawElements
- 16. Отображение текстуры с использованием 1d-текстуры с OpenGL 4.x
- 17. Координатный массив текстур работает неправильно с glDrawElements
- 18. glDrawElements неправильно отображает очки на iPhone
- 19. Слишком темные текстуры OpenGL
- 20. Загрузка текстуры opengl с использованием Boost.GIL
- 21. Черные текстуры OpenGL
- 22. Настройка OpenGL ES 2.0 Текстуры
- 23. glDrawElements с использованием неправильного VBO?
- 24. Смешение неправильно при отображении текстуры растрового изображения RGBA на OpenGL
- 25. OpenGl с C++ - Текстуры
- 26. OpenGL es 2.0 реализация glDrawElements
- 27. OpenGL ES - glDrawElements - Trouble Understanding Indices
- 28. OpenGL glDrawElements only Black Screen
- 29. iphone opengl es glDrawElements issue
- 30. opengl - glDrawElements не рисовать треугольники
Спасибо за ответ и извините за поздний ответ.Это действительно полезно для меня, и теперь ясно. Буфер индекса использовался, потому что я намерен использовать GL_TRIANGLE_STRIP, и я не могу заставить его работать в glDrawArrays. – zyneragetro