PMG

Форумы по созданию игр
Текущее время: 25 апр 2024 00:37

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 51 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: BSP-конвейер и точность в OpenGL
СообщениеДобавлено: 02 авг 2005 23:11 
Не в сети
Любитель
Аватара пользователя

Зарегистрирован: 16 июл 2005 04:00
Сообщения: 41
Откуда: Санкт-Петербург
Помогите! Работаю на связке C# + OpenGL. На рендеринг выводятся несколько полупрозрачных фигур. Для корректности вывода, был реализован ("позаимствован" с http://www.GameDev.RU) BSP-конвейер. Корректность вывода обеспечена. НО! Есть несколько минусов.
Первый, с которым "можно смириться" (но ой как хочется избавиться!) - быстродействие. Фигуры строятся динамически, так что при загрузке очередной фигуры, для сцены приходится перестраивать BSP-дерево (node-based-BSP-tree). Задержки приличные, но либо задержки при перестроении дерева (сдалансированность) либо задержки при рендеринге (несбалансированное дерево).
Второй, от которого "надо избавиться" (но пока приходится мириться) - битые пиксели. При выводе на рендеринг фигуры, "между треугольников" пропадают (или проявляется наложение) пиксели. Для дешения этой проблемы использовались все решения, пришедшие мне на ум:
- был пересмотрен метод рассечения треугольников (3 варианта: один самопальный, 2 "позаимствованных" из других движков)
- был произведен перевод координат на более точный тип (double - погрешность в 15-ом знаке)
- был произведен перевод на общие точки для смежных треугольников (список точек и треугольники ссылаются на список, а не хранят точки "в себе")

При наложении поверх (!) треугольников (GL_TRIANGLES) некоего подобия wireframe (обход треугольника с GL_LINE_STRIP), точки "закрываются". Но корректно это выглядит лишь на непрозрачных моделях. При полупрозрачности (glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)) происходит наложение "каркаса" на фигуру и выглядит это очень не эротично. :-(

Вопрос в том, откуда могут проявлятся эти точки? При рендеринге используется glVertex3d. Проекция - перспективная (проверил на gluOrtho2D - не помогло). Установлено:
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
glHint(GL_POLYGON_SMOOTH, GL_NICEST);

Возможно ли, что в OpenGL'е есть некоторые глюки с точностью, о которых я один не знаю? И которые можно обойти. Или это у меня глюк? Или какой другой вариант проявления точек (там и "зазоры" и "наложения" в одном и том же месте при немого отличных углах может быть)???

Или как можно выводить 2 и более пересекающихся модели на рендеринг корректно? (это я пытался обсуждать тут)

Буду благодарен за любой совет...

P.S. Спасибо, если хоть терпения хватило до сюда дочитать...

ПРИЛОЖЕНИЕ (если не видно след. рисунка): http://darkangel.wallst.ru/screen_error_08.png
Изображение


Последний раз редактировалось DarkAngel 18 авг 2005 14:50, всего редактировалось 6 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 03 авг 2005 08:48 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Кстати, при перемещении камеры, эти глюкавые пиксели дрожат?

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 03 авг 2005 08:53 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Какая у тебя максимальная степень дерева, т.е. сколько раз надо пройти от корня до листа? Насколько дерево не сбалансировано?

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 03 авг 2005 08:55 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Видимо тебе надо делать пост обработку, т.е. искать точки, которые близко друг от друга, но находятся в разных полигонах и разделать их.

И конечно в OGL есть точность и при выводе точек и при работе буфера глубины.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Ответ самому активному участнику
СообщениеДобавлено: 03 авг 2005 10:06 
Не в сети
Любитель
Аватара пользователя

Зарегистрирован: 16 июл 2005 04:00
Сообщения: 41
Откуда: Санкт-Петербург
MagicWolf писал(а):
Какая у тебя максимальная степень дерева, т.е. сколько раз надо пройти от корня до листа? Насколько дерево не сбалансировано?

Максимальная степень? От корня, до "листа" (у меня node-based-tree) я надо пройти раз. А если это про глубину, то черт его знает. Не засекал. Там до X00.000 полигонов (на 7-9 фигурах). А если выставить некоторые настройки (рассчет для всех треугольников "веса"), то сбалансированость будет максимальной (теоретически) и "близкой" к идеальной.
Цитата:
Кстати, при перемещении камеры, эти глюкавые пиксели дрожат?

Угу. Исчезают, пропадают. Иногда "зазоры" превращаются в "наложения".
Цитата:
Видимо тебе надо делать пост обработку, т.е. искать точки, которые близко друг от друга, но находятся в разных полигонах и разделать их.

Как это "разделять"? И как это "близко друг от друга"? Если честно, не понял. Ты предлагаешь обрабатывать отрендеренный вариант? Уже пиксельную карту???
Цитата:
И конечно в OGL есть точность и при выводе точек и при работе буфера глубины.

А она может ТАК проявляться? Или это точно МОЙ глюк?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ответ самому активному участнику
СообщениеДобавлено: 03 авг 2005 16:48 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
DarkAngel писал(а):
Максимальная степень? От корня, до "листа" (у меня node-based-tree) я надо пройти раз. А если это про глубину, то черт его знает. Не засекал. Там до X00.000 полигонов (на 7-9 фигурах). А если выставить некоторые настройки (рассчет для всех треугольников "веса"), то сбалансированость будет максимальной (теоретически) и "близкой" к идеальной.


Так какая глубина. Какова сбалансированость - проверь! Может здесь причина уменьшения быстродействия.

X00.000 полигонов - не шибко ли много для BSP? Как насчет низкополигоной графики?

DarkAngel писал(а):
Угу. Исчезают, пропадают. Иногда "зазоры" превращаются в "наложения".


Значит треугольники на стыках друг на друга наезжают. А это связано с тем, что точность при расчета OGL не позволяет их разделить.

DarkAngel писал(а):
Как это "разделять"? И как это "близко друг от друга"? Если честно, не понял. Ты предлагаешь обрабатывать отрендеренный вариант? Уже пиксельную карту???


Координаты вершин треугольников. Разводить их друг от друга.

DarkAngel писал(а):
А она может ТАК проявляться? Или это точно МОЙ глюк?


Глюк твой! Ты просто это не учитываешь. Про это что-то было на opengl.com - надо поискать тебе ...

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

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Н-да. Не думал, что так грустно будет.
СообщениеДобавлено: 04 авг 2005 02:04 
Не в сети
Любитель
Аватара пользователя

Зарегистрирован: 16 июл 2005 04:00
Сообщения: 41
Откуда: Санкт-Петербург
MagicWolf писал(а):
Так какая глубина. Какова сбалансированость - проверь! Может здесь причина уменьшения быстродействия.
Да точно здесь (отвечаю без проверки). Там от сбалансированности далеко не линейно зависит быстродействие. Но это быстродействие при рендеринге. Её (скорость рендеринга) можно увеличить, выдав приоритет (и дополнительное ЦП-время) построению дерева. Но это тоже критично

MagicWolf писал(а):
X00.000 полигонов - не шибко ли много для BSP? Как насчет низкополигоной графики?
Не шибко. Там фигуры часто попадаются такие, что поверхности почти (!!!) совпадают. ДА и в одной фигуре, есть "изгибы внутрь", треугольники которых рассекают своих соседей. И изгибы очень красивые (плавненькие) и соседи подроблены получаются очень мелко. Этого можно избежать, но... Время построения дерева?

MagicWolf писал(а):
Значит треугольники на стыках друг на друга наезжают. А это связано с тем, что точность при расчета OGL не позволяет их разделить.
Координаты вершин треугольников. Разводить их друг от друга.
А это не приведет к еще большим "зазорам"?

MagicWolf писал(а):
Глюк твой! Ты просто это не учитываешь. Про это что-то было на opengl.com - надо поискать тебе ...
Намек дашь, что искать? Точность рендера OGL?

MagicWolf писал(а):
Глюк видимо вот в чем. Берешь две поверхности и совмещаешь их друг с другом или пускай они находятся друг от друга на маленьком расстоянии. Рендеришь и водишь камерой - получишь то, что иногда они пикселы с одной поверхности будут переезжать в другую.
Я В ШОКЕ! Чего я не ожидал, так такой засады... Поставил 3 треугольника.
Код:
glBegin(GL_TRIANGLES);
glVertex3f(-100.0f, 100.0f, 0.0f);
glVertex3f(-100.0f, -100.0f, 0.0f);
glVertex3f(100.0f, 100.0f, 0.0f);
glEnd();

glBegin(GL_TRIANGLES);
glVertex3f(100.0f, 100.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(100.0f, -100.0f, 0.0f);
glEnd();

glBegin(GL_TRIANGLES);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(-100.0f, -100.0f, 0.0f);
glVertex3f(100.0f, -100.0f, 0.0f);
glEnd();

МЕЖДУ НИМИ ТАКАЯ !!!! ШЕЛЬ!!! :evil: Я поражен точностью. Кстати, шель между первым и 2-мя оставшимися. А между этими 2 (последними) гладко!
Хотя, надо признать, что перевод этого же примера на double помогло в лучшую сторону (щель чуть-чуть уменьшилась :D). Н-да... Офигенно обрадовал. Теперь я точно не знаю, что делать. Если он на таком простом примере мне фиги показывает...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 04 авг 2005 09:05 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Обычно BSP используют для вывода статического окружения. Оно как правило низкополигональное и если полигонов много сбалансированость дерева плохая или глубина дерева велика, то естественно возникают проблемы.

Полигоны не должны накладываться друг на друга. Конкретные рекомендации по этому поводу где-то есть на opengl.com

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 04 авг 2005 09:48 
Не в сети
Любитель
Аватара пользователя

Зарегистрирован: 16 июл 2005 04:00
Сообщения: 41
Откуда: Санкт-Петербург
MagicWolf писал(а):
Обычно BSP используют для вывода статического окружения. Оно как правило низкополигональное и если полигонов много сбалансированость дерева плохая или глубина дерева велика, то естественно возникают проблемы.
А какой алгоритм корректной сортировки вывода пересекающихся, полупрозрачных треугольников (или моделей) вы посоветуете? В теме по полупрозрачности, я не получил окончательного совета. Потому и остановил выбор на BSP-деревьях.

MagicWolf писал(а):
Полигоны не должны накладываться друг на друга. Конкретные рекомендации по этому поводу где-то есть на opengl.com
Ну не накладываются они :cry:. Простейший пример (описан выше) дает такой результат...
Изображение
А ведь они там вовсе не могут накладываться. Они лежат в одной плоскости.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 04 авг 2005 16:31 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
По моему, если стыки полигонов не имеют общие вершины, то совпадать они не могут. Надо пожалуй порыться в инете на эту тему, так как я не знаю способа бесшовного и бесконфликтного состыковывания полигонов.

Если полигоны пересекаются их надо разбивать на части. ;(.

Где ты еще по этому поводу спрашивал? Что отвечали?

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 04 авг 2005 17:15 
Не в сети
Любитель
Аватара пользователя

Зарегистрирован: 16 июл 2005 04:00
Сообщения: 41
Откуда: Санкт-Петербург
MagicWolf писал(а):
По моему, если стыки полигонов не имеют общие вершины, то совпадать они не могут. Надо пожалуй порыться в инете на эту тему, так как я не знаю способа бесшовного и бесконфликтного состыковывания полигонов.
Тяжелый случай... Проблемка. Ну не разбивать же большой на 2 маленьких. (в примере будет 4 треугольника)

MagicWolf писал(а):
Где ты еще по этому поводу спрашивал? Что отвечали?
По поводу полупрозрачности:
http://www.opengl.org.ru/cgi-bin/blah/B ... 476934,s=0
http://algolist.manual.ru/forum/showfla ... age/0#6487
http://forum.sources.ru/index.php?act=ST&f=28&t=102479
http://forum.codenet.ru/showthread.php? ... adid=24634
http://www.gamedev.ru/forum/?group=0&topic=18246

По этой же теме (точность OpenGL)
http://www.opengl.org.ru/cgi-bin/blah/B ... 008311,s=0
http://algolist.manual.ru/forum/showfla ... =#Post6691
http://forum.sources.ru/index.php?act=ST&f=28&t=104239
http://forum.codenet.ru/showthread.php? ... adid=25049
http://www.gamedev.ru/forum/?action=sho ... opic=18637

По второй теме пошти ниге нет ответов. (всего на нескольких топиках.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 05 авг 2005 10:26 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Н-да, ответа нет ;(.
Я все - таки считаю, что надо рыть в области бесшовного состыковывания полигонов...
И надо иметь резюме по проблемам, т.е. что надо найти, какие ответы?!

Счас я пока вижу только проблему состыковывания полигонов, или еще есть какие?

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 08 авг 2005 14:58 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
В книге Борескова Графика трехмерной компьютерной игры на основе OpenGL:
http://www.bolero.ru/cgi-bin/dsc.cgi?22 ... wolf&new=1

используется BSP для сортировки прозрачных граней.
Можно спросить у него:
http://steps3d.narod.ru/
Исходники там тоже есть.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 10 авг 2005 14:10 
Не в сети
Любитель
Аватара пользователя

Зарегистрирован: 16 июл 2005 04:00
Сообщения: 41
Откуда: Санкт-Петербург
MagicWolf, будь человеком, скажи что ты знаешь о бесшовной состыковке полигонов. Головой я понимаю, что если с одной стороны грань образована 2-мя точками, а с другой - 3 и более, то грань "не настоящая" и на ней будет щель, даже если все точки лежат на одной прямой.

Есть конечно "идея". Тот треугольник, чтр больше рендерить как полигон. с 2 и более точками на одной из граней. Только поможет ли это? Так вот быстро проверить я это не могу. Да и задуманная мной "оптимизация" рендеринга (вывод точек на рендер в виде массива) полетит к черту... Хотелось бы знать, пробовал ли ты? Или что ты думаешь по этому поводу?

P.S. А что за книжка? Стоит брать? Хотя бы для решения ЭТОЙ проблемы. (из 3D графики, у меня это единственный проект)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 11 авг 2005 08:34 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Что-то знал, но уже давно забыл ;(. Теперь думаю, чтобы щелей между полигонами не было их надо рендерить как одну фигуру.
Книга мне не понравилась. Написана очень тяжело, исходный код излишне академичен, но труд фундаментальный!
Посмотри исходники к книге. Хотя там тоже мало полупрозрачных полигонов и они не стыкуются.

Счас времени нет поискать по бесшовке, будет займусь.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 51 ]  На страницу 1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 37


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB