forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Восстановление позиции по глубине (http://forum.boolean.name/showthread.php?t=19670)

mr.DIMAS 01.02.2015 16:38

Восстановление позиции по глубине
 
Нашел тут статейку: https://mynameismjp.wordpress.com/20...-from-depth-3/

Там предлагается очень быстрый способ восстановления позиции из глубины. Тоесть в пиксельном шейдере вместо умножения на матрицу( 4 MADD ) и деления - всего 5 операций, будет только умножение и сложение ( 1 MADD ) - 1 операция. Вроде все просто, но как обычно возникают косяки на пустом месте, а именно: я заменил код из своих шейдеров на код из статьи( первый кусок кода ), свет рассчитывается но он перемещается вместе с камерой. Что за ботва? Может кто-нибудь делал по этой методе восстановление позиции? Так же есть про восстановление позиции здесь: http://habrahabr.ru/company/mailru/blog/248873/но опять же у меня свет перемещается вместе с камерой.

ps. думаю tirarex'у и pozitiffcat'у тоже пригодится этот способ.

ABTOMAT 01.02.2015 18:10

Ответ: Восстановление позиции по глубине
 
Блин, умножил позицию на матрицу (model-)view-proj — получил координаты на экране с глубиной.
Их же умножил на обратную матрицу (model-)view-proj — получил назад изначальные координаты.
Какие ещё проблемы? Я так делал, даже не думал, что кто-то будет на эту тему всё разжёвывать.
Если у тебя там что-то не так, значит не на те матрицы умножаешь, вот и всё.

mr.DIMAS 01.02.2015 18:28

Ответ: Восстановление позиции по глубине
 
Ты вообще читал статью? Множить на invViewProj в пиксельном шейдере слишком жирно. Этот метод "в лоб" у меня работает хорошо - 120 фпс на средней сцене. Метод в статьях в первом посте дает 155 фпс, единственная проблема то что источник света перемещается вместе с камерой. 35 фпс никогда не бывают лишними.

Samodelkin 01.02.2015 19:03

Ответ: Восстановление позиции по глубине
 
Хмм.
Хорошие статьи, спс.
Ну я пока сам не прочитаю, я не смогу ответить на вопрос,
но есть одна догадка -- может быть это зависит от того в какиx координатах считается свет.
Например он может считаться во view space или даже в projection space и глубина восстанавливается для view или projection space.
А если свет считается во world space то видимо обратно восстановить до world space очень затратно и выше описанные методы ограничиваются view или projection space.

mr.DIMAS 02.02.2015 13:08

Ответ: Восстановление позиции по глубине
 
Ок. Вопрос вдогонку: нормализация вектора обычно занимает три ассемблерные команды: DP3, RSQ, MUL. Можно запихнуть единичные нормали в кубмапу, и читать их оттуда по значению любого не нормализованного вектора. Вопрос такой, выборка из кубмапы быстрее чем простая нормализация?

Mr_F_ 02.02.2015 13:10

Ответ: Восстановление позиции по глубине
 
Цитата:

Вопрос такой, выборка из кубмапы быстрее чем три операции?
на сегодняшнем железе очень вряд ли.
трюк тобой описанный применялся на заре шейдеров аля sm1_0, сейчас уже нигде не встречаю, арифметика стала в много раз шустрее выборок.

mr.DIMAS 02.02.2015 13:15

Ответ: Восстановление позиции по глубине
 
ок, Mr_F_ а ты пробовал восстанавливать позицию из глубины по методе в первом посте? Вроде же в 5 раз быстрее восстановление получается

Mr_F_ 02.02.2015 13:21

Ответ: Восстановление позиции по глубине
 
вроде пробовал, в крайзисе так же.

mr.DIMAS 02.02.2015 13:33

Ответ: Восстановление позиции по глубине
 
ок, а сравнивал производительность разных подходов?
и если есть док от крайтека по восстановлению позиции то скинь ссыль пожалуйста.

Mr_F_ 02.02.2015 13:57

Ответ: Восстановление позиции по глубине
 
Цитата:

ок, а сравнивал производительность разных подходов?
нет, если тебе не 100 раз в цикле это делать, там мизерная разница будет, я запаривался над разными подходами чтобы больше точности выжать только. И вот скажу, такой view space у меня точнее вышел, чем сохранять z/w и потом умножать на инверсную матрицу для восстановления.

Samodelkin 08.02.2015 00:38

Ответ: Восстановление позиции по глубине
 
Цитата:

Сообщение от Mr_F_ (Сообщение 292750)
вроде пробовал, в крайзисе так же.

2mr.DIMAS Я вроде тоже делал как Crysis в том примере для SSAO, который в теме TrueHorror выкладывал -- можешь там посмотреть (если там есть код в комплекте =) ).

Кстати в той презенташке про Skyforge перевернули числа Z-buffer'а для лучшего распределения точности, так что в 24 бита можно рисовать дистанцию до 50км (передняя плоскость отсечения 0.5м от камеры). Кто-нибудь пробовал так? Нет ли Z-fighting'а с ближлежащими мелкими объектами?

Помница в презентации Crysis-3 Z-buffer был тож 24 бита, но как паковали я не нашел (вроде ничего особого). А вот Mr_F_ ещё где-то выкладывал презенташку Jast Cause 2 с хитрой упаковкой глубины, как там по сравнению со Skyforge, лучше не?


Часовой пояс GMT +4, время: 06:16.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot