전체 글 169

[그래픽스] 짐벌락 없는 사원수 회전

오일러 각을 이용해서 회전을 구현하면,최전축이 서로 겹쳐서 하나의 축이 다른 두 축을 완전히 포함하게 되는 경우가 발생합니다.이를 짐벌락 현상이라고 합니다. 이 경우 회전의 자유도가 제한되게 됩니다. 이에 대한 우수한 해결책은 사원수 (Quaternion) 회전 입니다. 사원수 개요  사원수는 실수부 1개와 허수부 3개로 이루어집니다.  허수 부호 i, j, k 는 모두 제곱하면 -1 을 만들어내는 허수는 맞으나i, j, k 는 각각 다른 허수 체계를 사용합니다. 사원수라는 독특한 체계가 나오게된 배경은 복소평면을 3차원으로 확장시키고자하는 시도에서 비롯되었습니다. 실수부를 Right, 허수부 Up 으로 하여 복소수를 2차원 평면으로 표현할 수 있고, 이를 복소평면이라고 합니다. 윌리엄 로원 해밀턴은 복..

[그래픽스] 삼각형 클리핑

현재까지 만들어낸 렌더러에 존재하는 버그를 보여드리겠습니다.  오브젝트 위로 지나가면 선이 갑자기 늘어나거나 텍스처 맵핑이 잘못되는 문제가 발생합니다.  그 이유는 카메라 아래에 커다란 삼각형이 존재할 때, 투영이 이상하게 되는 현상이 발생하기 때문입니다.카메라 뒷편에 있는 점도 투영되게 됩니다.원래라면 카메라 앞에 있는 점만 투영이 되어야 하는데, 보이지 않는 뒷면의 정점까지 투영이 되면서 문제가 발생한다고 생각할 수 있습니다. 눈 앞에 있는 정점만 그리면 되는 않나? 라고 생각할 수 있지만, 점 2개로는 삼각형을 만들 수 없기 때문에 상당히 골치가 아픈 문제입니다. 이 경우, 큰 삼각형은 작은 삼각형으로 축소시킬 수 있다면 해결할 수 있습니다.  이와같은 삼각형이 있다면 이렇게 잘라내면 됩니다. 삼각..

[그래픽스] 가시부피와 절단

현재까지 작성한 렌더링 머신은 시야에서 벗어난 물체들에게도 변환 연산을 수행합니다.   픽셀을 찍기 전에 해당 좌표가 스크린에 존재하는지 검사하는 조건문이 있기 때문에, 카메라에서 벗어난 물체는 그리지 않습니다. 그럼에도 불구하고, 오브젝트를 이루는 모든 정점에 대해 모델링 변환, 뷰 변환, 원근 변환, 그리고 픽셀화 직전까지의 모든 연산이 수행됩니다. 따라서 오른쪽 사진에서처럼 렌더링할 물체가 거의 없더라도, 높은 프레임을 유지하지 못하는 이유는 그릴 필요가 없는 물체를 위해 무의미한 연산이 이루어지기 때문입니다. 이 문제를 최적화하려면, 그릴 필요가 없는 물체를 빠르게 걸러낼 필요가 있습니다.  이전 글에서 다뤘듯뷰 공간에서 NDC 공간을 나타내면 위 그림과 같습니다. 해당 사다리꼴 영역을 뷰 공간으..

[그래픽스] 깊이 구현

동일한 크기의 상자를 Z값이 변경해서 배치해봤습니다.텍스처를 입혀볼까요? 멀리있는 물체는 가까이 있는 물체에 가려져야할텐데뒤에 있는 물체가 앞에 있는 물체를 뚫고 나오고 있습니다. 그 이유는 오브젝트 사이에 그려지는 순서가 정해져있지 않기 때문입니다. 해결 방법은 두 가지 입니다. 1. Z값을 기준으로 오브젝트를 정렬하여, Z값이 큰 것부터 먼저 그린다. (깊이 정렬)2. '깊이' 라는 개념을 추가하여, 그리고자 하는 스크린 픽셀에 자기보다 깊이가 얕은 픽셀이 존재한다면, 픽셀을 찍지 않는다. (Z-Buffer 알고리즘) 저는 두 번째 방법을 사용하겠습니다. 이런 방법을 Depth Buffer, Z-Buffer 알고리즘 등으로 부릅니다.  이때까지 설계했던 원근투영 행렬을 보겠습니다. 최종적으로 얻은 클..

[그래픽스] 3D 카메라 설계 수정, 원근법 구현

3D 카메라 수정제가 사용하는 3D 카메라 입니다. 카메라의 모델링 행렬로 부터 뷰 행렬을 얻어냅니다.뷰 행렬은 카메라 모델링 행렬의 역행렬이고, 이를 모든 오브젝트에 곱합니다. 이를 뷰 변환이라고 부릅니다.  윈도우 자체는 원점을 기준으로 그릴 것이므로카메라의 시점을 윈도우에 그리기 위해서는, 카메라가 변환된 만큼 월드를 역변환해야 합니다.그러면 카메라의 좌표, 회전, 크기변환 상태가 모두 원상태로 변환되며, 이에 맞추어 다른 물체들도 변환됩니다. 좌표계 설계에 따라서 다르겠지만제가 설정한 좌표계는 양의 Z축 방향에서 바라본다고 생각하고, 렌더링을 수행합니다. 그런데 이러면 카메라의 렌즈랑 마주보는 형태죠 카메라의 형태를 생각하면, 카메라의 후면에 맺힌 영상을 보는 것이 더 직관적일 겁니다.  그래서 ..

[그래픽스] 백 페이스 컬링

12개의 삼각형으로 이루어진 육면체를 그려보았습니다.3D 물체에는 보이는 면과 안보이는 면 2가지가 존재합니다. 보이는 면을 전면보이지 않는 면을 후면이라고 칭합니다. 전면과 후면을 판단해서 후면을 그리지 않는다면, 렌더링 성능이 더욱 향상될 것 입니다.이와같이 후면을 그리지 않는 작업을 백페이스 컬링이라고 합니다.  반시계 방향으로 정의된 삼각형이 있다고 가정합니다. 뷰행렬과 모델링 행렬을 이용해서 만들어진 최종적인 좌표의 경우의 수는 다음과 같습니다.   첫번째로, 변환된 정점을 연결했을 때, 반시계방향으로 그려질 때,두번째로, 변환된 정점을 연결했을 때, 시계방향으로 그려질 때 이때 반시계방향으로 정의된 삼각형만 그려지도록 하면 백페이스 컬링을 구현할 수 있습니다.  삼각뿔의 백 페이스 컬링 과정을..

[그래픽스] 가볍게 구현해본 3D 와이어 프레임 랜더링

현재까지 2D 렌더러를 탄탄하게 만들었습니다. 2D 메시 컴포넌트입니다.렌더링 하고자하는 게임 오브젝트에 해당 컴포넌트를 추가하여Mesh2D에 정점과 정점을 잇는 인덱스 정보를 저장하여정점 버퍼와 인덱스 버퍼를 만듭니다.  다음에는 RenderManager 라는 랜더링 코어 객체에 해당 오브젝트를 넘겨주어서 랜더링을 수행합니다. 저는 이 구조가 상당히 마음에 듭니다. 2D 객체를 그리는 시스템을 만들었으니 3D 객체도 만들어보겠습니다. 3D 객체를 만들기 위해서는 2D 시스템에서 사용하던 좌표 시스템의 차원을 한 단계씩 높여줘야 합니다. Vertex는 3차원으로 정의되어야 하고3차원에서 자유로운 선형 변환을 위해 3차원 벡터 및 4x4 정방행렬을 정의해야 합니다.   그러면 또 Vertex3D를 정의해줘..

색칠된 삼각형 그리기

아이디어 세 점이 주어졌을 경우 삼각형을 그릴 수 있습니다.그리고 세 점의 좌표를 시용해서 삼각형을 감싸는 가장 작은 직사각형을 정의할 수 있습니다.이 직사각형이 가지는 좌표는 for문 2개를 순회해서 모두 얻어낼 수 있습니다.그렇다면, 이렇게 얻어낸 좌표를 해당 삼각형이 포함하는지 아닌지 판단하고삼각형 내부에 있는 점만 찍어내면, 색칠될 삼각형을 얻어낼 수 있을겁니다.  삼각형 내부에 있는 점삼각형을 정의해보았습니다. 간단하게 람다 1, 람다 2를 t, s 로 바꿔서 식을 전개해보겠습니다. 어떤 점 Px 가 있고 P3->Px 벡터를 w라고 했을 때벡터 w가 s [0, 1]t [0, 1]s+t [0, 1]에 대해서 정의가 된다면, 삼각형 내부에 있다고 이해할 수 잇습니다. 그렇다면, s와 t의 값을 얻어..

컨벡스 결합에 대한 삽질

어떤 집합안에 2개의 지점을 선으로 연결했을 때, 그 선을 이루는 요소들이 그 집합 안에 속해 있다면 그 집합을 컨벡스 집합이라고 부릅니다.좌측이 컨벡스 집합우측은 컨벡스 집합은 아니고 컨케이브 집합이라고 부릅니다. 컨벡스 집합을 만들어내는 수식을 컨벡스 결합이라고 부릅니다.어떤 점들의 스칼라 계수 곱의 합을 통해서 닫힌 상태의 새로운 점을 만들어낼 수 있습니다.이러한 결합을 아핀 결합이라고 부릅니다. 일반화하면 이렇게 나타낼 수 있습니다. 선형 독립인 점 2개의 아핀 결합은 두 점을 포함하는 직선선형 독립인  점 3개의 아핀 결합은 세 점을 포함하는 평면을 생성할 수 있습니다.선형 독립인  점 4개의 아핀 결합은 네 점을 포함하는 공간을 생성합니다. 여기서 한 발 더 나아가 봅시다. 어떤 점 Px 는 ..