전체 글 122

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..

Vulkan에 Ray Tracing 도입 하기 (0)

현재 Ray gen, hit, miss 셰이더가 정상적으로 작동하는 것을 확인했습니다.테스트 결과는 다음과 같습니다. 현재 화면에서는 카메라에서 쏘는 레이가 맞는 부분은 빨간색, 맞지 않는 부분은 검정색으로 렌더링되고 있습니다. Vulkan에서 Ray Tracing을 처음 시도하다 보니, 구현 방법과 플로우에 초점을 맞추어 기록을 해보겠습니다.특히 Vulkan은 명시적인 API라서, Ray Tracing을 추가하면서 새로운 옵션들을 도입하게 됩니다.이 과정에서 각 옵션이 의미하는 바와 그 필요성을 이해하는 것이 중요합니다. 1. Ray Tracing 정보를 저장할 Texture 생성다음은 Ray Tracing 결과를 저장할 텍스처를 생성하는 코드입니다:m_rtReflectionTextures[i] = ..

Vulkan Game Engine - 24. 평가 받을 준비..

장렬하게 전사했다..이젠 정말 시간이 없어서 애초에 오브젝트 1000개의 프레임 방어가 주 과제였던지라오브젝트 material별 인스턴싱을 안해도 프레임 드랍이 없어타협을 하고 평가준비를 하기로 했다. 너무너무너무 아쉬운데일단 실패 원인과 과정을 조금 적어보자면..우선 인스터싱을 고려하지 않고 설계한게 문제이다.지금 생각해보면 게임 엔진인데인스터싱을 처음부터 고려하지 않은 내 무지함이 만든 스노우볼이다.오브젝트가 수천개 떠다닐텐데 그거마다 descriptorset을 만든다는게 말이 안된다.초창기에는 vulkan 배우기도 바빠 최적화를 전혀 고려하지 않았다는게 이런식의 실패를 만들줄 몰랐다.  현재 우리엔진의 draw콜 구조는 블로그에 적은 적이 없어 잠깐 적어보자면draw콜이 불릴 때 가장 윗단이Mesh..