문제

이 사이트에서 : 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;

다시 이해가 안 돼요. 나는 우리가 이전에 뷰 프로젝션을 곱할 때 ververViewProjection을 사용하는 이유를 알 수 있지만, 전체 z와 이제 전체 z가 1로 만들어졌으며, 그 후 전체 위치는 저를 꽤 혼란스럽게합니다.

도움이 되었습니까?

해결책

이것을 완전히 이해하려면 3D 변환을 뒷받침하는 대수가 어떻게 작동하는지 이해해야합니다. 따라서 매트릭스 수학을 수행하는 데 실제로 도움이되지 않거나 사용하는 방법을 모릅니다. 따라서 멋진 공식이 없어야합니다. 그러나 다음은 몇 가지 높은 수준의 설명입니다.

면밀히 살펴보면 정점 위치 (모델에서 전 세계에서 클립 좌표로 보는 것)로 발생하는 모든 변환이 4D 벡터를 사용하고 있음을 알 수 있습니다. 좋아요. 4d. 왜 우리가 3D 세계에 살 때? 그 4D 표현에서, 우리가 일반적으로 정점으로하고 싶은 모든 변환은 매트릭스 곱셈으로 표현 될 수 있습니다. 이것은 ~ 아니다 우리가 3D 표현을 유지하는 경우. 그리고 매트릭스 곱셈은 GPU가 잘하는 것입니다.

3D의 정점은 4D에서 어떤 일치에 해당합니까? 이것은 흥미로워지는 곳입니다. 그만큼 (x, y, z) 점은 선에 해당합니다 (a.x, a.y, a.z, a). 우리는이 라인의 모든 지점을 잡을 수 있으며 필요한 수학을 할 수 있으며, 보통 가장 쉬운 것을 선택합니다. a=1 (그런 식으로, 우리는 곱셈을 할 필요가 없습니다. w=1).

그래서 당신이보고있는 모든 수학에 대한 답변. 4D에서 3D 포인트를 투사하기 위해 W = 1을 설정하고 4D 벡터에서 구성 요소를 되 찾으려면 3D의 표준 크기와 비교하려면 해당 구성 요소를 w로 나누어야합니다.

이 좌표계는 더 깊이 다이빙하려면 homogeneous coordinates.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top