Назвіть кілька методів для прозорості у OpenGL


14

Альфа-змішування можна ввімкнути, щоб зробити поверхні прозорими, наприклад:

glDisable(GL_DEPTH_TEST); //or glDepthMask(GL_FALSE)? depth tests break blending
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Але це працює лише в тому випадку, якщо об'єкти надаються в передньому порядку. Інакше речі на задньому плані з’являються перед ближчими предметами, як підлога на зображенні нижче. Для частинок та елементів графічного інтерфейсу сортування було б нормальним, але для трикутних сіток здається, що це буде занадто багато зусиль та повільних, про що йдеться тут: https://www.opengl.org/wiki/Transparency_Sorting .

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

введіть тут опис зображення


Я не впевнений, чи має це відповісти чи ні, але помилки у вашому зображенні викликані рендерінгом без глибокого тестування всіх примітивів. Сцена повинна бути виконана за два проходи: Спочатку візуалізуйте звичайно всю суцільну геометрію. Після цього відключіть глибину запису (не GL_DEPTH_TEST) та надайте напівпрозору геометрію приблизно в порядку "назад-спереду". Це забезпечить, щоб прозора геометрія не була намальована перед суцільною геометрією, що знаходиться перед нею.
юрікс

@yuriks У цьому випадку це, мабуть, поганий приклад з мого боку, але все має бути прозорим. Мені хотілося щось показати, як може виглядати неправильна прозорість, якщо це зроблено погано. Також приклад, коли сортування геометрії було б дивовижно важким (наприклад, підлога тут - один гігантський багатокутник і охоплює весь діапазон глибин).
jozxyqk

Відповіді:


11

Набір методів уникнення явного замовлення переходить під назвою незалежної прозорості замовлення (коротко OIT).

Існує маса методик OIT.

Історично один - глибинний пілінг . При такому підході ви спочатку рендеруєте найбільш передні фрагменти / пікселі, потім ви знайдете найближчий до того, який знайшли на попередньому кроці тощо, продовжуючи стільки "шару", скільки вам потрібно. Його називають глибинним пілінгу, тому що при кожному проході ви "лущить" один шар глибини. Весь ваш шар може бути нормально рекомбінований зі спини вперед. Для реалізації цього алгоритму потрібно мати копію буфера глибини.

Інший набір методів - це суміші OIT. Один з найсвіжіших і цікавих - це зважений змішаний OIT, запропонований McGuire та Bavoil . В основному застосовується зважена сума для всіх поверхонь, які займають даний фрагмент. Запропонована ними схема зважування базується на просторі камери Z (як наближення до оклюзії) та непрозорості.
Ідея полягає в тому, що якщо ви зможете зменшити проблему до зваженої суми, вам не дуже важливо замовляти.

Окрім оригінального документу, в блозі Метта Петтінео є великий ресурс для детальних відомостей про впровадження та проблеми зваженого змішаного OIT . Як ви можете прочитати з його поста, ця техніка - це не срібна куля. Основна проблема полягає в тому, що схема зважування є центральною і її потрібно налаштовувати відповідно до сцени / змісту. З його експериментів, хоча ця техніка, здається, працює добре для відносно низької та середньої непрозорості, вона не вдається, коли непрозорість наближається до 1, і тому її не можна використовувати з матеріалів, де велика частина поверхні непрозора (він робить приклад листя).

Знову ж таки, все зводиться до того, як ви налаштовуєте глибинні ваги і знаходження тих, які ідеально відповідають вашим випадкам використання, не обов'язково є тривіальним.

Щодо того, що потрібно для зваженого змішаного OIT, не більше двох додаткових цілей рендерингу. Один, який ви заповнюєте попередньо розмноженим кольором альфа (колір * альфа) та альфа, обидва зважуються відповідно. Інший - лише для ваг.


6

Один з варіантів - використовувати глибокий пілінг.

По суті, один обробляє сцену безліч разів (скажімо, nрази), щоб визначити найближчий, другий-найближчий, весь шлях до nнайближчих фрагментів сцени.

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

Повторне застосування глибинного тесту поверне другий шар. Повторіть за потребою.

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


1
Спасибі! Схоже, мені знадобляться два буфери глибини для цього. Тобто одна для зберігання та фільтрації останніх глибин, а одна для проведення глибинного тестування для поточного візуалізації. Виправте мене, якщо я помиляюся, але я припускаю, що мені знадобляться дві текстури глибини для ФБО, які я розміщую між кожним пілінг-проходом.
jozxyqk

1
@jozxyqk Правильно, для цієї процедури необхідні два буфера глибини.
es1024

1

Creme de la creme з однопрохідним жодним (або кількома) компрометують прозорість у OpenGL - це A-буфер. За допомогою сучасного OpenGL можна реалізувати:

http://blog.icare3d.org/2010/06/fast-and-accurate-single-pass-buffer.html

Це дозволяє уникнути багаторазового проходження глибокого лущення і не потребує обтяжуючої сортування.


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