2009-11-11 4 views
0

С этого сайта: 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, меня немного путает.

ответ

3

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

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

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

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

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

Смежные вопросы