Захотел реализовать мягкие тени по следующему алгоритму. В отдельные текстуры рисуются глубина сцены с позиции камеры и  собственно карта теней. После выводится полноэкранный квад, и во фрагментном шейдере тень размывается в соответвии с глубиной. Что-то типа depth-based blur. Споткнулся на самом простом - на матрицах. По идее, мы сначала переводим координаты точки из экранных обратно в мировые, а потом умножаем на матрицу источника освещения. Шейдер:

Код:
float fDepth = 2 * texture(depthTexture, texcoord).r - 1;	//получаем глубину сцены
vec4 inv_proj = inverseViewProjectionMat * vec4(vertex, fDepth, 1.0); //восстанавливаем мировые координаты, умножая на обратную матрицу
vec4 shadow_proj = shadowMat * inv_proj;	//переводим в проективные координаты источника освещения
float shadow = sampleShadow(shadow_proj); //получаем затененность, например через textureProj(shadowMap, shadow_proj);

В программе:

Код:
mat4 inv_matrix = view_camera.lock()->viewProjMat()._inverse();
mat4 shadow_matrix = bias * light_camera.lock()->viewProjMat();

На экран выводятся какие-то дикие полосы. Где я ошибаюсь?
UPD: Все, проблема решена. Если используете библиотеку GLM - никогда не пользуйтесь функцией matrix._inverse(), она работает неверно. Используйте лучше inverse(matrix).

Отредактировано lds (2012-02-19 13:45:41)