전체 글 125

pt - 15. rchit shader, rmiss shader

앞에서 메모리 구조와 rgen shader를 설명했었다.rgen shader에서 레이를 쏘면맞지 않으면 -> rmiss맞으면 -> rchit shader로 가고이 때 정보를 주고 받는 메모리는raypayload 구조체로 정의된다.struct RayPayload { vec3 L; vec3 beta; vec3 nextOrigin; vec3 nextDir; int bounce; uint seed; int terminated; float pdf;};layout(location = 0) rayPayloadInEXT RayPayload payload;내가 정의한 RayPayload 구조체이다. 레이에 맞거나 맞지 않거나rchit 나 rmiss 셰이더로 들어오고 이 구조체의 값을 변경할 수 있어그 셰이더의 입출력이 ..

pt - 14. gltf를 지원하는 path tracing 렌더러

재질 통합을 완료하고 gltf를 지원하는 렌더러로 바꿨다. ui 상 왼쪽 위는 오브젝트, 아래는 area light를 조정할 수 있는 ui이고다중 광원 역시 지원 가능하다. (물론 area light 중 사각형만..!) 계산식 통합이야 계속 해왔던거라 쉬웠는데오히려 오브젝트 추가 제거나area light도 오브젝트 취급인데 light 속성을 지니고 있으니 이걸 구분지어주는 것에 애먹었었다 생각해보니 내 path tracing 계산식에 대한 코드와 메모리들 설명을 여기다가 안적어서 정리해서 적어 놔야겠다.오브젝트, arealight, material, camera, options 전부 gpu에 올려 놓았고 메모리 구조는 이렇다. 1. 카메라layout (set = 0, binding = 0) uniform..

pt - 13. svgf 폐기

호기롭게 SVGF(Screen Space Variance Guided Filtering) 적용을 시도했지만,원하는 퍼포먼스가 나오지 않아 폐기하기로 했다.필터 자체의 한계도 명확히 보였다. 그래도 얻은 건 있었다.논문을 찾아 읽고 직접 구현해본 경험,그리고 구현 과정에서 여러 문제를 맞닥뜨리고 해결해본 경험이다. 가장 기억남는것중 하나가 알베도 디모듈레이션(demodulation) 과정에서 생긴 문제다.필터 적용 전에 알베도 성분이 날아가는 것을 방지하여빛 성분을 알베도로 나누는 방식인데, 처음에는 모든 픽셀에 그대로 적용했다. 그 결과, 알베도가 0에 가깝거나 아예 없는 픽셀에서도 나눗셈이 일어나 값이 튀었고,히스토리 버퍼가 오염되면서 노이즈가 크게 발생했다.특히 Path Tracing에서는 완전 스펙..

pt - 12. taa 적용

Path Tracing 파이프라인에서 서브픽셀 단위로 지터링된 primary ray를 생성하여 샘플을 수집하고이를 프레임마다 누적하는 방식으로 TAA를 적용하였다. 레스터라이제이션을 활용한 gbuffer 생성 방식을 고려해보았지만 primary ray 생성 로직 자체를 변경하지 않는 이상 구조적으로 오히려 성능 저하 요인이 된다고 판단하여 해당 방식은 일단 폐기

pt - 10. NEE 계산 수정, svgf 디모듈레이션 수정, 필터에서 거울만 수정

Path Tracing에서 Next Event Estimation (NEE) 을 도입하면직접광 샘플링과 BRDF 샘플링이 동시에 조명을 설명하게 되므로Multiple Importance Sampling (MIS) 을 통해 두 샘플링 방식의 중복 기여를 보정해야 한다. NEE를 적용한 이후 직접광 샘플에 대해서는 MIS weight를 올바르게 적용했지만간접광 (BRDF를 따라간 bounce) 에 대해서는 MIS weight 계산이 누락된 것을 확인했다. 때문에 NEE를 추가했을때 MIS 보정이 들어가지 않아서 과하게 밝아지는 문제가 발생했던 것이다. 결과적으로 간접광만 누적한것과NEE를 추가해서 누적한 이미지는 같아야하는데 (수렴속도만 차이나야하는데)NEE를 추가하면서 과하게 밝아진 부분을 해결했다. 처음..

pt - 9. 푸른 빛 원인 찾음

직접광 / 간접광을 분리하여 샘플링하고 디모듈레이션 하는 과정에서 잘못된 방법을 사용하여 푸른빛이 도는 결과가 나온 것이었다. 간접광 계산할 때 디퓨즈와 스페큘러 샘플링을 확률적으로 선택하여 진행되는데 이 중 디퓨즈 샘플링일때만 albedo 영향을 받기 때문에 일괄적으로 albedo를 나누면 안되고 실제 albedo영향을 받는 픽셀만 선택하여 디모듈레이션 해줘야했다. 위 이미지는 정확한 결과 이미지는 아니고간접광에서는 정확하게 albedo영향을 계산해서 빼줬는데직접광 영향은 아직 정확하게 계산을 못해서 직접광은 잠시 albedo 성분을 vec3(1.0)으로 없애고 실험해보았다.

pt - 8. 전반적인 정리 (NEE 개념, svgf 개념), 현재 문제점들

레퍼런스 복습 모든 렌더링은 이 렌더링 방정식을 푸는 것으로 시작렌더링 방정식은 순환 적분식 구조이므로 직접푸는 것은 불가능 따라서 몬테카를로와 같은 근사식으로 렌더링 방정식을 근사path tracing은 경로 하나만 샘플링하여 그 경로하나가 전체 적분 값을 대표하도록 처리 기존 구현 방식 초기에는 BRDF 중요도 기반 샘플링을 통해 path tracing을 구성BRDF로 샘플링한 방향이 우연히 광원에 도달하면그때만 throughput × radiance를 계산하는 방식BRDF 샘플링 → 경로 따라 ray를 쏨광원에 닿을 때까지 bounce맞으면 그때만 기여 누적 문제점1 SPP에서 광원에 도달하지 못하면 그 샘플이 버려짐노이즈가 심하고 수렴이 느림NEE (Next Event Estimation) 추가..

pt - 7. svgf 필터 추가

SVGF 기법을 Path Tracing 렌더러에 단계적으로 도입 중이다.현재는 초기 구현 단계로, 카메라 정지 상태에서의 샘플 누적 및 A-Trous 필터 기반의 분산 가이드 블러링이 구현된 상태다. 현재 구현된 구조 1. 기본 구조G-buffer 구성Normal, Depth, Albedo를 G-buffer에 출력조명 분리직접광(Direct)과 간접광(Indirect)을 분리하여 샘플링각 결과에 대해 Albedo 디모듈레이션 수행 (Radiance / Albedo)2. Temporal Accumulation (단순 방식)이전 프레임의 누적 버퍼가 존재할 경우, 현재 프레임과 8:2 비율로 선형 보간하여 누적현재는 카메라 이동 시 모든 히스토리 삭제 (정확한 모션 벡터 기반 일치는 미도입 상태)3. Va..

pt - 6. 푸른빛 해결, 안티 엘리어싱, 러시안룰렛 추가

1. NEE 이상 고침 샘플중 r 값만, (실질적으로 앞의 4bytes만) 0이 되어버려 전반적인 색이 푸르게 변하는 문제가 있었는데,해결했다. 정확히 말하자면 .rgen 파일과 .rchit파일간 데이터를 raypayload 구조체로 주고 받는데이 구조체가 참까다롭다.명확한 레퍼런스는 결국 못찾아 확실하지 않은데경험상 128bytes를 넘으면 예상하지 못한 에러가 난다.이 에러가 정말 예상을 못하는게 명확한 에러가 나는게 아니라부분적으로 특정 메모리 지역에 null이 채워진다 던가 하는 에러가 나서원인 찾기가 쉽지가 않았다. 이제 BRDF 기반 경로 추적 과정에 Next Event Estimation(NEE)을 도입하여,레이가 표면에 도달했을 때 광원을 샘플링해 직접광을 계산하고,그 기여를 휴리스틱 밸런..