С этого сайта: http://www.catalinzima.com/?page_id=14Как это работает при вычислении карты глубины?
Я всегда был смущен тем, как рассчитывается карта глубины.
Функция вершинный шейдер вычисляет позицию следующим образом:
VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
VertexShaderOutput output;
float4 worldPosition = mul(input.Position, World);
float4 viewPosition = mul(worldPosition, View);
output.Position = mul(viewPosition, Projection);
output.TexCoord = input.TexCoord; //pass the texture coordinates further
output.Normal =mul(input.Normal,World); //get normal into world space
output.Depth.x = output.Position.z;
output.Depth.y = output.Position.w;
return output;
}
Что output.Position.z и output.Position.w? Я не уверен в математике за этим.
И в пиксельном шейдере есть эта строка: output.Depth = input.Depth.x/input.Depth.y;
Таким образом, выход.Depth выводится.Position.z/outputPOsition.w? Почему мы это делаем?
Наконец, в точке света шейдера (http://www.catalinzima.com/?page_id=55), чтобы преобразовать этот вывод будет позиция код:
//read depth
float depthVal = tex2D(depthSampler,texCoord).r;
//compute screen-space position
float4 position;
position.xy = input.ScreenPosition.xy;
position.z = depthVal;
position.w = 1.0f;
//transform to world space
position = mul(position, InvertViewProjection);
position /= position.w;
снова я не понимаю этого. Я как-то понимаю, почему мы используем InvertViewProjection, когда мы умножаемся на проекцию представления ранее, но все z и теперь w становятся равными 1, после чего вся позиция делится на w, меня немного путает.