Ясно как создаем текстуру с глубинами
vs:
Output.Position = mul(inPos, xWorldLightViewProjection);
Output.Position3D = Output.Position;
ps:
output.Color = psIn.Position3D.z/psIn.Position3D.w;
При втором проходе с видом от камеры:
vs:
Output.Position = mul(inPos, xWorldViewProjection);
Output.Position3D = mul(inPos, xWorldLightViewProjection);
Получается что в обоих случаях Output.Position3D содержит одинаковое значение, но смысл построения тени именно на их различии. Откуда берутся разные значения Z для одних и тех же вершин к которым применялись одни и те же преобразования?
Armitage
> Получается что в обоих случаях Output.Position3D содержит одинаковое значение
Разве? а видовая матрица?
xWorldLightViewProjection = world * LightView *Projection — вид от источника света
Ты как-то непонятно задал вопрос. То есть первый проход - глубина, второй сама сцена? Тогда проекционная матрица? По крайней мере у меня она равна размеру текстуры
Armitage
> Откуда берутся разные значения Z для одних и тех же вершин к которым
> применялись одни и те же преобразования?
Вот этот вопрос я так и не понял. Output.Position3D из первого прохода не равно Output.Position3D из второго?
Может действительно непонятно, тогда спрошу так: в этой статьи http://takinginitiative.net/2011/05/15/directx10-tutorial-10-shadow-mapping/
описан шейдер
float4 PS_STANDARD( PS_INPUT input ) : SV_Target
{
//re-homogenize position after interpolation
input.lpos.xyz /= input.lpos.w;
//if position is not visible to the light - dont illuminate it
//results in hard light frustum
if( input.lpos.x < -1.0f || input.lpos.x > 1.0f ||
input.lpos.y < -1.0f || input.lpos.y > 1.0f ||
input.lpos.z < 0.0f || input.lpos.z > 1.0f ) return ambient;
//transform clip space coords to texture space coords (-1:1 to 0:1)
input.lpos.x = input.lpos.x/2 + 0.5;
input.lpos.y = input.lpos.y/-2 + 0.5;
//sample shadow map - point sampler
float shadowMapDepth = shadowMap.Sample(pointSampler, input.lpos.xy).r;
//if clip space z value greater than shadow map value then pixel is in shadow
if ( shadowMapDepth < input.lpos.z) return ambient;
//otherwise calculate ilumination at fragment
float3 L = normalize(lightPos - input.wpos.xyz);
float ndotl = dot( normalize(input.normal), L);
return ambient + diffuse*ndotl;
}
.мне непонятна ситуация когда возможно shadowMapDepth < input.lpos.z если это конкретное значение input.lpos.z вычисляется точно также как и значение глубины лежащее в сравниваемом пикселе текстуры
Armitage
> мне непонятна ситуация когда возможно shadowMapDepth < input.lpos.z если это
> конкретное значение input.lpos.z вычисляется точно также как и значение глубины
> лежащее в сравниваемом пикселе текстуры
Камеры то разные. Хотя если у тебя свет из глаз, то одинаковые.
И что с того что камеры разные? При построении Shadow map мы к каждой вершине применяем матричное преобразование вида от лампы, при построении сцены мы к каждой вершине применяем преобразование вида из камеры и также применяем преборазование вида от лампы, котрое записываем в input.lpos. Так почему же при одинаковых преобразованиях получаются одинаковые x, y, но разные z. Если я правильно понимаю то в самих вершинах значения одинаковые но при интерполяции возникает разница глубины. И вот этот момент мне не ясен.
Armitage
Когда камеры разные, пиксели тоже разные. Изначально разные. Почему разные пиксели после одинаковых преобразований должны иметь одинаковые координаты?
Кажется разобрался. Моей ошибкой было неправильное понимание того с чем работает пиксельный шейдер.
Тема в архиве.