https://www.acmicpc.net/problem/11967 문제해설해당 문제는 BFS문제이다.정답은 아니지만 본인은 입력받은 정점을 인접리스트로 관리하고 BFS탐색시 인접리스트의 원소들에 대해서 '불을 먼저 킨다' 그 후에 상하좌우를 살펴 불이 켜져 있으면 이동하는 식으로 로직의 흐름을 짯다. 주의할 점은 '불을 켜는 과정에서 무조건 큐에 넣으면 안된다'는 것이다.혹시 (1, 1) -> (1, 2) -> (1, 3)이후 (1, 3)에서 (2, 1)에 대해 불을 킬 수 있다고 해서 (2, 1)을 바로 넣으면 안된다. 본인은 처음에 베시가 불을 킬 수 있는 영역에 대해서 불을 킨다음에 불을 킨 정점을 큐에 추가하였는데, 잘못된 로직이였다. (1, 1) -> (1, 2) -> (1, 3) 순으로 방문..
절두체 컬링이란 절두체 컬링이란 절두체 안에 들어온 물체만 그리겠다는 뜻이다.현재 색이 들어간 물체들은 모두 DrawCall을 호출하고 있다. PixelShader단계 까지 가지만 절두체 밖에 있는 물체들은 그려지지 않는다. '즉 모든 오브젝트가 DrawCall을 호출하기 때문에 절두체 안에 들어와 있는 녀석들만 DrawCall을 호출하게 하여 성능 향상을 도모 하겠다는 것'이다.이렇게 절두체 밖에 있는 오브젝트들은 DrawCall을 아예 호출하지 못하도록 하는 것이다. 구현 방법평면의 방정식과 NDC 공간의 개념만 알고 있으면 어렵지 않다.우선 NDC상의 절두체를 선언해준다. 기억이 나나? 좌상단은 (-1, 1), 우하단은 (1, -1) 가운데가 (0, 0)이다.이렇게 점 8개를 선언해둔다. 이후 해당..
NavMesh(Navigation Mesh)를 만들어보자. NavMesh란?NavigationMesh의 줄임말로, 게임내에서 걷고, 뛰고, 뭐 별 짓을 다 할 수 있게 하는 구역을 설정하는 시스템을 말한다. 왜 쓰나? '그냥 플레이어 월드에 띄워 놓고 대충 걸어다니다가 벽이랑 충돌 처리 해서 못가게 하면 되지 않나?'라고 물어보면 ㅇㅇ 그렇게 해도 된다. 그렇게 해도 게임 만드는데 아무 문제 없다고 생각한다.근데 이렇게 하면 모든 벽에 Collider를 다 씌워서 매 프레임 플레이어와 충돌 계산을 해야한다. 게임내에 플레이어만 있나? 그렇지 않음.그래서 NavMesh를 사용하는데 (본인 피셜) 미리 이동가능한 영역을 설정해두어서 불필요한 충돌 처리를 최소화 하고 애초에 게임내에 이동가능한 영역과 아닌 영..
게임을 모작하게 되어서 Assimp라이브러리로 모델들을 추출했는데 원하는 애니매이션들이 없어서 직접 만들게 되었고 그 과정을 최대한 간략하게 개념과 함께 정리했다.당연히 기초적인 수준의 애니매이션을 만들었고 기초 지식만을 가지고 응용했다.아래 설명하는 방식은 절대 정답이 아니고 그냥 헤딩해서 터득한 방법과 시행착오들을 '흐름만'정리 해 두었다.코드에 대한 자세한 설명이나 Imgui, Assimp설명은 없다. (너무 길고 힘들다 ㅠ)애니매이션의 기초적인 지식이 없으면 이해하기 힘들다.고려대 그래픽스 강의에서 애니매이션을 꼭 듣기 바라고 내가 쓴 글인 https://cjbworld.tistory.com/75 도 같이 보자 ㅎㅎ;;그냥 이사람은 이런 흐름으로 했구나 정도로 읽어주길 바란다. 흐름 정리우선 본인..
스키닝 애니매이션이란?스키닝 애니메이션(Skinning Animation)은 3D 컴퓨터 그래픽에서 객체가 자연스럽게 움직이도록 하기 위해 사용하는 애니메이션 기법이다. 3D 모델의 뼈대를 기반으로 정점을 뼈대에 결합시키는 기법이다. 이렇게 개념만 보면 무슨 말인지 모르겠다.그래서 본인이 스스로 공부한 것을 바탕으로 최대한 이해하기 쉽게 정리해보려고한다.(렌더링 파이프라인과정과 좌표계 변환 개념을 잘 이해하지 못하고 있다면 어렵다)모델이란?모델은 여러개의 메쉬들로 이루어진 경우가 많기 때문에 본인은 모델의 정의를 '여러 메쉬들로 이루어진 메쉬의 집합'라 하겠다. 그리기의 단위는 점, 선, 삼각형 순인데 정점 3개가 모이면 '폴리곤(polygon)'이라 부르고 이 폴리곤의 집합을 '메쉬(mesh)'라고 ..
https://www.acmicpc.net/problem/9663 백트레킹 문제이다.어렵고 까다롭지만 좋은 문제라서 따로 정리해두려고한다.더 좋은 풀이는 https://cryptosalamander.tistory.com/58 이분의 풀이를 추천드린다. 풀이 흐름해당문제는 일단 하나의 row에 하나의 퀸만 배치할 수 있다는 것을 전재로 두는게 좋다.탐색 자체는 현재 row(행)의 특정 col(열)에 퀸을 배치할 수 있는지 없는지를 판단할 것이다.현재 row라는 값이 필요하기 때문에 탐색할 때 param으로 현재 현재 ‘row’를 받아와야한다.row의 특정 col에 조건을 따져 배치할 수 있다면 배치하고 그렇지 않다면 되돌아 가준다.계속 배치를 하다가 row가 n과 같다면 한 row당 하나의 퀸을 배치한 것..
스레드(thread)란?'실행의 단위, 프로세스를 구성하는 실행 흐름의 단위를 뜻한다.' 실행의 흐름 단위가 1개라면 단을 프로세스, 실행 흐름의 단위가 여러개라면 멀티 스레드 프로세스이다.실행에 필요한 최소한의 정보만(프로그램 카운터, 레지스터, 스택)을 유지한체 프로세스의 자원을 공유하여 실행한다. 스레드가 왜 필요할까?윈도우 OS 기준 멀티 프로세스 기반 OS이다.즉 여러개의 프로세스를 실행할 수 있는데 여러개의 프로세스를 실행할 때 '컨텍스트 스위칭'이 발생한다.컨텍스트 스위칭(CS라 하겠다)을 간단하게 말하면 프로세스의 상태 정보를 저장하고 복원하는 일련의 과정을 뜻한다.이 CS는 아무리 못해도 1초에 수십번 발생하기 때문에 성능저하의 원인이 된다.(멀티 프로세스 기반 OS의 최대 단점중 한가지..
수정 및 추가된 부분먼저 이전에 원근 투영 변환 행렬에 대해서 조금 잘 못 알고있던 부분을 수정했고 투영 변환 행렬에 대한 정확한 의미?를 추가하였습니다.원근 투영 변환 행렬이란?우선 원근 투영은 인간의 눈과 비슷하게 3차원 공간의 객체를 2차원 평면에 사영(Projection)하여 화면에 나타내는 방식이다. 즉, 3D 뷰 공간(space)으로 부터 2D 뷰포트 공간에 정점들을 변환 하는 행렬을 말한다.근데, 보통 구글링을 하면 3차원 공간에서 바로 2차원 뷰포트로 가는듯이 말을하는 글들이 많은데 중간 과정이 있다.바로 아래와 같이 카메라 시야각(FOV)안에 담긴 물체들을 -1~1크기의 정육면체 안으로 변환한다.NDC좌표계로 변경된 좌표를 이제 뷰포트 매핑을 해주어 화면에 보이게 되는 것이다. 왜 변환을..