Захотел реализовать мягкие тени по следующему алгоритму. В отдельные текстуры рисуются глубина сцены с позиции камеры и собственно карта теней. После выводится полноэкранный квад, и во фрагментном шейдере тень размывается в соответвии с глубиной. Что-то типа 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)