Pergunta

A partir deste site: http://www.catalinzima.com/?page_id=14

Eu sempre fui confundido sobre como o mapa de profundidade é calculada.

O vértice shader posição calcula função da seguinte forma:

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;

}

O que são output.Position.z e output.Position.w? Eu não tenho certeza quanto às matemática por trás disso.

E no pixel shader não é esta linha: output.Depth = input.Depth.x / input.Depth.y;

Assim output.Depth é output.Position.z / outputPOsition.w? Por que fazemos isso?

Finalmente, no shader ponto de luz ( http://www.catalinzima.com/?page_id= 55 ) para converter essa saída para ser uma posição do código é:

 //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;

novamente eu não entendo isso. I classificar de ver porque nós usamos InvertViewProjection como nós multiplicar pela projeção vista anteriormente, mas toda a z e agora w sendo feitos para igual a 1, depois do qual a posição inteira é dividida por w me confunde um pouco.

Foi útil?

Solução

Para entender isso completamente, você precisa entender como a álgebra que sustenta transformações 3D obras. SO realmente não ajuda (ou eu não sei como usá-lo) para fazer matemática matriz, por isso vai ter que ser sem formulaes extravagantes. Aqui está uma explicação de alto nível que:

Se você olhar de perto, você verá que todas as transformações que acontecem a uma posição de vértice (de modelo para o mundo para ver a cortar coordenadas) passa a ser utilizando 4D vetores. Está certo. 4D. Por que, quando vivemos em um mundo 3D? Porque em que a representação 4D, todas as transformações que geralmente querem fazer para vértices são expresso como uma multiplicação de matrizes. Esta é não o caso se estadia em representação 3D. E produto de matrizes são o que uma GPU é bom.

O que um vértice no correspondem 3D no 4D? Este é onde fica interessante. O ponto (x, y, z) corresponde ao (a.x, a.y, a.z, a) linha. Nós podemos pegar qualquer ponto nesta linha para fazer a matemática que precisamos, e nós geralmente escolher o mais fácil, a=1 (dessa forma, não temos que fazer qualquer multiplicação apenas set w=1).

Assim que as respostas praticamente toda a matemática que você está olhando. Para projectar um ponto de 3D em 4D definimos w = 1, para voltar um componente de um vector 4D, que queremos comparar com os nossos tamanhos padrão em 3D, temos que dividir esse componente por w.

Este sistema de coordenadas, se você quiser mergulho mais profundo, é chamado homogeneous coordinates.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top