ПрограммированиеФорумГрафика

Пояснение Shadow Mapping

#0
16:50, 6 мая 2013

Ясно как создаем текстуру с глубинами
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 для одних и тех же вершин к которым применялись одни и те же преобразования?

#1
17:01, 6 мая 2013

Armitage
> Получается что в обоих случаях Output.Position3D содержит одинаковое значение
Разве? а видовая матрица?

#2
17:05, 6 мая 2013

xWorldLightViewProjection = world * LightView *Projection — вид от источника света

#3
17:24, 6 мая 2013

Ты как-то непонятно задал вопрос. То есть первый проход - глубина, второй сама сцена? Тогда проекционная матрица? По крайней мере у меня она равна размеру текстуры

Armitage
> Откуда берутся разные значения Z для одних и тех же вершин к которым
> применялись одни и те же преобразования?
Вот этот вопрос я так и не понял. Output.Position3D из первого прохода не равно Output.Position3D из второго?

#4
17:37, 6 мая 2013

Может действительно непонятно, тогда спрошу так: в этой статьи 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 вычисляется точно также как и значение глубины лежащее в сравниваемом пикселе текстуры

#5
19:51, 6 мая 2013

Armitage
> мне непонятна ситуация когда возможно shadowMapDepth < input.lpos.z если это
> конкретное значение input.lpos.z вычисляется точно также как и значение глубины
> лежащее в сравниваемом пикселе текстуры
Камеры то разные. Хотя если у тебя свет из глаз, то одинаковые.

#6
21:42, 6 мая 2013

И что с того что камеры разные? При построении Shadow map мы к каждой вершине применяем матричное преобразование вида от лампы, при построении сцены мы к каждой вершине применяем преобразование вида из камеры и также применяем преборазование вида от лампы, котрое записываем в input.lpos. Так почему же при одинаковых преобразованиях получаются одинаковые x, y, но разные z. Если я правильно понимаю то в самих вершинах значения одинаковые но при интерполяции возникает разница глубины. И вот этот момент мне не ясен.

#7
23:43, 6 мая 2013

Armitage
Когда камеры разные, пиксели тоже разные. Изначально разные. Почему разные пиксели после одинаковых преобразований должны иметь одинаковые координаты?

#8
11:06, 7 мая 2013

Кажется разобрался. Моей ошибкой было неправильное понимание того с чем работает пиксельный шейдер.

ПрограммированиеФорумГрафика

Тема в архиве.