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