Войти
ПрограммированиеФорумГрафика

Reconstructing Position from Depth (2 стр)

Страницы: 1 2
#15
10:55, 14 янв. 2015

Скорее всего проблема с

view_dir = vec3(m_view_proj * vec4(v_position.xy, camera_near, 1.0));

не та длина вектора (оказалось near = 0.1), позже проверю.

veth
пробовал делать near например 100 ? результат корректен ?


#16
16:16, 14 янв. 2015

Sergio
Так подобные матрицы для этого и придумали и видеокарта работает с ними просто на ура, зачем использовать что-то другое? :)
Получить во View-Space? Умножьте на InvProjection. Ставлю сто баксов, что с матрицами это дело будет быстрее работать на видеокарте, чем финты с линеаризацией.

#17
16:44, 14 янв. 2015

оставлю пока тут http://www.derschmale.com/2014/01/26/reconstructing-positions-fro… depth-buffer/

#18
20:15, 14 янв. 2015

Так, все, поборол, ошибка была передавать "m_view_proj" как inverse(proj * view), нужно по отдельности inv_view и inv_proj.

Код шейдеров такой -

+ Показать

Особый момент с mat3(inv_view), нам нужно только вращение.

Спасибо всем отписавшим.

#19
20:41, 14 янв. 2015

Mikey
Если нужно только вращение в View - выкинь translation составляющую из матрицы.
Я до сих пор не понимаю, зачем нужно линеализировать буффер глубины, для того, что-бы восстановить позицию достаточно знать значение глубины и текущие UV.
Просто умножив float4(UV.xy, depth, 1) на InvViewProjection и разделив результирующий вектор на W-компоненту: (total.xyz /= total.w); UV.xy нужно проводить к виду [-1:1].

И это как вообще? Я могу найти обратную матрицу View и Projection, но не могу найти обратную матрицу результата умноженний View и Projection.

Ах, костыли, костыли.

#20
20:48, 14 янв. 2015

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

#21
20:52, 14 янв. 2015

Mikey
А почему? Копеечное умножение одного вектора на одну матрицу смущает?

#22
21:45, 14 янв. 2015

нету счетчика фпс что бы оценить производительность, но мне этот способ показался интереснее

#23
22:29, 14 янв. 2015

Mikey
Производительность линеаризации будет хуже из-за нетипичности проводимых операций, шейдер заточен под работу с матрицами. Описанный метод через линеаризацию выглядит следующим образом:

Цель, сложить 3 + 4 и получить результат - 7.
В костыльном случае - (log(4 * 500 - 1991) - 0.16992500144) + ln(1097.0000001) - 4.00033446037 = 7
В не костыльном случае - 3 + 4 = 7

#24
23:03, 14 янв. 2015

forhaxed
Умножение на матрицу - 4 dot product 4-х мерных векторов, или 16 умножений и 12 сложений, сколько умножений и сложений в "нашем" варианте - сам посчитаешь? Или ты думаешь, что есть некая "волшебная" функция, которая за один такт умножает mat4 на vec4?

#25
23:04, 14 янв. 2015

Mikey
Зачем тебе world-space, если все можно делать во view-space? Ты мою демку смотрел?

#26
23:07, 14 янв. 2015

Sergio
Смотрел код, не запускал. Сейчас перешел в screen space, пробую прикрутить SSAO. Смотрел слайды (Крайтека вроде), там говорилось про освещение в World Space (но я так и не понял почему не в screen space).

#27
23:22, 14 янв. 2015

Sergio
1) А сколько даст операций умножений функция pow(x, 10)? 10?
2) А сколько тактов будет выполняться операция sincos(x)? 2?
3) Дело в том, что видеокарта заточена работать с матрицами, и далеко не факт, что в данном случае, в "вашем" примере будет работать быстрее.

#28
0:11, 15 янв. 2015

forhaxed
> 1) А сколько даст операций умножений функция pow(x, 10)? 10?
> 2) А сколько тактов будет выполняться операция sincos(x)? 2?
А где ты увидел pow и sincos в восстановлении view-space положения по глубине? :)

> 3) Дело в том, что видеокарта заточена работать с матрицами, и далеко не факт,
> что в данном случае, в "вашем" примере будет работать быстрее.
Не очень понимаю, что значит "заточена работать с матрицами" в данном случае.

В общем, тестовое приложение решит наши споры.

Страницы: 1 2
ПрограммированиеФорумГрафика

Тема в архиве.