목차
인사말
버그 현상
버그 발생이유
버그 해결법
최종 검증
인사말
이번 시간에는 Rookiss님의 언리얼MMORPG시리즈의 DirectX12파트에서 나오는 Deferred Shading작동 시 특정 위치에 따라 라이팅이 꺼졌다켜지는 버그에 대해서 해결해보려고 합니다.
버그 현상
클라이언트를 실행해보면 처음 시작했을때 겉보기에는 문제가 없어보입니다.
아주 정상적으로 작동하는것으로 보이죠.
문제점은 좀 위치를 옮기고 라이팅볼륨에 가까이가면 그때부터 라이팅이 이런식으로 꺼졌다켜지는 현상을 보실수있어요.
첫번째사진에 비해서 확실히 라이팅이 꺼져보이는것을 볼수있죠.
버그 발생이유
결론적으로 해당 버그는 카메라가 라이팅볼륨 내부에 들어감으로써 라이팅연산에 필요한 볼륨메쉬가 컬링되어 제대로 렌더링이 되지 않았던것입니다.
Resource.cpp를 보면 Point라이트의 셰이더 부분은 다음과 같이 세팅되어있습니다.
// PointLight
{
ShaderInfo info =
{
SHADER_TYPE::LIGHTING,
RASTERIZER_TYPE::CULL_NULL,
DEPTH_STENCIL_TYPE::NO_DEPTH_TEST_NO_WRITE,
BLEND_TYPE::ONE_TO_ONE_BLEND
};
shared_ptr<Shader> shader = make_shared<Shader>();
shader->Init(L"..\\Resources\\Shader\\lighting.fx", info, "VS_PointLight", "PS_PointLight");
Add<Shader>(L"PointLight", shader);
}
우선 전면과 후면을 모두 컬링하지 않고, 깊이버퍼쓰기및 깊이테스트는 하지않기로 되어있는데 바로 이부분이 원인이였습니다.
버그 해결법
깊이 버퍼에 값이 갱신되는 방식은 대략적으로 다음과 같습니다.
if 새로올 z값 < 기존 z값 && z test == true
그린다.
만약 z버퍼 갱신을 (위와같이)기존과같이 일반적인 방법으로 렌더링한다면 당연히
라이팅 볼륨메쉬에 카메라가 들어갔을때 DirectX의 최적화 알고리즘에 의해 볼륨메쉬가 렌더링되지않을것이고, 최종적으로는 포인트라이팅이 껏다켜지는 현상이 발생되겠죠.
따라서 이때 z버퍼 갱신을 위 공식이 아닌
if 새로올 z값 >= 기존 z값 && z test == true
그린다.
로 한다면 밖에서도 렌더링된것같이 보이며, 볼륨메쉬 내부에 카메라가 들어가더라도 렌더링이 정상적으로 이루어질것으로 보입니다.
또한, 강의상에서 Rookiss님은 후/전면선별을 모두 하셨지만, 이럴필요없이 전면선별만해도 크게 상관없습니다.
오히려 성능을 생각했을때 전면선별만 하는게 더 좋겠죠.
따라서 저는 해당 부분을 이렇게 바꾸었습니다.
// PointLight
{
ShaderInfo info =
{
SHADER_TYPE::LIGHTING,
RASTERIZER_TYPE::CULL_FRONT,
DEPTH_STENCIL_TYPE::GREATER_EQUAL,
BLEND_TYPE::ONE_TO_ONE_BLEND
};
shared_ptr<Shader> shader = make_shared<Shader>();
shader->Init(L"..\\Resources\\Shader\\lighting.fx", info, "VS_PointLight", "PS_PointLight");
Add<Shader>(L"PointLight", shader);
}
마지막으로
Shader.cpp의 GREATER_EQUAL설정하는 부분에서 깊이마스킹을 0x00으로 함으로써 깊이쓰기는 하지않는 방향으로 가주면 물체에 가까이갔을때 희미하게 볼륨메쉬의 윤곽이 보이는 현상도 사라지게 되죠.
case DEPTH_STENCIL_TYPE::GREATER_EQUAL:
_pipelineDesc.DepthStencilState.DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ZERO;
_pipelineDesc.DepthStencilState.DepthEnable = TRUE;
_pipelineDesc.DepthStencilState.DepthFunc = D3D12_COMPARISON_FUNC_GREATER_EQUAL;
break;
최종 검증
마지막으로 테스트해보니 라이팅이 꺼졌다켜졌다하는 현상이 말끔하게 사라졌습니다.
'개인 연구노트 > 그래픽스' 카테고리의 다른 글
물체를 설치하는 방법 (v2) (0) | 2023.01.17 |
---|---|
마우스를 통해 물체위에 물체를 설치하는 방법 (0) | 2023.01.11 |