티스토리 뷰

Game/MMD

LisPSM (3)

newpolaris 2017. 11. 8. 12:15

하도 안되서 NVIDIA 소스를 실행가능하게 만들어서 비교했다.

miniEngine 의 수학 소스중 plane extraction 및 몇 부분이 틀려서 고쳤다.

이 넘의 소스는 실행안하는 수학코드에 함정이 왜케 많은지

그런데 특정 각도에서 그림자가 사라진다.

cos 값이 1이 나온것도 아니고 이유를 알수가 없다.

결국 포기하고 저자의 reference 코드로 바꿔보았다.

nvidia는 Light space clipping 을 안하고 대신 aabb box 의 z near/ z far 만 가져와서

unit cube (scaleTranslateToFit) 으로 화면을 한정시키는데 반해

저자의 코드는 장면 AABB와 camera frustum 을 cliiping 후 light volume 영역을 추가로 더한다

또한 world space 에서 계산이 진행된다

    float a, b;
    if (!m_bGLNDC)
    {
        a = f / (f - n);
        b = -a * n;
    }
    else
    {
        a = (f + n) / (f - n);
        b = -2 * a * n;
    }

    //one possibility for a simple perspective transformation matrix
    //with the two parameters n(near) and f(far) in y direction
    Matrix4 lispMtx(
        Vector4( 1, 0, 0, 0 ),
        Vector4( 0, a, 0, 1 ),
        Vector4( 0, 0, 1, 0 ),
        Vector4( 0, b, 0, 0 ) );

Y축으로 늘여뜨리기 위한 코드인데 right hand 에서 저 수식만들려고 고생했는데

둘 중 어느거 사용해도 상관없다. 2행 마지막열에 1 을 둬야한다.

그냥 Y축으로 바꾸는 코드이다. unit fit 때문인지 결과가 차이안난다.

진짜 w값의 -는 scaleTranslateToFit 에서 해준다.

DirectX::XMMatrixOrthographicOffCenterLH

그리고 calcUpVec, look 은 left에서 계산되어있으므로 그냥 쓰면된다.

저자는 맨 끝에서

    makeScaleMtx(rh2lf,1.0,1.0,-1.0);

위의 행렬을 projection에 곱한다.

결과는

OrthoShadowProjectionMatrix 로 불리는 그냥 일반 unit cube 만 적용한 것은

light space 에 맞춰 frustum을 변형한 것을 알 수 있다

pcf blur 계열이 안먹히는 현상이 있는 것 같으며, 그 결과 artifact도 눈에 뛴다

해상도는 비교를 위해 blur 끄고

view space unit cube (receiver 영역까지 포함되는듯)

world space unit cube (저자 소스대로 frustum clipping)

LiSPM (저자 소스 방법)

Tip: 디버깅이 결국 문제인데 그림자 맺치는건 light 에서 본 모양으로 맺친다

그리고 그림자의 방향은 실제 땅바닥에 맺치는 그림자의 방향과 동일하다.

'Game > MMD' 카테고리의 다른 글

DirectX 에서 Right hand 를 쓰는 고통  (0) 2017.11.10
CSM (1)  (0) 2017.11.08
LisPSM (2)  (0) 2017.11.05
LisPSM (1)  (0) 2017.11.04
SMAA 적용  (0) 2017.11.02
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크