Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: OpenGL швы между полигонами  (Прочитано 2431 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн VestniK

  • Автор темы
  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
OpenGL швы между полигонами
« : 03 Сентября 2010, 14:10:52 »
При рендеренге модели содержащей несколько стыкующихся полигонов в одной плоскости они не образуют однородной поверхности как хотелось бы.
Сцена рендериться следующим образом:
http://gitorious.org/mahjong-night/mahjong-night/blobs/master/mahjong-night/client/tablewidget.cpp
Лист строится вот так:
http://gitorious.org/mahjong-night/mahjong-night/blobs/master/mahjong-night/client/objloader.cpp#line108
Свойства материалов устанавливаются так:
http://gitorious.org/mahjong-night/mahjong-night/blobs/master/mahjong-night/client/mtlloader.cpp#line44

Получается вот такая картинка:
(Нажмите, чтобы показать/скрыть)

Вчера в полусонном состоянии пытался найти ответ в красной книге, сегодня гуглил, но пока ответа не нашёл. Блендер модель отображает корректно (собственно в нём она и создавалась), а вот в своей проге я получаю результат очень далёкий от совершенства.

Может кто знает в каком направлении копать?
« Последнее редактирование: 17 Сентября 2010, 23:21:00 от VestniK »

Оффлайн Упс

  • Старожил
  • *
  • Сообщений: 3231
    • Просмотр профиля
Re: OpenGL швы между полигонами
« Ответ #1 : 03 Сентября 2010, 15:28:10 »
Может меня зрение подводит.
glShadeModel
glHint
xUbuntu 12.04

Оффлайн VestniK

  • Автор темы
  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: OpenGL швы между полигонами
« Ответ #2 : 03 Сентября 2010, 16:01:04 »
glShadeModel для данной модели установленно в GL_SMOOTH собственно поэтому усреднение цвета приводящее к этой проблеме и происходит, значение GL_FLAT проблему не решает, а, при определённых углах, делает острее. А вот с glHint попробую разобраться.

ЗЫ. я в OpenGL пока ещё новичёк, разбираюсь потихоньку в свободное время.

Пользователь решил продолжить мысль 04 Сентября 2010, 03:45:52:
В итоге, после всех экспериментов решил просто отрезать от модели всё лишнее (имею в виду ненужные вершины в точках пересечения объекта с плоскостями симметрии)
« Последнее редактирование: 04 Сентября 2010, 03:45:52 от VestniK »

Оффлайн maximum2000

  • Активист
  • *
  • Сообщений: 403
    • Просмотр профиля
Re: OpenGL швы между полигонами
« Ответ #3 : 05 Сентября 2010, 22:33:30 »
Просто не нужно так делать, в смысле, границы полигонов не должны быть "разорванными". Почему нельзя построить поверхность не "кусочками", а целиком? Что мешает?

+ glBegin/glEnd = самое медленное решение + отменено в OpenGL3 (работать будет, но через эмуляцию 2.0)

« Последнее редактирование: 05 Сентября 2010, 22:36:21 от maximum2000 »

Оффлайн VestniK

  • Автор темы
  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: OpenGL швы между полигонами
« Ответ #4 : 06 Сентября 2010, 00:05:03 »
Цитировать
Почему нельзя построить поверхность не "кусочками", а целиком? Что мешает?
Просто мой кирпич очень симметричный и его проще рисовать и редактировать в блендере включив отражение и работая только с восьмушкой объекта. При экспорте в obj экспортируются все полигоны, в том числе и разорванные.

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

Цитировать
+ glBegin/glEnd = самое медленное решение + отменено в OpenGL3 (работать будет, но через эмуляцию 2.0)
А что теперь нужно использовать? Мои основные источники информации об OpenGL это Red Book и Blue Book они кончено утсарели, но в них достаточно хорошее и удобное объяснение как работать с OpenGL.
« Последнее редактирование: 06 Сентября 2010, 01:19:22 от VestniK »

Оффлайн Упс

  • Старожил
  • *
  • Сообщений: 3231
    • Просмотр профиля
Re: OpenGL швы между полигонами
« Ответ #5 : 06 Сентября 2010, 00:41:56 »
Цитировать
А что теперь нужно использовать?
Не теперь, а уже давно желательно использовать VBO, особенно для игрушек.
Кинь модельку (.blend), на посмотреть.
xUbuntu 12.04

Оффлайн VestniK

  • Автор темы
  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: OpenGL швы между полигонами
« Ответ #6 : 06 Сентября 2010, 01:22:12 »
http://gitorious.org/mahjong-night/mahjong-night/trees/master/artwork
Она в том же репозитории где и код лежит. Я предпочитаю всё что является "исходниками" держать в одном месте.
« Последнее редактирование: 06 Сентября 2010, 12:56:06 от VestniK »

Оффлайн Упс

  • Старожил
  • *
  • Сообщений: 3231
    • Просмотр профиля
Re: OpenGL швы между полигонами
« Ответ #7 : 06 Сентября 2010, 01:56:14 »
http://gitorious.org/mahjong-night/mahjong-night/trees/master/artwork
Она в том же репозитории где и код лежит. Я предпочитаю всё что является "исходниками" держить в одном месте.
Спасибо, нашёл.
xUbuntu 12.04

Оффлайн VestniK

  • Автор темы
  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: OpenGL швы между полигонами
« Ответ #8 : 06 Сентября 2010, 13:11:09 »
Просматривая код я обнаружил, что у меня порядок вызова glNormal и glVertex при создании листа неправильный. В цикле я сначала вызывал glVertex, а затем glNormal. Поменял порядок на правильный, углы модели стали гладкими и красивыми, но вот материалы перестали корректно устанавливаться зелёная часть стала белой, а белая стала тёмно серой.

Попробовал отключить рендеринг полигонов сначала для первого материала, потом для вторго материала. В обоих случаях зелёная и белая половинки по отдельности рендерятся правильно, но вместе нет. При этом когда последовательность вызовов glNormal и glVertex была неверной всё было нормально. Перечитал ещё раз главу про GL Lists в Red book по идее всё верно и должно работать.

Все изменения после которых возникает проблема вот тут: http://gitorious.org/mahjong-night/mahjong-night/commit/d6f7623b1ee2e0f45fbb2830adf037d4de91c865
Из за чего может такое быть? Имеются ли ограничения на использование нескольких материалов в одном GL list'е?

Оффлайн maximum2000

  • Активист
  • *
  • Сообщений: 403
    • Просмотр профиля
Re: OpenGL швы между полигонами
« Ответ #9 : 06 Сентября 2010, 15:33:57 »
Хочу дать очень хороший совет ....... используй OSG (www.openscenegraph.org)

Там есть огромное количество примеров на разные темы... + умеет читать и писать в разные форматы ....

Я сам пользуюсь уже давно  (http://www.openscenegraph.org/projects/osg/wiki/Screenshots/TSOGU)

+ отличная интеграция с QT )))


« Последнее редактирование: 06 Сентября 2010, 15:35:43 от maximum2000 »

Оффлайн VestniK

  • Автор темы
  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: OpenGL швы между полигонами
« Ответ #10 : 06 Сентября 2010, 17:31:17 »
Спасибо. Посмотрю что там да как.

Пользователь решил продолжить мысль 07 Сентября 2010, 02:14:26:
А тем временем я разобрался с неправильнми материалами, ответ крылся в моём неправильном понимании значения glEnable(GL_COLOR_MATERIAL).
« Последнее редактирование: 07 Сентября 2010, 02:14:26 от VestniK »

Оффлайн maximum2000

  • Активист
  • *
  • Сообщений: 403
    • Просмотр профиля
Re: OpenGL швы между полигонами
« Ответ #11 : 07 Сентября 2010, 10:36:34 »
Спасибо. Посмотрю что там да как.

Пользователь решил продолжить мысль 07 Сентября 2010, 02:14:26:
А тем временем я разобрался с неправильнми материалами, ответ крылся в моём неправильном понимании значения glEnable(GL_COLOR_MATERIAL).

Отлично) Теперь все работает?

Оффлайн VestniK

  • Автор темы
  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: OpenGL швы между полигонами
« Ответ #12 : 07 Сентября 2010, 11:40:13 »
Да, теперь модель грузится и рендерится корректно. Буду их по игровому столу раскладывать.

 

Страница сгенерирована за 0.019 секунд. Запросов: 21.