Russian Qt Forum
Ноябрь 23, 2024, 00:54
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
2D и 3D графика
>
Прорисовка сетки поверх полигонов
Страниц:
1
[
2
]
3
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Прорисовка сетки поверх полигонов (Прочитано 17715 раз)
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: Прорисовка сетки поверх полигонов
«
Ответ #15 :
Август 02, 2014, 14:05 »
Спасибо за участие
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Прорисовка сетки поверх полигонов
«
Ответ #16 :
Август 02, 2014, 14:43 »
Ну в общем этот есть и у меня, просто рендерю с анти-алиасом и цвет сетки 0.5 (благородный мышиный), поэтому дефект мало заметен - при кручении сцены линии сетки становятся толще/тоньше но не исчезают. При этом рисование линиями дает чуть лучший результат. Погуглил, да, штатное средство glPolygonOffset, но все мои попытки его задействовать ни к чему не привели. Вот "вдавить" сетку - пожалуйста, но это не нужно. А наоборот - все равно линии "играют". Неск лет назад пробовал с тем же рез-том - артефакты появляются, а качества сетки так и нет. Да, и полного единодушия в гугле нет, предлагаются какие-то альтернативные решения, типа "проблема актуальна".
Сейчас у меня еще геморрой - нужно выбирать вертексы с OpenGL, ситуация похожая - да, вроде есть средства, но какого-то четкого решения не видно. В общем OpenGL - это "Блеск и нищета куртизанок"
Записан
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: Прорисовка сетки поверх полигонов
«
Ответ #17 :
Август 04, 2014, 08:28 »
На gamedev мне ответили
Цитировать
Я решил эту проблему рисованием сетки в геометрическом шейдере
Что это и как с этим работать? Меня пугает слово "шейдер". Это что-то сложное и долгое в изучении?
Попробовал с антиальясингом (16 сэмплов) - результат не удовлетворил. При повороте плоскости перпендикулярно обзору получается, что все линии с поверхности пропадают. При стандартной толщине линии.
Как-то, ведь, это делается... В hyper mesh чувствуется, сделано без сглаживания.
«
Последнее редактирование: Август 04, 2014, 08:35 от __Heaven__
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Прорисовка сетки поверх полигонов
«
Ответ #18 :
Август 04, 2014, 10:14 »
Цитата: __Heaven__ от Август 04, 2014, 08:28
На gamedev мне ответили
Цитировать
Я решил эту проблему рисованием сетки в геометрическом шейдере
Что это и как с этим работать? Меня пугает слово "шейдер". Это что-то сложное и долгое в изучении?
Ну в общем да, не мед, программирование на GLSL очень специфично
Цитата: __Heaven__ от Август 04, 2014, 08:28
Как-то, ведь, это делается... В hyper mesh чувствуется, сделано без сглаживания.
Из этого не следует что нужно только "нажать бубочку" (т.е. вызвать нужную ф-цию) и "вуаля". Конечно это было бы здОрово, но нет гарантии что это найдется. Если бы меня "припекло" я бы "приподнял" линии пересчитав для них вертексы (сдвинул бы их по нормалям) - ну это достаточно много писать
Записан
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: Прорисовка сетки поверх полигонов
«
Ответ #19 :
Август 04, 2014, 11:09 »
Печаль...
Ладно, как найду решение - отпишусь
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Прорисовка сетки поверх полигонов
«
Ответ #20 :
Август 07, 2014, 18:36 »
Работает, "магические числа" (-2, -2) для второго прохода (рисование сетки)
Первоисточник
http://www.felixgers.de/teaching/jogl/polygonOffset.html
Записан
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: Прорисовка сетки поверх полигонов
«
Ответ #21 :
Август 08, 2014, 11:54 »
Магия не удалась. Сетка пробивается с задних слоёв.
Обрезал проект. (см. аттач)
для прорисовки необходимо открыть файлик геометрии из папки testFiles.
Так станет яснее моя проблема. Очень заметна проблема в исходном положении поворота. При вращении тоже линии просачиваются.
Записан
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: Прорисовка сетки поверх полигонов
«
Ответ #22 :
Август 27, 2014, 21:31 »
Я не знаю, почему я не догадался сделать это сразу, но сегодня я это сделал.
Вот что я сделал: создал 4 спинбокса для регулирования factor и unit полигон оффсетов заливки и сетки в режиме рантайм.
Долго игрался со спинбоксами - вращал модель. В общем, изголялся над своим детищем и собой.
Получается, что проблему решил, но осталось несколько вопросов.
Изначально ход мыслей был такой:
Имеется функция glDepthFunc, которая задаёт функцию сравнения глубины. По умолчанию её значение равно GL_LESS. Я подумал, что если я поставлю GL_LEQUAL, то при конфликте сетка-заливка будет прорисовываться только сетка. В итоге нет, даже антиальясинг и увеличение толщины линии не дали желаемого эффекта. Почему?
Далее я сделал предположение, что factor и units должны динамичеки изменяться от угла поворота (что судя по всему не так). Во время игр с цифрами пришёл к выводу, что сетку можно и не трогать, достаточно притопить заливку на фактор 0,7 и количество юнитов 0,3.
Игорь, огромная просьба к вам проверить эти значения в своем проекте без антиальясинга.
P.S.: во вложении отрисована КЭ модель без использования освещения
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Прорисовка сетки поверх полигонов
«
Ответ #23 :
Август 28, 2014, 06:45 »
Цитата: __Heaven__ от Август 27, 2014, 21:31
Изначально ход мыслей был такой:
Имеется функция glDepthFunc, которая задаёт функцию сравнения глубины. По умолчанию её значение равно GL_LESS. Я подумал, что если я поставлю GL_LEQUAL, то при конфликте сетка-заливка будет прорисовываться только сетка. В итоге нет, даже антиальясинг и увеличение толщины линии не дали желаемого эффекта. Почему?
Для одной и той же точки: на первом проходе (с заливкой) depth вычисляется одним способов, на втором (линии) другим. Полученные значения очень близки но все же отличаются на какие-то микроны (в обе стороны) - ну просто так работают флоты. Поэтому GL_LEQUAL улучшает ситуацию но полностью проблему не решает.
Насколько я понял, сейчас принято это решать в шейдере используя gl_FragDepth
Цитата: __Heaven__ от Август 27, 2014, 21:31
Игорь, огромная просьба к вам проверить эти значения в своем проекте без антиальясинга.
Слишком много завязано на AA, я не могу его просто так отключить. А с ним (0.7, 0.3) все то же - да, нормально, устраивает, но все-таки когда модель крутим интерактивно - какое-то подмигивание сетки есть
Записан
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: Прорисовка сетки поверх полигонов
«
Ответ #24 :
Август 28, 2014, 07:22 »
Спасибо за быстрый ответ. Надеюсь, что сетка мигает из-за эффекта антиальясинга.
Все равно не понимаю, как так происходят вычисления, что 2+2=4, а потом 2+2=4+1E-100500
Мне казалось, что в первом приближении мы получаем глубину вершин, которая высчитывается одинаковыми методами и равна одному и тому же значению. Далее интерполируется область между вершинами. Не представляю, как её можно считать иначе.... Ну, наверное, это моя неосведомлённость в математике.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Прорисовка сетки поверх полигонов
«
Ответ #25 :
Август 28, 2014, 07:37 »
Цитата: __Heaven__ от Август 28, 2014, 07:22
Все равно не понимаю, как так происходят вычисления, что 2+2=4, а потом 2+2=4+1E-100500
Грубо говоря - Да.
С плавающей арифметикой это нормально, не все реальные числа можно представить числами с плавающей точкой.
Записан
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: Прорисовка сетки поверх полигонов
«
Ответ #26 :
Август 28, 2014, 07:46 »
Я это понимаю. Но дело в том, что у меня входные параметры в обоих случаях одинаковые и являются массивом float
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Прорисовка сетки поверх полигонов
«
Ответ #27 :
Август 28, 2014, 07:54 »
Цитата: __Heaven__ от Август 28, 2014, 07:46
Я это понимаю. Но дело в том, что у меня входные параметры в обоих случаях одинаковые и являются массивом float
У вас да, но opengl тоже считает используя числа с плавающей запятой.
Записан
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: Прорисовка сетки поверх полигонов
«
Ответ #28 :
Август 28, 2014, 08:11 »
Я понял, что просто накапливается разная погрешность при каждой отрисовки.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Прорисовка сетки поверх полигонов
«
Ответ #29 :
Август 28, 2014, 08:36 »
Цитата: __Heaven__ от Август 28, 2014, 08:11
Я понял, что просто накапливается разная погрешность при каждой отрисовки.
Я бы не назвал это накапливанием погрешности, результаты нигде не накапливаются - все пересчитывается с нуля.
Скорее в результате пересчета получилось число, которое в двоичном виде (в числе с плавающей точкой) представить нельзя, и поэтому оно немного "скорректировалось", что бы туда вписаться.
Записан
Страниц:
1
[
2
]
3
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...