Уникнення z-бою з збігаються поверхнями


26

Під час надання двох співпланових поверхонь, що перекриваються, поширеною проблемою є "боротьба з", де рендер не може вирішити, яка з двох поверхонь ближче до камери, надаючи візуальні артефакти в зоні перекриття.

Стандартне рішення цього полягає в наданні поверхням невеликого зміщення при проектуванні моделі. Чи є якесь інше рішення?


2
Ви можете перевірити логарифмічні буферні глибини. Є стаття про gamasutra
Soapy

1
Коли ви говорите "планарний", ви маєте на увазі "майже" або "точно" співпланарний, і якщо останні, чи є ці поверхні колись однаковими поверхнями / трикутниками? Обладнання для візуалізації має бути детермінованим (якщо припустити, що ви не подаєте у випадковому порядку) для останнього випадку та не мати бойових дій. Якщо це стосується не ідентичних поверхонь, але точно співпланарних, чи можете ви оновити модель для поділу поверхонь на ділянки, що перекриваються та не перекриваються?
Саймон Ф

@SimonF, під "копланарним" я маю на увазі "точно співпланарний". Рішення Soapy працює лише у випадку "майже копланарного".
Марк

Чи можете ви навести приклад своїх поверхонь? Єдине, про що я можу придумати верхню частину голови - це повторювані трикутники, як згадував @SimonF.
RichieSams

@RichieSams - найпоширеніший випадок, який я можу придумати, - це відмітні знаки, де точно не потрібно дублювати трикутники.
rys

Відповіді:


10

Якщо поверхні точно співплануються, ваша доля залежить від богів ФПУ; ви, швидше за все, матимете Z-бої. Якщо трикутники ідентичні і ви зробити точний ж математику друг, ви будете в кінцевому підсумку з тим же Z-значення для обох. Але знову ж таки, це станеться лише в тому випадку, якщо ваші математичні операції однакові для обох. (Оскільки операції ППУ, як правило, не є комутаційними)

Одне з можливих рішень - взагалі не використовувати Z-буфер. Скоріше можна використовувати алгоритм художника . Зрозуміло, це пов'язано і з усіма проблемами алгоритму художників. Але це дозволило б вирішити Z-бої.

У вашому прикладі випадків скріншотів на екрані (SSD) загальним рішенням є використання зміщення, так само простого тонкого куба. Для ознайомлення дивіться презентацію Warhammer 40k про SSD. Або Барт Вронський в пості , який вирішує деякі інші проблеми з перекладними картинками, а й посилання на кілька інших презентації про SSD - накопичувачах


5
Повторне відображення тієї ж геометрії з тими ж перетвореннями надійно створює однакові значення глибини кожен раз. (Тобто це не сила , це заповіт ). Ось чому, наприклад, працює багатопрохідне освітлення вперед.
Натан Рід

@NathanReed виправлено. Дякую за роз’яснення
RichieSams

1
Щоб отримати цю функціональність, вам потрібно використовувати інваріантний класифікатор у glsl: opengl.org/wiki/Type_Qualifier_%28GLSL%29#Invariance_qualifiers
ashleysmithgpu

Зауважте, що однакових виразів шейдерів (і входів, очевидно) при оцінці вершинних позицій може бути недостатньо для отримання однакових результатів, оскільки деякі оптимізації можуть залежати від решти шейдера. У GLSL є ключове слово "інваріант" для оголошення виходів шейдерів, які повинні бути оцінені однаково в різних шейдерах.
Фірадеоклас

2

Ось як я це вирішив у минулому:

  1. Намалюйте перший об’єкт (той, який повинен з’явитися за іншим об’єктом) шляхом глибинного тестування, але не глибокого написання
  2. Намалюйте другий об’єкт шляхом глибинного тестування та глибинного запису. Це не спричинить боротьбу з z, оскільки ми не написали жодної глибини на кроці 1.
  3. Намалюйте перший об’єкт, лише записавши в буфер глибини, а не в кольоровий буфер. Це гарантує, що буфер глибини є актуальним для будь-яких пікселів, які охоплені об'єктом 1, але не об'єктом 2.

Зауважте, об’єкти потрібно малювати послідовно, щоб це працювало.


0

Залежно від рендерінга, ви можете зробити поверхні більш "нечіткими", застосувавши мізерне зміщення в глибині багатошарової зйомки, використовуючи алгоритм, подібний до шуму. Це повинно призвести до свого роду ефекту змішування для поверхонь, що знаходяться в глибокій близькості. Наскільки я знаю, налаштування глибини на зразок у фрагменті шейдера є досить недавньою у OpenGL, і тоді лише як розширення.

OpenGL має PolygonOffset, але вимагає заздалегідь знати, що ви збираєтеся зробити щось копланарним. Хоча це неможливо для поверхонь в межах однієї моделі, це може добре працювати, наприклад, коли візуалізується дорога, накладена на клаптик землі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.