Как это работает при расчете карты глубины? - PullRequest
0 голосов
/ 11 ноября 2009

С этого сайта: 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;

Итак, output.Depth - это output.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, меня немного смущает.

1 Ответ

3 голосов
/ 11 ноября 2009

Чтобы понять это полностью, вам нужно понять, как работает алгебра, лежащая в основе 3D-преобразований. SO на самом деле не помогает (или я не знаю, как его использовать) выполнять математику, так что это должно быть без причудливых формул. Вот несколько объяснений высокого уровня:

Если вы присмотритесь, вы заметите, что все преобразования, которые происходят с положением вершины (от модели к миру для просмотра координат отсечения), используют 4D-векторы. Вот так. 4D. Почему, когда мы живем в трехмерном мире? Потому что в этом 4D-представлении все преобразования, которые мы обычно хотим сделать для вершин, можно выразить как умножение матриц. Это не в случае, если мы остаемся в 3D представлении. А умножение матриц - это то, в чем хорош графический процессор.

Что соответствует вершине в 3D в 4D? Вот где это становится интересным. Точка (x, y, z) соответствует линии (a.x, a.y, a.z, a). Мы можем взять любую точку в этой строке, чтобы выполнить математику, которая нам нужна, и мы обычно выбираем самую простую, a=1 (таким образом, нам не нужно выполнять умножение, просто установите w=1).

Так что это в значительной степени отвечает на всю математику, на которую вы смотрите. Чтобы спроецировать трехмерную точку в 4D, мы устанавливаем w = 1, чтобы вернуть компонент из вектора 4D, который мы хотим сравнить с нашими стандартными размерами в 3D, мы должны разделить этот компонент на w.

Эта система координат, если вы хотите погрузиться глубже, называется homogeneous coordinates.

...