Computer Graphics 110

pt - 5. 광원 정규화, bloom 적용, NEE 적용 중

1. 광원 정상적인 정규화 초기에는 Blackbody 스펙트럼을 RGB로 변환할 때,CIE XYZ 변환 과정에서 Y 성분을 1로 고정하는 임의의 정규화 방식을 사용했었는데하지만 이 방식은 색온도에 따른 고유한 색감을 제대로 반영하지 못해,렌더링 결과에서 색 표현이 부정확하게 왜곡되는 문제가 발생했었다. 이를 해결하기 위해, Physically Based Rendering에서 소개하는 방식대로Planck 분포의 λ_peak 지점에서의 복사휘도를 기준으로 전체 스펙트럼을 정규화하는 절차를 적용했다.그 결과, CIE XYZ 변환을 통해 얻어진 RGB 색상과 밝기는레퍼런스 이미지와 비교했을 때 색감과 세기 모두에서 일관된 결과를 보여주었다. 즉, 절대 복사량을 직접 사용하는 것이 아니라,온도 기반으로 색상을 정..

pt - 4. 문제 해결 + blackbody 관련 정리

.pbrt 파일내 blackbody L로 지정된 광원에서파서에서 파싱된 결과가 조단위 이상으로 매우 크게 출력 됐었다.[bathroom.pbrt]AttributeBegin AreaLightSource "diffuse" "blackbody L" [6500 100 ] #"color L" [2500 2500 2500] Shape "plymesh" "string filename" "geometry/mesh_00062.ply" AttributeEnd[파싱 결과] 4400002063400960.0 4162397761699840.0 4331947501289472.0 초기에는 해당 값을 파서의 잘못된 계산, 보정치가 잘못 들어간 줄 알고 수치 보정을 적용했었다.float Y_norm = xyz[1];if (..

pt - 3. rendering equation 개념 정리 + 현재 문제들

모든 렌더링은 이 렌더링 이퀘이션을 푸는 것으로 시작된다.수식을 보면, 한지점에서 다른 지점으로 가는 빛의 총 양은 자발광과 다른곳에서 들어온 반사광의 총합으로 구성된다.path tracing 역시 이 렌더링 이퀘이션을 자신만의 방법으로 풀어낸 것 렌더링 이퀘이션은 적분 항 안에반사광이 다시 렌더링 이퀘이션을 참조하고 있고즉 순환하는 적분식 구조를 가지며, 이를 해석적으로 직접 풀어내는 것은 불가능하다.이 렌더링 이퀘이션은 뉴만 시리즈로 근사할 수 있는데적분식을 K로 퉁쳐서 보면 식을 간단히 표현하면 빛의 총합은 무한히 반복되는 적분 항들의 합으로 표현된다.이를 통해 한 점에서 다른 점으로 가는 빛의 총량을 무한 경로의 합으로 볼 수 있고이 때 path tracing을 제안한 Kajiya은 모든 경로를 ..

pt - 2. 재질에 따른 brdf 공식 적용

스펙큘러(거울/메탈릭 반사) 성분이 있는 재질에 대해서는GGX 기반 스펙큘러 샘플링(importance sampling of GGX) 을 추가했다. 재질샘플링 방식MatteCosine hemisphereMetal, Mirror, GlassGGX importance samplingUber, Substrate, PlasticCosine + GGX 특히 Uber / Substrate / Plastic 같이디퓨즈와 스펙큘러가 혼합된 재질에 대해서는:5:5 비율로 디퓨즈/스펙큘러 샘플링 방향을 랜덤하게 선택샘플링 시 확률에 따라 선택된 방향에 맞춰 BRDF를 평가PDF는 디퓨즈와 스펙큘러 PDF를 평균내어 사용

pt - 1. (.pbrt)파일 파싱과 나이브한 구현

원래 작업하던 (reflection, gi)이 있었기 때문에 그리 많이 바꿀 필요는 없었다.대신 .pbrt 파일을 파싱하는 과정이 필요했는데모든 파일을 전부 대응하게 하는것은 예외도 많고 엄청나게 고생할 거 같아원래 레퍼런스로 잡은 bathroom.pbrt 만 대응하도록 방향을 바꿨다. .pbrt파일 자체가 게임 오브젝트처럼 모든 재질에 대해 동일한 파라미터(roughness, metalic) 로 표현되는게 아니라 재질자체의 속성이 이미 정해져있어서 그거에 맞는 파라미터만 있거나 파라미터가 재질에 따라 다르다예)# small bottle by the tubMakeNamedMaterial "etiquette" "float uroughness" [ 0.0104080001 ] "f..

pt - 0. path tracing 렌더러 시작

처음에는 vulkan의 RTX기능을 활용한 reflection과 global illumination을 목표로 프로젝트를 시작했는데관련지식 부족과 정확한 레퍼런스 부족으로 인한 방향성 상실(?)로 인해많은 고민 후 플젝을 밀고 path tracing을 지원하는 렌더러를 만들기로 결정했다. (좀 더 근본적인) pbrt 3판을 사고 읽으며 개념을 배우면서path tracing을 지원하는 렌더러를 만들어볼 생각이다. 4판도 이미 인터넷에 풀려있는데 왜 굳이 3판을 보고 하냐면은번역본은 3판밖에 없기 때문이다 ㅠㅠ4판에 있는 개념이 3판에는 간략하게 소개되거나 없는 것들도 많이 찾아서아마 두개를 번갈아 보며 공부할 거 같다. 첫 씬의 레퍼런스 이미지 인턴 때 보고용으로 썼었던 글을 프로젝트를 전반적으로 마무리..

BRDF 정리

오늘날 대부분의 렌더러에서 사용되는 Monte Carlo 근사식이다.한 점 x에서 방향 ωo로 나가는 출사복사도 Lo는,여러 방향 ωi에서 들어오는 빛 Li와 BRDF fr 및 입사각의 코사인 cos(θi)를 곱해 평균내어 구한다.이 식은 바로 렌더링 이퀘이션을 샘플 기반으로 근사한 형태이며,하나의 경로(샘플)당 기여도를 구하는 기본적인 path tracing 수식이다. 렌더링 방정식에서 fr은 BRDF로, 표면에서 빛이 어떻게 반사되는지를 수학적으로 표현하는 항이다. 입사 복사도 대비 출사 복사도의 비율쉽게 말해, 얼마나 입사된 빛을 반사시키는지를 방향별로 표현한 확률 밀도 함수 하지만 그 전에, 빛의 반사란 무엇인지 먼저 정리해보자. 반사의 네 가지 기본 타입빛이 표면에서 반사되는 방식은 결국 시각적..

The Rendering Equation 정리

핵심 요약 1. 렌더링 방정식(Rendering Equation)이 식은 어떤 표면에서 특정 방향으로 나가는 빛의 세기를 정의하며,간단히 말하면 "자체 발광 + 다른 지점에서 반사되어 들어온 빛의 총합"으로 구성되어 있다.여기서 중요한 건 이 방정식이 직접광뿐 아니라 간접광까지 모두 포함한다는 점이다. 2. Neumann 시리즈 전개 방식렌더링 방정식은 자기 자신을 포함하는 적분 방정식인데, 이를 직접 풀 수 없기 때문에 무한급수로 전개해서 근사한다.이 방식은 "직접광", "1차 반사", "2차 반사", ... 이런 식으로 빛의 경로를 단계별로 누적해 나가는 구조다.이런 수학적 구조를 기반으로, 우리가 흔히 말하는 멀티 바운스 라이트를 표현할 수 있다. 3. Monte Carlo 기반의 근사 방법여기서..

Vulkan에 Ray Tracing 도입 하기 (2)

7. Ray Tracing 셰이더 코드 작성[RTReflection.rgen]이 셰이더는 레이 트레이싱 작업을 시작하는 셰이더입니다.화면상의 각 픽셀에 대해 레이를 발사하고, 그 레이가 충돌하는 지점을 찾기 위한 초기 작업을 담당합니다.#version 460#extension GL_EXT_ray_tracing : require#extension GL_EXT_nonuniform_qualifier : enablelayout(set = 0, binding = 0) uniform CameraBuffer { mat4 view; mat4 proj; vec3 camPos;} camera;layout(set = 1, binding = 0, rgba16f) uniform image2D outputImag..

Vulkan에 Ray Tracing 도입 하기 (1)

3. Mesh를 돌며 BLAS 생성for (auto& mesh : m_meshList) { std::cout 만드는 코드는 너무 길어 생략하겠습니다.https://github.com/ksro0128/vulkanRT/blob/main/src/AccelerationStructure.cpp 중요한건 생성할 때 Mesh(vertices, indices)가 필요하다는 점과 제 엔진의 구조적으로 중요한 점은각 메시와 BLAS가 1:1 대응 관계에 있다는 것입니다.제 경우에는 인덱스가 일치시켰는데, 이렇게 함으로써 TLAS 생성 시오브젝트 인스턴스와 해당 BLAS를 쉽게 참조할 수 있게 됩니다. 4. BLAS와 Scene 정보를 받아 TLAS 생성m_tlas.resize(MAX_FRAMES_IN_FLIGHT);fo..