분류 전체보기 12

filament 렌더링 엔진 여행기 #4 - RenderPass (2)

연휴를 게으르고 나태하게 지내다보니 시간이 참 빠르게 흘렀다. 저번에 글을 올릴 이후로 꽤 시간이 많이 지났는데... 늦은 만큼 아무래도 열심히 달려야하지 않을까...? 아무튼 그런 고로 이전 포스팅에 이어서 RenderPass 두번째다. 지금까지 파악한 걸 요약하면 filament의 렌더링은 기본적으로 RenderPass라는 클래스 단위로 동작하며, 이 때 PassBuilder를 통해 렌더링할 데이터를 전달하여 RenderPass 객체를 만들 수 있다로 요약할 수 있겠다. RenderPass::RenderPass(FEngine& engine, RenderPassBuilder const& builder) noexcept : mRenderableSoa(*builder.mRenderabl..

Graphics/filament 2025.05.22

filament 렌더링 엔진 여행기 #3 - RenderPass (1)

이전에 FRenderer 코드를 보면서 filament의 렌더링이 RenderPass라는 객체 단위로 동작한다는 것을 추론할 수 있었다. 물론 모든 코드를 다 본 것은 아니기엔 예외는 존재할 수 있으나 RenderPass가 적어도 filament 렌더링 동작의 핵심적인 역할을 하는 클래스인 것까진 틀림없을 것이다. filament의 RenderPass는 그럼 어떻게 동작할까? 코드를 보기 전 클래스 다이어그램부터 보자 위 클래스 다이어그램이 RenderPass와 관련된 클래스 다이어그램이다. 클래스 간의 관계까지 표현해두진 않았다. 그리고 당연하지만 모든 멤버가 포함된 다이어그램은 아니다. 거기에 처음보는 클래스도 꽤 있는데... 이런 부분은 당장 알아야할 건 아니므로 넘어가자. 디자인 패턴에 대..

Graphics/filament 2025.04.28

filament 렌더링 엔진 여행기 #2 - Renderer와 RenderPass

렌더링 엔진에서 가장 중요한 요소 하나를 꼽으라면 뭘 꼽아야 할까? 실질적인 렌더링 파이프라인을 시작시키는 Draw Call? 아니면 메쉬 렌더링을 위한 기본 중의 기본인 Vertex Buffer? 혹은 메쉬의 표면에 대해 정의하는 Material? 아마 모두 중요할 것이다. 그래픽스를 공부한 사람이라면 뭐 하나 빠져선 안 되는 중요한 개념들이고, 렌더링 품질과 성능 모두를 만족하기 위해선 무엇보다 잘 이해하고 있어야할 개념들일 것이다. 그러나 렌더링 엔진을 처음 뜯어보고자 하는 상황에서 가장 먼저 살펴볼만한 게 있다면 그건 뭘까? 필자의 의견을 말해보자면 렌더러가 아닐까 생각한다. 렌더러에선 렌더링할 데이터들을 받아 쉐이더 프로그램을 설정하고, 리소스 바인딩을 진행하며 드로우 콜을 호출하는....

Graphics/filament 2025.04.21

filament 렌더링 엔진 여행기 #1 - 구글의 오픈소스 엔진은 렌더링을 어떻게 할까?

요즘 출시되는 게임들을 보면 상당히 많은 게임들이 상용 엔진을 이용해 제작되고 있다.  국내 게임사 대부분은 상용 엔진인 언리얼과 유니티를 활용해 게임을 개발하고 있고, 꼭 게임이 아니라도 렌더링이 필요한 여러 분야에서 상용 엔진을 사용하고 있다.  확실히 상용 엔진은 직접 엔진을 개발해서 사용하는 것에 비하면 훨씬 싸게 먹힌다. 그러면서 품질 좋은 렌더링 결과를 제공하기 때문에 자연히 상용 엔진의 점유율을 높을 수 밖에 없을 것이다.  그런데 상용 엔진을 배우고 개발하는 많은 개발자들 중에서 엔진의 핵심적인 부분 중 하나인 렌더링 관련 영역에 대해 자세히 알고 있는 개발자는 얼마나 있을까? 아마 많지 않을 것이다.  이게 참 쉽지 않다. 일반적인 게임 혹은 기타 프로그램 개발에서 렌더링 관련 부분까지 ..

Graphics/filament 2025.04.13

Screen Space Light Shaft - 화면 공간 라이트 섀프트 (2)

저번에 이어서 오늘은 3번 렌더 타겟에 기록되는 마스킹 데이터를 렌더링하는 SunLightShader 를 볼 계획이다. 내가 사용하는 방식에서는 현재 픽셀 위치에서 광원의 방향으로 이동하며 샘플링을 하되, 이 샘플링이 원본 텍스쳐에서 이루어지면 안 된다. 그렇게 하게 되면 라이트 섀프트라기 보다는 블러 효과에 가까운 모양새가 된다. 이것도 결국 주변 텍셀을 샘플링하여 적절한 가중치를 더해 픽셀을 바꾸는 것이기에 블러와 그 궤가 같다. 그래서 렌더 타겟을 따로 만들어 해당 렌더 타겟에 어느 부분이 광원인지나 어느 부분은 차폐가 되는 지 등의 여부를 기록하고 이렇게 만든 텍스쳐에서 샘플링을 진행한다. 이를 위한 첫번째 단계가 SunLigthShader가 되겠다. 선언부는 위와 같은데, 다른 쉐이더 클래스랑 ..

Rampage 2023.08.22

Screen Space Light Shaft - 화면 공간 라이트 섀프트 (1)

저번까지 디테일 맵을 이용해 터레인 위에 디테일을 추가하는 것을 했었다. 그리고 이제부턴 저번에 예고한대로 화면 공간에서의 라이트 섀프트를 구현해보겠다. 우선 어떤 효과를 구현하기 위해선 이에 대한 자료 조사는 필수다. 그러므로 먼저 라이트 섀프트의 개념과 구현을 위한 이론적인 부분을 살펴보자. 언리얼 엔진 5.0 공식 문서에 따르면 라이트 섀프트를 다음과 같이 설명한다. "Light Shaft (라이트 섀프트)는 디렉셔널 라이트에 의해 생성 가능한 것으로, 현실에서 구름 사이를 뚫고 나오는 빛줄기에 대한 시뮬레이션입니다. 어느 씬에도 입체감과 현실감을 더해줄 수 있는 효과입니다." 보이는 것과 같이 직선 광(태양광)이 사물에 의해 가려질 때 그 사이사이로 빛줄기가 새어 나오는 현상이 라이트 섀프트가 되..

Rampage 2023.08.10

Detail Object Map - 지형 위에 풀숲 (2)

이전 포스트에서 디테일 오브젝트를 위한 클래스를 선언했다. 이제 정의를 작성해야하는데, 해야할 코딩은 렌더링 부분과 디테일 맵과 텍스쳐를 읽어 리소스를 준비하는 것이 되겠다. 우선 바이너리로 저장한 디테일 맵을 읽는 것과 텍스쳐를 로드하는 것은 생성자에서 하기로 한다. 생성자의 시그니쳐는 다음과 같다. CDetailObject(ID3D12Device* pd3dDevice, ID3D12GraphicsCommandList* pd3dCommandList, std::shared_ptr pShader, void* pContext) 생성자는 다이렉트12 디바이스와 커맨드 리스트, 그리고 셰이더에 대한 포인터와 void* 형의 pContext를 받는다. 여기서 pContext로는 터레인의 포인터를 넘겨줄 것이다. 터..

Rampage 2023.07.29

Detail Object Map - 지형 위에 풀숲 (1)

저번에 이어서 오늘의 주제는 저 오른쪽 위에 보이는 풀숲을 그리는 것이다. 지금까지 만든 지형은 단순히 땅만 있는 상태인데, 실제 지형은 그렇게 단순하지 않기에 여러 디테일을 추가해줄 필요가 있다. 이런 디테일의 대표적인 것 중 하나가 풀숲이다. 풀숲 이외에도 나무나 돌맹이 등도 포함될 수 있으나 이번에는 풀숲만을 추가해볼 것이다.(위 스크린 샷에는 돌멩이도 보이긴 하는데, 이는 오브젝트가 아니고 텍스쳐에 포함된 녀석이다.) 그러면 어떻게 풀숲을 구성하느냐가 이제 관건인데, 상용 엔진에 경우 디테일과 관련된 여러 툴을 제공하여 이 툴을 이용해 터레인 위에 마우스 클릭 앤 드래그를 하면 원하는 위치에 풀이나 나무, 돌 등을 그릴 수 있다. 하지만 당연히 풀숲 몇개 그리기 위해 이런 툴을 만들기엔 작업량도 ..

Rampage 2023.07.24

Terrain - 지형 (2)

올해 1월에 글을 쓴 이후로 오랫동안 적지 않았었는데 정신없이 구현만 하다보니 7월이 되서야 다음 글을 적게 되었다. 터레인은 지금 기준으로는 구현한지 너무 오래된 옜날 작업물이다보니 당시 어떻게 만들었는지 긴가만가 하지만 최대한 기억을 짜네 적어볼 수 밖에... 아무튼 이전 글에서 유니티를 통하여 터레인 객체의 알파 텍스쳐 맵을 얻어내는 것까지는 성공했다. 이번 프로젝트에서 구성되는 터레인은 총 4개의 레이어를 활용할 계획이다. 위 텍스쳐에서 각각의 색깔이 각 레이어가 어느 부분에 칠해져야 하는지를 알려준다. 이제 내가 할 일은 기존 터레인 클래스를 수정하여 알파 블렌딩과 타일링을 할 수 있는 터레인 클래스를 만들면 끝이다. class CSplatTerrain : public CHeightMapTerr..

Rampage 2023.07.07

Terrain - 지형 (1)

어떤 게임이든 기본적으로 반드시 필요한 요소를 말하자면 그중에서도 지형을 빼놓을 수 없을 것이다. 실제 사용자가 조작하게 될 캐릭터나 사용자 인터페이스 등 사실 중요한 것들은 차고 넘치는 것이 현실이지만 그래도 발 디딜 땅 정도는 있어야 하지 않을까? 그래서 이번에 만들 것은 Terrain(지형)이다. 고로 Terrain 구현을 진행해 볼 것인데....... 사실 저번 학기 동안에 만들었던 터레인이 이미 있다. 보는 것처럼 대충 산봉우리 몇 개 보이고, 물도 있고, 저 멀리 보면 잔디도 보이고, 스카이 박스도 돼있고, 이상한 헬기들도 보이고.... 아무튼 이것저것 보인다. 이것 자체로도 어느정도 써먹을 수 있는 지형이라 말할 수는 있겠으나 엄연히 말하자면 이걸론 부족하다. 게임 월드라 부르기엔 아무래도 ..

Rampage 2023.01.28