Russian Qt Forum
Ноябрь 23, 2024, 03:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Прорисовка сетки поверх полигонов  (Прочитано 17730 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #15 : Август 02, 2014, 14:05 »

Спасибо за участие
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Август 02, 2014, 14:43 »

Ну в общем этот есть и у меня, просто рендерю с анти-алиасом и цвет сетки 0.5 (благородный мышиный), поэтому дефект мало заметен - при кручении сцены линии сетки становятся толще/тоньше но не исчезают. При этом рисование линиями дает чуть лучший результат. Погуглил, да, штатное средство glPolygonOffset, но все мои попытки его задействовать ни к чему не привели. Вот "вдавить" сетку - пожалуйста, но это не нужно. А наоборот - все равно линии "играют". Неск лет назад пробовал с тем же рез-том - артефакты появляются, а качества сетки так и нет. Да, и полного единодушия в гугле нет, предлагаются какие-то альтернативные решения, типа "проблема актуальна".

Сейчас у меня еще геморрой - нужно выбирать вертексы с OpenGL, ситуация похожая - да, вроде есть средства, но какого-то четкого решения не видно. В общем OpenGL - это "Блеск и нищета куртизанок"  Улыбающийся
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #17 : Август 04, 2014, 08:28 »

На gamedev мне ответили
Цитировать
Я решил эту проблему рисованием сетки в геометрическом шейдере
Что это и как с этим работать? Меня пугает слово "шейдер". Это что-то сложное и долгое в изучении?

Попробовал с антиальясингом (16 сэмплов) - результат не удовлетворил. При повороте плоскости перпендикулярно обзору получается, что все линии с поверхности пропадают. При стандартной толщине линии.

Как-то, ведь, это делается... В hyper mesh чувствуется, сделано без сглаживания.
« Последнее редактирование: Август 04, 2014, 08:35 от __Heaven__ » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Август 04, 2014, 10:14 »

На gamedev мне ответили
Цитировать
Я решил эту проблему рисованием сетки в геометрическом шейдере
Что это и как с этим работать? Меня пугает слово "шейдер". Это что-то сложное и долгое в изучении?
Ну в общем да, не мед, программирование на GLSL очень специфично

Как-то, ведь, это делается... В hyper mesh чувствуется, сделано без сглаживания.
Из этого не следует что нужно только "нажать бубочку" (т.е. вызвать нужную ф-цию) и "вуаля". Конечно это было бы здОрово, но нет гарантии что это найдется. Если бы меня "припекло" я бы "приподнял" линии пересчитав для них вертексы (сдвинул бы их по нормалям) - ну это достаточно много писать
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #19 : Август 04, 2014, 11:09 »

Печаль...
Ладно, как найду решение - отпишусь
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Август 07, 2014, 18:36 »

Работает, "магические числа" (-2, -2) для второго прохода (рисование сетки)
Первоисточник http://www.felixgers.de/teaching/jogl/polygonOffset.html
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #21 : Август 08, 2014, 11:54 »

Магия не удалась. Сетка пробивается с задних слоёв.

Обрезал проект. (см. аттач)
для прорисовки необходимо открыть файлик геометрии из папки testFiles.
Так станет яснее моя проблема. Очень заметна проблема в исходном положении поворота. При вращении тоже линии просачиваются.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #22 : Август 27, 2014, 21:31 »

Я не знаю, почему я не догадался сделать это сразу, но сегодня я это сделал.
Вот что я сделал: создал 4 спинбокса для регулирования factor и unit полигон оффсетов заливки и сетки в режиме рантайм.
Долго игрался со спинбоксами - вращал модель. В общем, изголялся над своим детищем и собой.

Получается, что проблему решил, но осталось несколько вопросов.

Изначально ход мыслей был такой:
Имеется функция glDepthFunc, которая задаёт функцию сравнения глубины. По умолчанию её значение равно GL_LESS. Я подумал, что если я поставлю GL_LEQUAL, то при конфликте сетка-заливка будет прорисовываться только сетка. В итоге нет, даже антиальясинг и увеличение толщины линии не дали желаемого эффекта. Почему?

Далее я сделал предположение, что factor и units должны динамичеки изменяться от угла поворота (что судя по всему не так). Во время игр с цифрами пришёл к выводу, что сетку можно и не трогать, достаточно притопить заливку на фактор 0,7 и количество юнитов 0,3.

Игорь, огромная просьба к вам проверить эти значения в своем проекте без антиальясинга.
P.S.: во вложении отрисована КЭ модель без использования освещения  Подмигивающий
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #23 : Август 28, 2014, 06:45 »

Изначально ход мыслей был такой:
Имеется функция glDepthFunc, которая задаёт функцию сравнения глубины. По умолчанию её значение равно GL_LESS. Я подумал, что если я поставлю GL_LEQUAL, то при конфликте сетка-заливка будет прорисовываться только сетка. В итоге нет, даже антиальясинг и увеличение толщины линии не дали желаемого эффекта. Почему?
Для одной и той же точки: на первом проходе (с заливкой) depth вычисляется одним способов, на втором (линии) другим. Полученные значения очень близки но все же отличаются на какие-то микроны (в обе стороны) - ну просто так работают флоты. Поэтому GL_LEQUAL улучшает ситуацию но полностью проблему не решает.

Насколько я понял, сейчас принято это решать в шейдере используя gl_FragDepth

Игорь, огромная просьба к вам проверить эти значения в своем проекте без антиальясинга.
Слишком много завязано на AA, я не могу его просто так отключить. А с ним (0.7, 0.3) все то же - да, нормально, устраивает, но все-таки когда модель крутим интерактивно - какое-то подмигивание сетки есть
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #24 : Август 28, 2014, 07:22 »

Спасибо за быстрый ответ. Надеюсь, что сетка мигает из-за эффекта антиальясинга.
Все равно не понимаю, как так происходят вычисления, что 2+2=4, а потом 2+2=4+1E-100500
Мне казалось, что в первом приближении мы получаем глубину вершин, которая высчитывается одинаковыми методами и равна одному и тому же значению. Далее интерполируется область между вершинами. Не представляю, как её можно считать иначе.... Ну, наверное, это моя неосведомлённость в математике.
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #25 : Август 28, 2014, 07:37 »

Все равно не понимаю, как так происходят вычисления, что 2+2=4, а потом 2+2=4+1E-100500
Грубо говоря - Да.
С плавающей арифметикой это нормально, не все реальные числа можно представить числами с плавающей точкой.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #26 : Август 28, 2014, 07:46 »

Я это понимаю. Но дело в том, что у меня входные параметры в обоих случаях одинаковые и являются массивом float
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #27 : Август 28, 2014, 07:54 »

Я это понимаю. Но дело в том, что у меня входные параметры в обоих случаях одинаковые и являются массивом float
У вас да, но opengl тоже считает используя числа с плавающей запятой.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #28 : Август 28, 2014, 08:11 »

Я понял, что просто накапливается разная погрешность при каждой отрисовки.
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #29 : Август 28, 2014, 08:36 »

Я понял, что просто накапливается разная погрешность при каждой отрисовки.
Я бы не назвал это накапливанием погрешности, результаты нигде не накапливаются - все пересчитывается с нуля.
Скорее в результате пересчета получилось число, которое в двоичном виде (в числе с плавающей точкой) представить нельзя, и поэтому оно немного "скорректировалось", что бы туда вписаться.
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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