주차 정리 250410 ~ 250415
이번 주는 RT reflection 기능 도입에 중점을 두고 전체 파이프라인을 구성하고 실험을 진행했습니다.
우선 저번 주 주차정리 때의 마지막 결과물 입니다.
저번주는 실험하기위한 전체적인 파이프라인을 구현하였습니다. (shadow - gbuffer - lighting)
0410
피드백을 받고 유명한 씬 (Sponza) 을 받아왔습니다.
씬을 로드하니 고쳐야할 문제점이 보였습니다.
- 텍스쳐 메모리 문제
- 그림자 문제
- decal 문제
decal을 제외한 각 문제점들은 프로젝트 기간 내에 해결할 예정입니다.
0411
레이를 쏘기위한 사전 작업을 했습니다.
- BLAS, TLAS 구현
- 레이를 쏘기위한 vulkan 확장 설정
이 시점부터 RenderDoc에서 RT 파이프라인이 제대로 캡처되지 않으면서,
실질적인 디버깅이 어려워졌습니다.
이를 대체하기 위해 UI 기반의 profiler를 직접 제작하게 되었습니다.
디버깅이 더 힘들어지면 나중에는 레이 트레이싱을 지원하는 디버거를 찾을 예정입니다.
레이를 카메라에 쏴서 히트되는 것을 확인했습니다.
맞은 부분은 빨간색 안맞은 부분은 검은색입니다.
Ray Tracing을 vulkan에 도입할 때 어떻게 했는지에 대해서 정리했습니다.
https://surkim.tistory.com/118
https://surkim.tistory.com/119
https://surkim.tistory.com/120
~0414
디버깅을 위해 profiler 창을 만들었습니다.
만들어지는 이미지들을 볼 수 있게 하였고
bench mark 버튼을 만들어 10초간 프레임 수를 측정하도록 만들었습니다.
+
레이를 쏴서 맞는 부분의 머테리얼 정보를 받아오게끔 설정했습니다.
G-buffer에서 얻은 world position과 normal을 이용해 반사 레이 방향을 계산하고,
해당 레이를 쏴서 히트된 삼각형의 Albedo 값을 추출,
이를 Light Pass에 적용하는 방식의 1-bounce reflection을 구현했습니다.
~ 현재
현재 만들어 놓은 rt reflection의 품질 개선을 위해 노력중 입니다.
임시로 ui를 만들어
1-bounce, 2-bounce, 1-bounce random 1-sample, 1-bounce random 4-sample
을 비교해 보았습니다.
현재 roughness기반으로 랜덤 샘플링하는 과정에서
반사 방향이 치우쳐져 보이는 현상을 발견했는데
임시로 가져온 난수 함수가 주 원인으로 생각됩니다.
float hash1(vec2 p) {
p = fract(p * vec2(123.34, 345.45));
p += dot(p, p + 34.345);
return fract(p.x * p.y);
}
vec3 rand = normalize(vec3(
hash1(seed),
hash1(seed + 0.13),
hash1(seed + 0.37)
));
...
float spread = pow(roughness, 2.0);
vec3 sampleDir = normalize(mix(perfectReflect, rand, spread));
...
현재 방식은 정반사 방향과 임의 난수 벡터를 보간하여 반사 방향을 만들고 있는데
정반사 벡터 기준으로 반구형태안에서 난수벡터를 만들어 샘플링을 하면 결과가 더 안정적으로 나올 것으로 예상됩니다. (진행 중)
주차별 계획입니다.
1주차: 기본 렌더링 파이프라인 구성 (Shadow → G-buffer → Lighting)- 2~3주차: Ray Tracing Reflection 구현
- SSR도 함께 구현해 비교할 예정입니다.
- 4~5주차: Ray Tracing 기반 Global Illumination(RT GI) 구현
- SSAO, SSGI구현과 함께 비교할 예정입니다.
- 6~8주차: 전체 렌더링 파이프라인 성능 개선 및 최적화 작업 진행