티스토리 뷰

Game/MMD

LisPSM (2)

newpolaris 2017. 11. 5. 02:01

우선, left hand 로 바꾸고 light matrix 만 구해서 orthographic 을 사용하는 버전을 테스트 해보자

그냥 임의의 min/max box

DirectX::XMMatrixOrthographicOffCenterLH

float2 TransTexCoord = ShadowPos.xy;
if (!any( saturate( TransTexCoord ) != TransTexCoord ))
{
    ShadowPos = saturate( ShadowPos );
    float3 shadowPosDX = ddx_fine( ShadowPos );
    float3 shadowPosDY = ddy_fine( ShadowPos );

saturate 없으면 ground 에서 깊이가 1.0 초과하는 값이 나와서 항상 실패하는 부분이 나온다.

UnitCubeClip 적용

Nvidia sample에는 BuildOrthoShadowProjectionMatrix 라 되어있다

Matrix4 lightView = Matrix4(XMMatrixLookAtLH( lightPt, frustumCenter, axis ));
frustumAABB = lightView * frustumAABB;
casterAABB = lightView * casterAABB;

//  use a small fudge factor for the near plane, to avoid some minor clipping artifacts
Matrix4 lightProj = Matrix4( DirectX::XMMatrixOrthographicOffCenterLH(
    frustumAABB.m_Min.GetX(), frustumAABB.m_Max.GetX(),
    frustumAABB.m_Min.GetY(), frustumAABB.m_Max.GetY(),
    casterAABB.m_Min.GetZ(), frustumAABB.m_Max.GetZ() ) );
lightView = lightView * view;
m_SunShadow.SetViewProjectMatrix( lightView, lightProj );

View space에서 AABB 박스의 중심에서 광원으로의 방향으로의 교차점을 구해서

light view를 구하고 AABB의 min/max 를 offcenter로 꽉차게 만든거다.

뒤의 꽉차게 projection matrix 만드는걸 unit cube clip 이라 하는 듯

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

CSM (1)  (0) 2017.11.08
LisPSM (3)  (0) 2017.11.08
LisPSM (1)  (0) 2017.11.04
SMAA 적용  (0) 2017.11.02
Antialiasing  (0) 2017.10.31
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크