여기까지의 작업내용: https://github.com/hwi-middle/HimchanSoftwareRenderer/tree/ce2dd7eae5a67e2c5af487c7a53f9d28351fd1b4
게으르게 좀 놀았습니다
기말 시즌에 학기작 작업 바쁘게 마무리하고, 학생회도 마무리 짓고 하다보니 사이드 프로젝트에 대한 관심도가 자연스럽게 떨어졌다. 어쩌다보니 아예 잊고 살다가(정말이다!) 우연찮게 친구가 렌더러 만드는건 어떻게 되어가냐고 해서 다시 작업을 시작하기로 마음먹었다.
보자... 거의 3달을 놀고먹었는데 다시 졸업작품도 하고 공부도 하고 시간날 때 마다 렌더러를 만들어야겠다. 게으른 과거에 반성하며 오랜만에 구현한 내용을 적어본다.
다차원 벡터 구현
일단 Vector3, Vector4 구조체를 구현했다. Vector2에서 단순히 차원만 높인거라 달리 관련 내용을 자세히 적지는 않는다.
FORCEINLINE constexpr Vector2 Vector2::Dot(const Vector2& InVector1, const Vector2& InVector2)
{
return Vector2(InVector1.X * InVector2.X, InVector1.Y * InVector2.Y);
}
다만... 몇 개월 전의 나는 Dot Product를 왜 이렇게 구현했을까? 당연히 Dot Product의 결과는 float이 되어야하고 저 값들을 다 더해야한다는 사실도 알고 있었지만 생각없이 코딩했는지 생뚱맞게 Vector2를 만들어서 반환하고 있었다.
FORCEINLINE constexpr float Vector2::Dot(const Vector2& InVector1, const Vector2& InVector2)
{
return InVector1.X * InVector2.X + InVector1.Y * InVector2.Y;
}
그래서 이렇게 제대로 수정했다. 이 부분은 모르고 지나칠뻔 했다가 Matrix의 곱셈을 구현할 때 Dot Product를 할 일이 있어서 쓰다보니 발견했다.
앞으로는 정신차리고 코딩합시다...
nxn 정방행렬 구현
struct Matrix2x2
{
static constexpr uint8 Rank = 2;
std::array<Vector2, Rank> Cols = { Vector2::UnitX, Vector2::UnitY };
// ...
}
nxn 정방행렬에 대한 구현은 그냥 n차원 벡터를 n개 붙이면 되기 때문에 큰 어려움이나 고민은 없었다.
FORCEINLINE constexpr Matrix2x2 Matrix2x2::operator*(const Matrix2x2& InMatrix) const
{
Matrix2x2 transposedMatrix = Transpose();
return Matrix2x2(
Vector2(Vector2::Dot(transposedMatrix[0], InMatrix[0]), Vector2::Dot(transposedMatrix[1], InMatrix[0])),
Vector2(Vector2::Dot(transposedMatrix[0], InMatrix[1]), Vector2::Dot(transposedMatrix[1], InMatrix[1]))
);
}
다만 이 부분은 CK렌더러(<이득우의 게임수학> 예제)를 참고해도 헷갈렸는데, 직접 종이에 써보니까 금방 규칙을 찾아 완전히 이해하고 구현할 수 있었다. 아무래도 행렬을 떠올리면 행->열 순으로 보는데 코드는 열 우선으로 설계되어있어서 헷갈렸던 것 같다.
FORCEINLINE Matrix2x2 Matrix2x2::Transpose() const
{
return Matrix2x2(
Vector2(Cols[0].X, Cols[1].X),
Vector2(Cols[0].Y, Cols[1].Y)
);
}
Transpose는 이렇게. 초기화하는 부분의 텍스트가 마치 행렬처럼 보이다보니 이것도 잠시 헷갈렸다.
마무리
이 다음에는 브레젠험, 코헨-서덜랜드를 통해 선을 그리고 클리핑하는 작업을 해보려고 한다.
'개발일지 > 소프트 렌더러' 카테고리의 다른 글
소프트웨어 렌더러 만들기 - 8 (렌더러 구조 및 더블 버퍼링) (0) | 2024.07.14 |
---|---|
소프트웨어 렌더러 만들기 - 7 (직선 그리기) (0) | 2024.02.25 |
소프트웨어 렌더러 만들기 - 5 (Custom Assertion) (0) | 2023.11.11 |
소프트웨어 렌더러 만들기 - 4 (Math헤더 보강) (0) | 2023.10.31 |
소프트웨어 렌더러 만들기 - 3 (스크린 좌표계, 출력 영역 조정) (0) | 2023.10.30 |