이번 작업은 glm 라이브러리 대체를 목적으로 한다.
굳이 잘만들어진 라이브러리를 버리고 내가 만들어봤자 허접한데 왜씀? 이라는 생각이 절로 들긴하는데
처음에는 그냥 glm 써보려고 했는데 glm은 OpenGL을 위해 만들어진 수학 라이브러리고
연산방식이 col-major 방식이라서 dx로 그래픽스를 배운 나한테 그렇게 익숙하지 않은 것도 있고
뭐 using으로 이름만 바꿔서 쓰는게 맘에 안들기도 하고 직접 짜면서 또 복습되는게 있겠지 싶어서 바꿨다
그래서 현재 엔진에 필요한 최소한의 기능들로 구성했고
row major 방식의 행렬, row vector의 연산 구조를 가지도록 만들었다.


만들면서 glm의 방식을 참고해서 template를 사용했고
using을 통해 명칭을 붙여주었다.

각각의 벡터는 이런식으로 원소의 개수만 정해놓는 부분 특수화를 통해 정의해줬다.

기본적으로 많이 쓰이는 연산자를 우선 오버로드 해줬음
템플릿 클래스내에서 자기 타입 사용할때는 일일히 템플릿 안붙여줘도 되서 편하다.

그리고 해당 자료형에서 많이 쓰는 기능들을 static과 멤버 함수로 선언해뒀다.

이건 Vector3Impl.h라는 파일이고 이런식으로 템플릿 함수를 선언만 해놓고 .cpp에서 구현하는건 안되지만 다른 헤더파일에서 구현함으로써 순환참조 문제를 회피할 수 있다.
glm은 이걸 .inl파일에 선언한 함수를 구현하는 것을 보고 대충 따라해봤다.
여기서 Vector3랑 Matrix 곱셈을 delete 했는데 Vector3가 방향인지 위치인지 모르니까 이부분은 함수로 처리하기 위해서 이렇게 해뒀다.
그리고 보면 지금 Min같은 함수가 내부적으로 Math::Min함수를 호출하는 걸 볼 수 있는데

이런식으로 구현되어 있고 벡터 템플릿의 구조체가 인자로 들어오면 구현된 것 처럼 원소개수 N에 따라서 알아서 처리해준다.
굳이 벡터 클래스 내부에서 static으로 한번더 감싸준 이유는
Math::Max(a, b)도 되지만 Vector3::Max(a,b)로 하면 보는 사람이 a,b는 당연히 Vec3겠구나 이런 생각이 자연스럽게 될거같아서 한번더 감쌌다.

Vector4는 예외적으로 SIMD 써보려고 Float32타입으로 특수화까지 해줬다.
그리고 SIMD같은 거 쓰려면 alignas 16으로 설정해줘야 된다고 해서 해줬다.
SIMDRegister는 늘 말하는 크로스 플랫폼 지향 때문에 cpu 타입에 따라서 다르게 정의되도록
하기 위한 명칭이다. 실제로 아직 다른 운영체제에서는 돌리지도 못함

이런식으로 내부적으로 필요한 기능을 정의해뒀고

이런식으로 내부적으로 SIMD 연산으로 처리하도록 설정했다.
SIMD 연산 지원 안되는 컴퓨터면 어캄? 이라는 질문이 떠올랐는데
- 대충 찾아보니까 요새 SIMD 지원 안하는 cpu가 없다고 하던데 없으면 아쉬운거지 뭐..


Matrix랑 Quaternion은 대충 이런 기능들을 붙여줬고
엔진에 달아주기만 하면되서 add Submodule로 붙여줬다.
그리고 많은 에러를 잡아야했다.
일단 행렬의 저장방식 row-major랑 col-major는 잘 했는데
벡터를 앞에 곱하는 row-vector방식과 벡터를 뒤에 곱하는 col-vector방식에서 혼동이 와서
Matrix함수에서 Projection 행렬이랑 LookTo 행렬같은거 만들 때 잘못된 행렬 위치에 translation을 집어넣어서 렌더링이 안된다거나 하는 문제가 있었고
새로 만든 수학라이브러리에서 epsilon보다 작은 값이면 0으로 처리하는 코드가 있었는데
epsilon을 1e-5같이 큰값으로 설정해놓은거 까먹어놓고 렌더독에서 찍어보니까 projection 행렬이 이상하게 전달되고 있어서

이런식으로 바꿔주기도 하는 등 시행착오가 있었는데
결국 glm을 대체하는데 성공했다. 이제 내코드에서 glm은 사용되지 않고 렌더링도 잘된다.

이제 다시 어려운 멀티스레드로 돌아가서 렌더링 스레드를 사용하면서 문제가 생긴 DirectX12랑 프레임버퍼 Resize, 마우스 피킹 등을 마무리 할 것.
'개인 공부 및 프로젝트 > Daydream Engine' 카테고리의 다른 글
| 자체 게임엔진 DevLog - 크기조절 문제 해결 (0) | 2026.04.27 |
|---|---|
| 자체 게임엔진 DevLog - OpenGL 렌더링 스레드 (0) | 2026.04.21 |
| 자체 게임엔진 Devlog - Vulkan 렌더 스레드 문제 해결 (0) | 2026.04.08 |
| 자체 게임엔진 Devlog - 14 (0) | 2026.04.08 |
| 자체 게임엔진 Devlog - 13 (0) | 2025.11.20 |