본문 바로가기

분류 전체보기

(17)
2022.02.24 개발 일기 - WSASend, WSARecv 함수 호출 시 메모리 주소 정렬 작년 8월에 마지막으로 개발 일기를 작성한 이후로 벌써 6개월 정도가 지났다. 8월 중순부터 외주 개발과 팀으로 하는 프로젝트의 시작으로 바빠져서, 오프라인 렌더러의 개발은 진행하고 있지 않았다. 물론, 꾸준히 논문이나 기타 자료를 통해서 오프라인 렌더러의 수학적인 기초는 계속해서 다지고는 있었지만, 실질적인 개발은 멈춘 상태이다. 다만, 수학적인 기초를 공부하면서, 블로그 포스팅용으로 자료들을 정리하고 있었고, 오프라인 렌더러를 개발하면서 사용했던 수학 라이브러리를 SIMD 버전으로 개발하고, 개인 프로젝트에서 사용할 Generic 라이브러리를 틈틈히 개발해왔다. 블로그 포스팅을 위한 자료들은 OneNote로 저장해서 블로그에 올리기 위해서는 한번 더 정리를 해야하는데, 다른 일들 때문에 계속해서 미루..
2021.08.02 개발 일기 - Specular 특성을 가진 반사 및 투과 처리 코넬박스를 구현한 뒤에 코넬 박스의 가운데에 여러 물체들을 넣어보면서 이미지를 렌더링해보고 있던 와중에 뭔가 이상한 점을 발견했다. 인터넷에 코넬 박스를 검색하면, 나오는 이미지 중에 코넬 박스 안에 Specular Reflection과 Specular Transmission 특성을 가진 물체를 배치한 것들이 있다. 그 이미지는 아래와 같다. 하지만 내가 렌더링한 이미지는 아래와 같다. 이미지의 분산은 SPP가 낮기 때문에 어쩔 수 없는 부분이지만 가운데에 있는 구의 가장자리를 보면, 첫번째 사진과 다르게 어두운 것을 볼 수가 있다. 처음에 이 문제를 보고 어디서 문제가 생겼는지 몇가지 가정을 세워봤다. 패스트레이싱 코드에 문제가 있다. 프레넬 효과를 고려하지 않았다. 반사 및 투과 효과에 대한 코드를 ..
2021.08.01 개발 일기 - 제대로된 NEE의 적용 이전까지 렌더러에 직접광과 관련된 기능을 추가하고 있었다. 이 부분을 책과 코드에만 의존해서 작성을 하다보니, 정확히 이해하지 못하고 잘못된 일을 하고 있었다. 우선 7월 29일날 작성한 일기에는 기존의 패스트레이싱의 방식이 잘못되었다고 작성했지만, 이는 잘못된 방식이 아니었다. 기존의 방식은 단순 BSDF 샘플링을 통해서 이미지를 만들어내는 것이기 때문에, 이미지의 분산이 높았을 뿐이었다. 이를 왜 잘못된 방식이라 생각한 이유는 PBRT 코드에서 패스트레이싱에 NEE(Next Event Estimation) 방식을 채용했고, 이로 인해 코드의 구조가 약간 달랐던 것이었다. Physically Based Rendering 책에는 이런 NEE에 대한 설명이 직접광에 대한 계산 설명 부분에 같이 들어있기 때..
2021.07.29 개발 일기 - 잘못된 패스트레이싱과 러시안 룰렛의 적용 이 부분은 잘못된 정보를 담고 있습니다. 더보기 최근에 코넬박스를 구현하고 나서, 직접광에 관련된 기능을 구현하려고 보니, pbrt에서는 영역광이 발산하는 방사량에 Inverse-Squared 법칙을 적용하지 않는다는 사실을 알았다. 이 부분이 잘 이해가 되지 않아서, 어디를 놓쳤는지 책의 이곳저곳을 확인하고 있었다. 그러다가 매우 충격적인 사실을 알게 되었다. 내가 구현한 패스트레이싱 코드(pbrt를 참고하지 않은 코드)는 완전 틀린 코드였다는 사실이었다... 패스트레이싱 개념에 대해서 어느정도 이해하고 있었고, 렌더링 방정식에 대해서도 어느정도 이해하고 있었기 때문에 혼자서 자신있게 코드를 작성했다. 또한 결과 이미지로 봤을 때에는 동작도 제대로 하는 것처럼 보였기에, 제대로 구현했다고 생각을 했다...
2021.7.25 개발 일기 - 코넬 박스 구현과 뻘짓 1주일 전에 레이트레이서에 쓰레드 풀을 적용했다. 그 후, 여러가지 샘플링 기법을 적용해서 렌더러 부분을 최적화 시킬 예정이었다. 그런 과정에서 우선 기존의 렌더러에 존재했던 문제를 해결했어야 했다. 패스트레이서를 구현하고, 사실 멀티프로세서를 코드를 빠르게 구현해보고 싶어서, 렌더러의 세세한 부분을 작업을 하지 않았다. 특히 적분기의 기능을 구현할 때, pdf를 전혀 고려하지 않은 코드를 작성했다. 그러다보니, 샘플링 기법에 따라서 씬의 밝기가 바뀌는 현상을 겪었다. 처음 이 문제를 보고, pdf(probability density function)를 전혀 고려하지 않아서 그렇게 되었다는 것은 알았지만, 이 부분을 작업하기가 너무 귀찮아서 한동안 Python의 matplotlib를 공부하기 시작했다. ..
2021.7.19 개발 일기 - 레이트레이서에 멀티쓰레딩과 쓰레드 풀 적용 이전에 BVH 가속 구조를 레이트레이서에 적용하고 난 후에, 렌더링 타임을 약 35% 정도 단축시켰다. 하지만 아직 레이트레이서에 멀티쓰레딩을 적용하지 않았기 때문에 최근 며칠동안 레이트레이서에 멀티쓰레딩을 적용시키는 작업을 진행했다. 기본적으로 레이트레이서는 렌더링 전에 씬을 구성하고, 그 이후에는 씬이나 씬을 구성하는 기본체들의 변수가 바뀔 일이 없다. 그렇기 때문에 자원 경쟁에 대한 걱정없이 쉽게 멀티쓰레딩을 적용하는 것이 가능했다. 멀티쓰레딩의 개념은 카메라의 위치에서 광선을 발사하고, 광선이 충돌한 위치의 픽셀 값을 정하는 로직에 적용되었다. 이 로직에서는 쓰기 작업을 하는 것들이 전부 로컬 변수였기 때문에, 작업을 잘 나눠주는 것만으로도 쉽게 멀티쓰레딩을 적용할 수 있었다. 우선 적용하고 테스..
2021.7.16 개발 일기 - 레이트레이서를 만들 때, Whitted 방식의 레이트레이서를 유지하자 이전부터 레이트레이싱에 관심이 있어, 직접 레이트레이서를 활용한 렌더러를 개발하는 사이드 프로젝트를 진행하고 있었다. 최근 DXR, RTX 등의 등장으로 이전보다는 정보의 양이 많이 늘었다고 하지만, 현재에도 인터넷을 검색하면 자료가 많이 없다는 생각이 드는데, 이전에는 얼마나 없었을지 상상이 가지 않는다. 아무튼, 자료의 양이 늘었다고 하더라도, 내가 진행하는 오프라인 렌더레에 관한 자료는 전체적인 양이 부족하다는 생각이 든다. 물론 간단하게 레이트레이싱을 설명한 Raytracing in one weekend 등의 짧은 책도 있지만, 이 책은 정말 레이트레이서를 따라하면서 만들어 보자는 의미의 책이기도 하고, 구현에 대한 설명도 개인적으로는 매우 빈약하다고 생각이 든다. 실제로도 레이트레이서를 개발하는..
Rust에서 DirectX12 개발하기(4) - DirectX 초기화하기(RenderTargetView 생성) 이전 편에서는 CommandAllocator와 CommandQueue 그리고 SwapChain을 구성하는 방법에 대해서 알아보았습니다. 2021.06.09 - [개발/Rust] - Rust에서 DirectX12 개발하기(3) - DirectX 초기화하기(CommandQueue, CommandAllocator, SwapChain 초기화) Rust에서 DirectX12 개발하기(3) - DirectX 초기화하기(CommandQueue, CommandAllocator, SwapChain 초기화) 이전 편에서는 Rust에서 DirectX12를 사용하기 위해서, 디바이스를 초기화하는 방법을 살펴보았습니다. 2021.06.07 - [개발/Rust] - Rust에서 DirectX12 개발하기(2) - DirectX ..