목록2024/08 (19)
개발하는 리프터 꽃게맨입니다.
현재까지 작성한 렌더링 머신은 시야에서 벗어난 물체들에게도 변환 연산을 수행합니다. 픽셀을 찍기 전에 해당 좌표가 스크린에 존재하는지 검사하는 조건문이 있기 때문에, 카메라에서 벗어난 물체는 그리지 않습니다. 그럼에도 불구하고, 오브젝트를 이루는 모든 정점에 대해 모델링 변환, 뷰 변환, 원근 변환, 그리고 픽셀화 직전까지의 모든 연산이 수행됩니다. 따라서 오른쪽 사진에서처럼 렌더링할 물체가 거의 없더라도, 높은 프레임을 유지하지 못하는 이유는 그릴 필요가 없는 물체를 위해 무의미한 연산이 이루어지기 때문입니다. 이 문제를 최적화하려면, 그릴 필요가 없는 물체를 빠르게 걸러낼 필요가 있습니다. 이전 글에서 다뤘듯뷰 공간에서 NDC 공간을 나타내면 위 그림과 같습니다. 해당 사다리꼴 영역을 뷰 공간으..
동일한 크기의 상자를 Z값이 변경해서 배치해봤습니다.텍스처를 입혀볼까요? 멀리있는 물체는 가까이 있는 물체에 가려져야할텐데뒤에 있는 물체가 앞에 있는 물체를 뚫고 나오고 있습니다. 그 이유는 오브젝트 사이에 그려지는 순서가 정해져있지 않기 때문입니다. 해결 방법은 두 가지 입니다. 1. Z값을 기준으로 오브젝트를 정렬하여, Z값이 큰 것부터 먼저 그린다. (깊이 정렬)2. '깊이' 라는 개념을 추가하여, 그리고자 하는 스크린 픽셀에 자기보다 깊이가 얕은 픽셀이 존재한다면, 픽셀을 찍지 않는다. (Z-Buffer 알고리즘) 저는 두 번째 방법을 사용하겠습니다. 이런 방법을 Depth Buffer, Z-Buffer 알고리즘 등으로 부릅니다. 이때까지 설계했던 원근투영 행렬을 보겠습니다. 최종적으로 얻은 클..
3D 카메라 수정제가 사용하는 3D 카메라 입니다. 카메라의 모델링 행렬로 부터 뷰 행렬을 얻어냅니다.뷰 행렬은 카메라 모델링 행렬의 역행렬이고, 이를 모든 오브젝트에 곱합니다. 이를 뷰 변환이라고 부릅니다. 윈도우 자체는 원점을 기준으로 그릴 것이므로카메라의 시점을 윈도우에 그리기 위해서는, 카메라가 변환된 만큼 월드를 역변환해야 합니다.그러면 카메라의 좌표, 회전, 크기변환 상태가 모두 원상태로 변환되며, 이에 맞추어 다른 물체들도 변환됩니다. 좌표계 설계에 따라서 다르겠지만제가 설정한 좌표계는 양의 Z축 방향에서 바라본다고 생각하고, 렌더링을 수행합니다. 그런데 이러면 카메라의 렌즈랑 마주보는 형태죠 카메라의 형태를 생각하면, 카메라의 후면에 맺힌 영상을 보는 것이 더 직관적일 겁니다. 그래서 ..
12개의 삼각형으로 이루어진 육면체를 그려보았습니다.3D 물체에는 보이는 면과 안보이는 면 2가지가 존재합니다. 보이는 면을 전면보이지 않는 면을 후면이라고 칭합니다. 전면과 후면을 판단해서 후면을 그리지 않는다면, 렌더링 성능이 더욱 향상될 것 입니다.이와같이 후면을 그리지 않는 작업을 백페이스 컬링이라고 합니다. 반시계 방향으로 정의된 삼각형이 있다고 가정합니다. 뷰행렬과 모델링 행렬을 이용해서 만들어진 최종적인 좌표의 경우의 수는 다음과 같습니다. 첫번째로, 변환된 정점을 연결했을 때, 반시계방향으로 그려질 때,두번째로, 변환된 정점을 연결했을 때, 시계방향으로 그려질 때 이때 반시계방향으로 정의된 삼각형만 그려지도록 하면 백페이스 컬링을 구현할 수 있습니다. 삼각뿔의 백 페이스 컬링 과정을..
현재까지 2D 렌더러를 탄탄하게 만들었습니다. 2D 메시 컴포넌트입니다.렌더링 하고자하는 게임 오브젝트에 해당 컴포넌트를 추가하여Mesh2D에 정점과 정점을 잇는 인덱스 정보를 저장하여정점 버퍼와 인덱스 버퍼를 만듭니다. 다음에는 RenderManager 라는 랜더링 코어 객체에 해당 오브젝트를 넘겨주어서 랜더링을 수행합니다. 저는 이 구조가 상당히 마음에 듭니다. 2D 객체를 그리는 시스템을 만들었으니 3D 객체도 만들어보겠습니다. 3D 객체를 만들기 위해서는 2D 시스템에서 사용하던 좌표 시스템의 차원을 한 단계씩 높여줘야 합니다. Vertex는 3차원으로 정의되어야 하고3차원에서 자유로운 선형 변환을 위해 3차원 벡터 및 4x4 정방행렬을 정의해야 합니다. 그러면 또 Vertex3D를 정의해줘..