Я пытаюсь создать объект с самозатенением (opengl/glsl). Шаги, которые я сделал были таковы:теневые карты, трюк woo, пилинг глубины
1- Визуализируйте сцену от света, чтобы получить карты глубины
2- Render от положения камеры и рассчитать расстояние от каждой точки к источнику света, если расстояние от точка на свет больше глубины, хранящейся на карте глубины, точка находится в тени.
, но затем возникает проблема теневых угрей. поэтому второй шаг будет выглядеть так:
2- ... if (abs (DISTANCE_OF_THE_POINT_TO_LIGHT - DEPTH_STORED_IN_THE_DEPTH_MAP)> BIAS) точка находится в тени.
но все же это не дает мне хороших результатов (нет подходящего значения смещения).
Итак, я применил трюк woo (найдя первую и вторую поверхности из света, а затем сохранил среднюю точку в буфере глубины). Для этого я сделал двухпроходную глубину пилинга. Этапы:
1- Извлеките сцену из света, чтобы получить карту глубины, как обычно.
2 - Извлеките сцену из света, чтобы получить карту глубины 2, если расстояние до точки света равно расстоянию на карте 1-й глубины, отбросьте такую точку (то есть не отрисуйте первую слой).
3- Магазин в качестве окончательной карты глубины (первая карта глубины + 2-я карта глубины)/2
4- Рендер от положения камеры и рассчитать расстояние от каждой точки к источнику света, если расстояние от точка на свет больше глубины, хранящейся на карте глубины, точка находится в тени.
проблема возникает сейчас на шаге 2, той же самой проблемой, с которой мы столкнулись раньше: когда первый и второй уровни близки, появляются ошибки округления и появляется какая-то акне, и нет подходящего значения смещения. , так что я не получаю никакой пользы от алгоритма woo, он просто перемещает проблему на часть шероховатости.
как вы можете это решить?
Я никогда не слышал трюк woo. Джон Кармак предложил подобный трюк много лет назад, используя переднее лицо, а затем обратную визуализацию лица вместо глубинного пилинга. –