Буфер глубины 360 FOV по топологии и 2D-теням с несколькими источниками света

Только что реализовал идею с несколькими источниками света (идея без нескольких источников света здесь буфер глубины 360 FOV по топологии и 2D-теням), однако я не уверен, правильно ли он отображается http://www.youtube.com/watch?v=bFhDiZIHlYQ, я просто визуализирую каждую сцену на экране с помощью GraphicsDevice.BlendState = BlendState.Additive; по отношению к свету, поэтому сцены просто складываются друг в друга.

И вопрос - это казалось правильным или нет?


person Oleg Skripnyak    schedule 02.10.2015    source источник


Ответы (1)


Чтобы ответить на вопрос. Извините, нет, но я был испорчен, позвольте мне объяснить.

Человеческий глаз логарифмический. Чтобы воспринимать что-то вдвое более яркое, нам нужно возвести в квадрат количество света, попадающего в наши глаза. То же самое касается звука.

Тем не менее, значения RGB экрана являются линейными RGB 128,128,128, что в два раза ярче, чем 64,64,64. Он должен быть линейным, иначе наши алгоритмы затенения не будут работать. Падение было бы слишком быстрым.

Нет, наши расчеты неверны, но люди, которые производят наши экраны, знают об этом и исправляют, как могут.

Вместо того, чтобы объяснять мне, посмотрите это Цвет компьютера YouTube нарушен

Таким образом, чтобы получить правильный микс, вам нужно создать правильный микс между двумя рендерами. Для решения этой проблемы нет состояния смешивания, поэтому вам придется создать собственный пиксельный шейдер, чтобы выполнить эту работу. output.color = sqrt(pow(input1.color, 2) + pow(input2.color, 2));

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

Я выполняю все расчеты рендеринга и освещения в виде подсчета фотонов, возведения в квадрат входных цветов и извлечения выходных цветов с квадратным корнем.

Что с альфой? Ага? Я не уверена.

person Blindman67    schedule 01.11.2015
comment
Спасибо за объяснение! И я могу сделать это в пиксельном шейдере на самом деле, однако хорошо, что вы не видите других артефактов, таких как тени с краями (в реальном мире они должны исчезнуть, поскольку фотоны проходят край препятствия, они должны превращаться в тень) направление случайным образом), или мощность света рассчитывается линейно, но должна рассчитываться как квадратный корень из расстояния. Просто думаю, как решить 1-ю проблему, и, как всегда, понятия не имею :( ссылка возможно трафаретный буфер может помочь... - person Oleg Skripnyak; 07.11.2015
comment
Я еще раз посмотрел демонстрацию на YouTube. У меня нет доступа к самому быстрому интернету, поэтому первый просмотр был в низком разрешении. Я снова посмотрел демо в высоком разрешении. Кажется, у вас происходит что-то еще странное, я не могу понять. Что касается размытия, чит для этой карты теней состоит в том, чтобы размыть край тени по интенсивности света, чем меньше света, тем сильнее размытие. Это не идеально, но если не переусердствовать, края станут лучше., - person Blindman67; 07.11.2015
comment
на самом деле здесь нет размытия, как мы делаем при постобработке путем суммирования пикселей, но есть хитрость в пиксельных шейдерах - я знаю угол между положением пикселя и положением источника света с помощью atan2, но также знаю углы первой и второй вершин линии, которая отбрасывает тень, поэтому я просто проверяю, находится ли пиксель в размытом диапазоне 0,1 градуса, и вычисляю цвет по выражению minAngle ‹= 0,1? (0.1 - minAngle) * 10 : 0. Но проблема в том, что когда на видео 2+ препятствия, как на 0:05 (его теневой буфер), каждое препятствие не затеняет внутреннее пространство, они работают как отдельные препятствия и делают их размытие :( - person Oleg Skripnyak; 07.11.2015
comment
Что ж, большую часть проблем я решил :) Пришлось дважды рендерить в буфер глубины и размытия (с разными блендингами, маскируя каналы), так что теперь эти строки VS-буфера рендерились 4(!) раза. Конечно, я мог бы рендерить в разные цели рендеринга с помощью одного прохода VS, однако тогда в PS (где я рендерю карту теней) я бы получил доступ к 2 разным текстурам. В VS произошло много логики, но PS максимально упростили. Вот неоптимизированная .fx ссылка - person Oleg Skripnyak; 14.11.2015