2013-02-16 5 views
13

Недавно я реализовал мягкие тени, используя трассировку конуса вокселей в OpenGL 4.3, отслеживая конус в направлении света и накапливая значения непрозрачности. enter image description hereVoxel Cone Traced Soft Shadows

Главное, что я пытаюсь разрешить или скрыть это очень voxelized затенения эффекта как непроницаемая поверхность становится ближе к окклюдеру, а также скрыть явные пятна в тени из-за поверхностный voxelization. Я использую voxels с низким разрешением 64x64x64; однако, даже если я использую voxels с более высоким разрешением, некоторые из вокселей с низким разрешением на более высоком уровне мип-карты все еще фиксируются в трассировке.

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

enter image description here

Может кто-нибудь придумать способ, чтобы выгорает тень далеко, основываясь на расстоянии от каждого объекта для теневой карты и тогда она плавно сливаться в конусе обогреваемой тени?

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

В качестве альтернативы, я хотел бы приветствовать любые другие идеи, которые помогут улучшить алгоритм мягкой тени.

Я также поставить видео, чтобы показать его в движении:

https://www.youtube.com/watch?v=SUiUlRojBpM

До сих пор не нашли способ решить проблему затенения.

+1

+1 - наконец-то вопрос, который не на уровне новичка и не щекочет мой мозг :) Позвольте мне посмотреть, что я могу думать о ... – datenwolf

+1

В алгоритме отслеживания конусов вы используете альфа-значение воксела для укажите, занят ли воксел или нет? Если это так, алгоритм mipmapping по умолчанию в opengl может не дать вам правильных результатов. Также вы используете разреженное представление octree voxel? – Slicedpan

+0

Для косвенной диффузной и зеркальной картины я рисую трехмерную текстуру, компенсируя во всех 6 направлениях по 1 вокселю - для каждого уровня мип. Думаю, это дает мне 2x2x2 «кирпичей», если я правильно понял теорию. Я прослеживаю конус, пока значение непрозрачности не станет равным 1, и оно достигнет моего определенного максимального расстояния. Я заметил, что mipmapping по умолчанию не очень гладко, поэтому я думаю, что мои результаты должны улучшиться, если я использовал кирпичи 3x3x3 - при немного большей стоимости производительности? Я не использую octree структуру, но это в списке вещей для реализации. – gboxentertainment

ответ

0

Ну, в этом случае вы можете сделать это, добавив больше огней. Вы можете добавить больше световых лучей ближе к оригиналу, а затем составить тень света с тенями более близкого света. Это эффект «облачного света».

2

Я предполагаю, что артефакты «чистого пятна» происходят из-за больших размеров вокселей, которые частично заполнены геометрией: «накапливать значения непрозрачности». Сколько образцов вы принимаете при преобразовании из растеризованных пикселей в вокселы? Если объем образца/объем вокселей мал, тогда могут возникнуть проблемы с правильной прозрачностью рендеринга - там будет шум, обозначенный более светлыми областями.

Кроме того, зависит ваше направление вокселей от вокселей? Based on the author's original paper. Направленная зависимость важна для обеспечения правильного отображения полупрозрачных вокселей.

A quick picture to explain

«для теневой карты и затем он плавно сливаться в конусе обогреваемой тени?»

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

Отличная работа кстати.Я столкнулся с вашей проблемой, проводя предварительные исследования для собственной реализации DirectX для отслеживания кодов на вокселях.

[Редактировать]

я понял, что я сделал опечатку в изображении. Изображение справа должно быть 4/64, а не 4/16. Я забыл о измерении Z.

+0

Рад видеть других ppl, также работающих над этой техникой. Я не использую направленную прозрачность. Я изначально планировал заменить мою поверхность вокселизацией твердой вокселизацией, которая должна избавиться от отверстий, а также устранить «полые» зеркальные отражения (т. Е. Мои зеркальные отражения прозрачны из-за полупрозрачного смешения вокселей). Мой страх использовать направленно зависимые вокселы заключается в том, что он будет стоить значительно дороже, чем использование солидной вокселизации. – gboxentertainment

 Смежные вопросы

  • Нет связанных вопросов^_^