Недавно я реализовал мягкие тени, используя трассировку конуса вокселей в OpenGL 4.3, отслеживая конус в направлении света и накапливая значения непрозрачности. Voxel Cone Traced Soft Shadows
Главное, что я пытаюсь разрешить или скрыть это очень voxelized затенения эффекта как непроницаемая поверхность становится ближе к окклюдеру, а также скрыть явные пятна в тени из-за поверхностный voxelization. Я использую voxels с низким разрешением 64x64x64; однако, даже если я использую voxels с более высоким разрешением, некоторые из вокселей с низким разрешением на более высоком уровне мип-карты все еще фиксируются в трассировке.
Итак, вот что моя первая идея: я хочу, чтобы сохранить самые мягкие части тени, которая находится дальше всего, и заменить части тени, которая ближе к окклюдеру с теневой картой. Теневая карта будет исчезать, так как она находится дальше от каждого окклюдера, и я каким-то образом ее вложу в конус, прослеженный тени.
Может кто-нибудь придумать способ, чтобы выгорает тень далеко, основываясь на расстоянии от каждого объекта для теневой карты и тогда она плавно сливаться в конусе обогреваемой тени?
Еще одна идея, которую я хотел бы сделать, - это как-то проследить тени на поверхностях, которые ближе к окклюдеру, но это, вероятно, будет слишком дорого.
В качестве альтернативы, я хотел бы приветствовать любые другие идеи, которые помогут улучшить алгоритм мягкой тени.
Я также поставить видео, чтобы показать его в движении:
https://www.youtube.com/watch?v=SUiUlRojBpM
До сих пор не нашли способ решить проблему затенения.
+1 - наконец-то вопрос, который не на уровне новичка и не щекочет мой мозг :) Позвольте мне посмотреть, что я могу думать о ... – datenwolf
В алгоритме отслеживания конусов вы используете альфа-значение воксела для укажите, занят ли воксел или нет? Если это так, алгоритм mipmapping по умолчанию в opengl может не дать вам правильных результатов. Также вы используете разреженное представление octree voxel? – Slicedpan
Для косвенной диффузной и зеркальной картины я рисую трехмерную текстуру, компенсируя во всех 6 направлениях по 1 вокселю - для каждого уровня мип. Думаю, это дает мне 2x2x2 «кирпичей», если я правильно понял теорию. Я прослеживаю конус, пока значение непрозрачности не станет равным 1, и оно достигнет моего определенного максимального расстояния. Я заметил, что mipmapping по умолчанию не очень гладко, поэтому я думаю, что мои результаты должны улучшиться, если я использовал кирпичи 3x3x3 - при немного большей стоимости производительности? Я не использую octree структуру, но это в списке вещей для реализации. – gboxentertainment