Краткая справка о том, где я нахожусь (чтобы убедиться, что мы на одной странице, и проверить работоспособность, если я упускаю / предполагаю что-то глупое):
- Цель: я хочу визуализировать мою сцену с тенями, используя отложенное освещение и карты теней.
- Борьба: поиск четкой и последовательной документации о том, как использовать shadow2D и sampler2DShadow.
Вот что я сейчас делаю:
В фрагментном шейдере моего последнего прохода рендеринга (тот, который фактически вычисляет окончательные значения фрагмента) у меня есть матрицы MVP из прохода с точки зрения света, текстура глубины из указанного прохода (также известная как «карта теней»), и текстуры положения / нормали / цвета из моего буфера геометрии.
Насколько я понимаю, мне нужно найти, какому UV на карте теней соответствует положение текущего фрагмента. Я делаю это следующим образом:
//Bring position value at fragment (in world space) to screen space from lights POV
vec4 UVinShadowMap = (lightProjMat * lightViewMat * vec4(texture(pos_tex, UV).xyz,1.0)).xy;
//Convert screen space to 'texture space' (from -1to1 to 0to1)
UVinShadowMap = (UVinShadowMap+1)/2;
Теперь, когда у меня есть этот УФ, я могу получить воспринимаемую «глубину» от точки обзора света с помощью
float depFromLightPOV = texture2D(shadowMap, UVinShadowMap).r;
и сравните это с расстоянием между позицией текущего фрагмента и источником света:
float actualDistance = distance(texture2D(pos_tex, UV).xyz, lightPos);
Проблема заключается в том, что «глубина» хранится в значениях 0–1, а фактическое расстояние - в мировых координатах. Я пытался выполнить это преобразование вручную, но не смог заставить его работать. И при поиске в Интернете мне СЛЕДУЕТ делать это с помощью sampler2DShadow ...
Итак, вот мои вопросы:
Какие изменения мне нужно внести, чтобы вместо этого использовать shadow2D? Что вообще делает shadow2D? Это просто более или менее автоматическое преобразование текстуры из глубины в мир? Могу ли я использовать такую же глубину текстуры? Или мне нужно отрендерить текстуру глубины по-другому? Что мне передать в shadow2D? Положение фрагмента в мировом пространстве, который я хочу проверить? Или такой же УФ как раньше?
Если бы на все эти вопросы можно было ответить на простой странице документации, я бы хотел, чтобы кто-нибудь мог просто опубликовать это. Но я клянусь, что искал часами и не смог найти ничего, что просто говорило бы, что, черт возьми, происходит с shadow2D!
Спасибо!