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

Стекла и зеркала без рейтресинга.

Страницы: 1 2 3 4 Следующая »
#0
(Правка: 20:41) 20:29, 12 окт. 2020

Я как-то описывал здесь алгоритм позволяющий делать зеркальные поверхности без стенсила и рейтресинга. Народ тогда выразил сомнения.
Вот я наконец закончил дизайн проекта где этот метод используется. Помимо отражения как такового, можно делать бесконечное отражение (зеркало напротив зеркала) и отражение на неплоской поверхности. Первое я не нашел где применить (хотя смотрится прикольно), второе используется в отражении в поверхности стола (она неровная, но это видно вблизи).

Вот картинка:
Fractal Alchemist | Стекла и зеркала без рейтресинга.

Там еще с другой стороны 6 стеклянных полок. Они прозрачные, но при этом зеркальные если смотреть под углом. FPS на все эти извраты почти не расходуется - у меня ВР хедсет (Index) дает 120 фпс, причем это два глаза. Т.е. на все про все у меня всего 4 мс. Но карты от 1080 и выше справляются. AMD R9 Nano не тянет на 120 гц, но на 90 герцах уже успевает. Что бы было понятно - 90 Гц в ВР это 180 если на обычном экране.

P.S. Во, только на картинке заметил багу - у меня обратная сторона зеркала в колбе не отражается. Я забыл сами зеркала включить в рендер для отражении. Надо будет поправить. :)


#1
20:58, 12 окт. 2020

san
По картинке особо не заценишь, нужна демка.

#2
21:15, 12 окт. 2020

san
хорошо выглядит, интересно, что за метод с отражениями? у тебя элементы инвентаря полигонами или процедурно?

#3
(Правка: 13 окт. 2020, 1:59) 21:37, 12 окт. 2020

Демку сделаю, просто сегодня только в 2 часа ночи все закончил и кинул на Стим. Щас сил нет ни на что...

Ruslan
> что за метод с отражениями?

Метод я публиковал, вот он тут:
-——————————-
Метод основан рендере в текстуру и на XMMatrixPerspectiveOffCenterRH.
В чем там суть - эта функция может поворачивать (смещать) вьюпорт не трогая фрустум. Надо только определить положение вертексов в углах зеркала и поставить их координаты в качестве плоскостей отсечения. Перед этим надо повернуть зеркало, что бы оно лежало вертикально по оси к камере. Короче вот код (если интересно):

                XMVECTOR mirrorPlane = XMVectorSet(mirrorNorm.x, mirrorNorm.y, mirrorNorm.z, -mirrorPos.y);
                XMMATRIX ReflectionView = XMMatrixReflect(mirrorPlane);
                XMVECTOR phantomPos = XMVector3Transform({ Eye.Pos.x, Eye.Pos.y, Eye.Pos.z }, ReflectionView);

                XMVECTOR up = XMVectorSubtract(v1, v0);
                XMFLOAT3 N; XMStoreFloat3(&N, mirrorPlane);
                XMVECTOR mirrorN = XMVectorSet(N.x, N.y, N.z, 0);

                XMMATRIX matView = ReflectionView*XMMatrixLookToLH(phantomPos, {0, 1, 0 }, up);

                XMFLOAT3 topLeft;                        XMStoreFloat3(&topLeft, XMVector3TransformCoord(v2,  matView));
                XMFLOAT3 bottomRight;              XMStoreFloat3(&bottomRight, XMVector3TransformCoord(v1, matView));

                XMMATRIX matProj = XMMatrixPerspectiveOffCenterRH(topLeft.x, bottomRight.x, bottomRight.y, topLeft.y, topLeft.z, 1000.0f);

                XMMATRIX FinalMatrix = matView * matProj;

v0, v1, v2, v3  это координаты вертексов зеркала.

Метод достаточно простой, но имеет ряд очень серьезных бенефитов по сравнению со стенсилом:
Во первых легко делать заблуренное отражение.  А это очень часто актуально, идеальных зеркал не так много.
Во вторых можно делать что-то вроде имитации отражения в неровно лежащей плитке. Я такое увидел у Окулуса и обалдел – это же рейтресинг! Но потом понял, что это фейк. Но они не рендерят в текстуру, там что-то другое (у них отражение не полностью соответствует предметам). А делов-то просто делать сдвиг текстурных координат в зависимости от карты неровностей в другой текстуре. Выглядит очень реалистично, а на стенсиле фиг такое сделаешь.
В третьих можно делать «зеркало-в-зеркале» и вообще множественные отражения. Для этого достаточно иметь две текстуры с отражениями и менять их местами как свопчейн. «Скорость света» конечно будет не бесконечная, но так даже прикольнее. Отставание отражения на один кадр можно пережить. Этот эффект вообще даже на рейтресинге мало кому под силу.
В четвертых корректно отображаются (полу)прозрачные предметы, теперь если за/под ними зеркало, то видно отражение через стенки, а со стенсилом там было видно то, что лежит под зеркалом.

Недостаток по сравнению со стенсилом только один – если «уткнуться в зеркало носом», то качество отражения падает из-за разрешения текстуры. Но не думаю что это как-то критично.

Код мы родили совместно с Геной Ригеуром из AMD, это он предложил использовать OffCenter. Про эту функцию вообще мало кто знает. Сейчас я хочу предложить ему написать статью на эту тему, если он сподобится - выложу на геймдев перевод. Ну а если будт лениться - сам статью напишу. На русском. (Статью так и не написали. Ни я, ни Гена...)

По моему это интересный метод и совершенно не отраженный в литературе и на просторах Интернета.

-—————-

>у тебя элементы инвентаря полигонами или процедурно?
Тут все традиционно сделано. На решетках. Кроме гор и неба - они сгенерированы.

Вот еще пара картинок, это я голову повернул.

screenshot6 | Стекла и зеркала без рейтресинга.
screenshot7 | Стекла и зеркала без рейтресинга.
#4
22:28, 12 окт. 2020

san
> Метод основан рендере в текстуру и на XMMatrixPerspectiveOffCenterRH.
Помню, обсуждали этот метод. Но как это:
> делать бесконечное отражение (зеркало напротив зеркала)
Или каждое отражение, чем глубже вложено, тем сильнее отстаёт? Тогда понятно.

#5
22:39, 12 окт. 2020

Mikle
Ага, именно так. Но это выглядит очень прикольно - каждое отражение отстает от другого на кадр. Если покачивать одно зеркало, то "змейка" отражений в другом начинает извиваться.

#6
22:46, 12 окт. 2020

Может я чего-то не врубил, но это не просто планарное отражение с рендером в текстуру? (и куллингом через края зеркала)
Не понял насчёт неплоских поверхностей - знаю, что можно планар достаточно убедительно дистортнуть нормалкой, или у тебя что-то сложнее?

#7
(Правка: 0:42) 0:01, 13 окт. 2020

Mr F
Да, это планарное отражение с рендером в текстуру. Ничего сверхестественного тут нет.  Сложность была с ее реализацией, поскольку преобразование матрицы для такого случая весьма нетривиальна, а конкретной информации в интернете по сути нет. Странно почему - метод то простой и эффективный.

> можно планар достаточно убедительно дистортнуть нормалкой, или у тебя что-то сложнее?
Ну я же написал: "А делов-то просто делать сдвиг текстурных координат в зависимости от карты неровностей в другой текстуре. Выглядит очень реалистично, а на стенсиле фиг такое сделаешь."

#8
0:23, 13 окт. 2020

С матрицей действительно хороший прикол. Я юзал подобное для апдейта импосторов объектов (какбэ кропая их проекцию из экрана), но для отражений не додумался юзать. При блюре не ловил косяк, что начинает с краев зеркала протекать окружающий фон?

#9
0:30, 13 окт. 2020

Mr F
А с чего он туда будет протекать? Текстура изначально содержит четкое отражение. Ты ее блуришь (или берешь мипмап) в момент ее рендера. Другие объекты к этому отношения не имеют.

#10
1:05, 13 окт. 2020

san
Я чего-то подумал, что в одну общую текстуру экранного размера пихаешь разные отражения разных планаров. Если у каждого зеркала своя текса разного размера, то проблемы может и не быть.

#11
1:55, 13 окт. 2020

Mr F
Разумеется у каждого зеркала своя текстура. Там достаточно 256х256 - все хорошо видно и заполняется быстро. Текстура натянута на квад поверхности зеркала.  Проблема была в матрице для рендера в этого квад. Код, который я привел, эту проблему решает. Как это выглядит видно на картинках. Никаких артефактов нет, кроме случая когда упрешься в зеркало носом и не хватит разрешения, но тут можно просто выводить заблуренную картинку - отражение будет не в фокусе, а на него выводишь слегка поцарапанную поверхность стекла. Получается очень реалистично. Это видно например на зеркале с первой картинки в верхнем правом углу.

#12
11:04, 13 окт. 2020

А можно сделать простую демку с 2 зеркалами друг напротив друга, например так?
Интересно как это будет выглядеть.
ывывапывапыва | Стекла и зеркала без рейтресинга.

#13
12:32, 13 окт. 2020

Демку в студию!

#14
12:35, 13 окт. 2020

nes
> Сейчас я хочу предложить ему написать статью на эту тему, если он сподобится -
> выложу на геймдев перевод.
Отлично, ждем.
Уже хочу себе такое.

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумГрафика