HLFX.Ru Forum > Теория и практика > OpenGL > Эффективная линеаризация глубины для скошенных пирамид видимости Моя первая статья по технологиям движка Volatile в журнале JCGT
Эффективная линеаризация глубины для скошенных пирамид видимости
Наконец-то вышла моя первая статья по компьютерной графике, посвящённая одной из технологий движка Volatile, а именно - методу эффективного декодирования буфера глубины при нестандартных (скошенных) матрицах проекции. Статья опубликована в довольно известном рецензируемом журнале Journal of Computer Graphics Techniques. Формально она вышла в конце декабря, но по факту - только в январе, редакторы немного затянули процесс. Статья на английском языке, но я привожу перевод абстракта на русский. В любом случае, там много формул и есть необходимый код, что, как известно, в переводе не нуждается.
Абстракт
Многие современные техники 3D-рендеринга оперируют глубинами фрагментов и требуют обращения к текстурам глубины, содержащим нелинейные значения глубин в пространстве окна. В большинстве случаев такие значения требуется привести к линейной форме перед использованием, в частности, чтобы сравнивать глубины фрагментов, выполнять арифметику в видовом пространстве или сравнивать глубины сцен, отрисованных с разными проекциями. Преобразование глубины из пространства окна в видовое пространство может оказаться сложным и неинтуитивным в случае скошенных пирамид видимости с изменённой ближней плоскостью отсечения, не параллельной общепринятой ближней плоскости. Такие проекции могут использоваться для эффективного и высокопроизводительного отсечения геометрии пользовательской плоскостью. В статье обсуждается метод эффективной линеаризации значений глубины для произвольных матриц проекции, что может быть использовано в пост-процессинге, эффектах фонового затенения и других зависящих от глубины сцены спецэффектах.
Краткие пояснения
Скошенная матрица проекции (oblique frustum, Lengyel's frustum) - это подход, предложенный компанией NVIDIA (2003) и развитый программистами E. Lengyel (2005) и Pranckevicius (2007). Такое отсечение очень эффективно, особенно на современных мобильных устройствах, да и на десктопах тоже. Однако ранее не затрагивались вопросы декодирования значений глубины. У меня возникла проблема линеаризации, когда я делал эффект сглаживания береговой линии для водного шейдера в движке Volatile, да и быстро стало понятно, что это может понадобиться для других эффектов. Я обобщил задачу до линеаризации глубины при использовании матриц произвольных проекций - и скошенных, и смещённых (востребованных в современных VR-техниках), и даже ортографических. Результат изысканий - эта статья. Приведены необходимые тонкости как для OpenGL, так и для Direct3D. Надеюсь, кому-то это пригодится.
Если вы заходите использовать идеи или код (а может, вообще впервые узнали о такой технике), просьба цитировать источник. Если проект опенсорсный - то можно прям в комментариях. Это, конечно, не обязательно и не даст мне никаких бонусов, но будет приятной мелочью.
Цитата:
Popov, A.V. An Efficient Depth Linearization Method for Oblique View Frustums // J. Comput. Graph. Techniques. - 2016. - V. 5. - N 4. - P. 36-43.
На картинке - линеаризованная глубина отражающейся в зеркале всем известной сцены на движке Volatile; зеркала и порталы используют подход скошенной матрицы проекции для отсечения геометрии по их плоскости.
XaeroX
Поздравляю с публикацией! Чувствуется научный подход .
Но можешь нам простым смертным объяснить в чем научная новизна и как конкретно оно тебе помогло сделать эффект сглаживания береговой линии?
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
XaeroX писал: ранее не затрагивались вопросы декодирования значений глубины
Цитата:
FiEctro писал: как конкретно оно тебе помогло сделать эффект сглаживания береговой линии
Цитата:
XaeroX писал: В большинстве случаев такие значения требуется привести к линейной форме перед использованием, в частности, чтобы сравнивать глубины фрагментов, выполнять арифметику в видовом пространстве
Проблема не в сглаживании как таковом, а в том, что способы линеаризации глубины, основанные только на значениях znear/zfar, которые можно найти в большинстве шейдеров и туториалов в сети, не работают со произвольными проекциями - только с "классическими".
Можешь объяснить простыми словами, насколько эргономичная технология (без или вместе ним)? Стоит ли ее вообще использовать будущем или уже архаичная фича (как DirectX9-10)? Будет ли benchmark, чтобы люди вообще визуально понимали о чем идет речь?
XaeroX ну, будет, что к выссеру приложить. Поздравляю с бубликацией.
Меня кинематографичность картинки в играх не особо интересует, так что, я в такие техники не лазил. Но, чувствую, сабж нужный и годный.
О, полезная штука, но у меня джва вопроса.
1. это будет работать при условии, что исходная глубина находится не в диапазоне 0-1, а скажем в диапазоне 0-0.7?
2. насколько хорошо этот механизм дружит с динамической системой zFar, когда дальность прорисовки меняется скачкоообразно, в зависимости от того, сколько лифов игроку видно из текущего лифа (стандартный механизм из той же ку3).
Дядя Миша писал: это будет работать при условии, что исходная глубина находится не в диапазоне 0-1, а скажем в диапазоне 0-0.7?
В целом да, но потребуется модификация: изменить scale/bias для правильного перевода из window-space z в view-space z.
Цитата:
Дядя Миша писал: насколько хорошо этот механизм дружит с динамической системой zFar
Декодирование будет правильным, но точность будет гулять вслед за zFar, причём для скошенных проекций - ещё сильнее, чем для обычных. Динамические zFar/zNear в принципе плохо дружат с линеаризацией. Зато метод вполне дружит с "бесконечным" zFar, ну как в дум3.
XaeroX писал: но точность будет гулять вслед за zFar, причём для скошенных проекций - ещё сильнее
Мдя. Так ты не стал у себя динамический zFar делать?
И вот еще что хотел спросить, на кой тебе скошеный фрустум понадобился вообще. Вон в доках по юнити какая-то хрень написана
Цитата:
Это делает перспективу на одном из краёв изображения кажущейся более плотной, передавая смотрящему ощущение, что он находится очень близко к видимому на этом крае объекту.
ну это явно не то, ради чего стоило бы так заморачиваться. Насчёт какого-то прироста производительности мне тоже сомнительно.
XaeroX писал: Ты статью-то почитай, там не только в приросте дело. Но и в нём тоже.
На сайте нвидии говорится, что с таким фрустумом уже нельзя произвольно клипплейны включать и выключать. А в качестве преимущества указано то, что nearclip типа бесплатный получается - видимокарта режет. Да хрен его знает, не вижу я пока смысла.
Ну что, у тебя на зеркалах вырос фпс?
Добавлено 07-01-2017 в 10:44:
А, вон еще чо забыл спросить. У тебя локальный фрустум тоже скошеный или только тот, что в перспективной матрице?
Дядя Миша писал: На сайте нвидии говорится, что с таким фрустумом уже нельзя произвольно клипплейны включать и выключать.
Можно точную цитату?
Цитата:
Дядя Миша писал: Ну что, у тебя на зеркалх вырос фпс?
В волатиле изначально в архитектуре не был заложен glClipPlane - поэтому и сравнить не получится. Но рендер упростился, разумеется - никаких GL_ClipPlane, никаких gl_ClipVertex, всё весьма просто и единообразно.
Добавлено 07-01-2017 в 14:47:
Цитата:
Дядя Миша писал: У тебя локальный фрустум тоже скошеный или только тот, что в перспективной матрице?
Тоже скошенный, разумеется - зачем мне во фрустуме объекты, которые будут отрезаны плоскостью зеркала?
Немного напутал. Там сказано, что эффект похож на тот, что достигается при включении клипплейна, однако его уже нельзя включить\выключить, подобно тем же клипплейнам.
Цитата:
XaeroX писал: Но рендер упростился, разумеется - никаких GL_ClipPlane, никаких gl_ClipVertex, всё весьма просто и единообразно.
Да я бы не сказал, что ClipPlane прям как-то уж чудовищно усложняет рендерер
HLFX.Ru Forum > Теория и практика > OpenGL > Эффективная линеаризация глубины для скошенных пирамид видимости Моя первая статья по технологиям движка Volatile в журнале JCGT