티스토리 뷰
하도 안되서 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