DirectX11 8

DirectX11 학습 - 애니메이션

3D 캐릭터에 애니메이션을 적용하려면 어떻게 해야할까? 2D라면 여러개의 이미지를 준비하여 이미지들을 빠르게 보여주면 애니메이션 효과를 낼 수 있지만, 3D는 수많은 정점들로 이루어져있어서 모든 장면의 정점 정보들을 따로 저장하는 것은 매우 비효율적일것이다. 3D 오브젝트에는 모델에 뼈대를 심어서 정점들이 어떤 뼈대의 영향을 받아서 움직일 것을 정하는 리깅 작업을 통해 애니메이션을 적용한다. { shared_ptr converter = make_shared(); converter->ReadAssetFile(L"Kachujin/Run.fbx"); converter->ExportAnimationData(L"Kachujin/Run"); } // f : keyfrmae // b : bone Matrix toRo..

DirectX11 2024.03.31

DirectX11 학습 - StaticMesh

단순한 도형이 아닌 가상 공간에 배치되는 물체들은 정점들이 굉장히 많을 것이다. 이런 물체의 정점 정보들을 코드로 하나하나 채워줄 수 없기 때문에 외부에서 만든 파일을 읽어서 사용해야 한다. fbx 포맷의 파일을 사용했고, Assimp라는 라이브러리를 사용해 fbx파일을 읽어서 파일을 분석한 뒤 필요한 정보만 뽑아서 따로 저장하고 사용할 때는 따로 저장한 정보를 읽어서 사용했다. 필요한 정보만 따로 저장하는 이유는 Assimp라이브러리를 사용해 파일을 로드하면 이런저런 잡다한 정보들까지 모두 추출하여 시간이 오래 걸리기 때문이다. shared_ptr converter = make_shared(); converter->ReadAssetFile(L"Tank/Tank.fbx"); converter->Expor..

DirectX11 2024.03.31

DirectX11 학습 - Normal Mapping

지금까지 작성한 코드와 쉐이더로 가죽 무늬 텍스쳐를 구와 큐브 메시에 적용한 모습이다. 분명 잘 적용된 모습이지만 굴곡이 표현되지 않아서 뭔가 아쉬운 모습이다. 이것은 큐브로 예를 들자면 큐브의 한 면에 있는 4개의 꼭짓점의 정점의 normal값이 모두 같아서 보간 작업을 해도 모든 픽셀이 같은 normal값을 갖기 때문이다. 그렇다면 이 텍스쳐를 더 입체적으로 굴곡이 있는 모습을 표현하려면 어떻게 해야할까? 제일 직관적인 방법은 굴곡이 있는 부분마다 정점을 추가하는 방법이 있을 것이다. 하지만 이 방법은 정점의 개수가 너무 많아지고 텍스쳐마다 다르게 적용해야 하기 때문에 좋은 방법은 아닐 것이다. 그렇다면 정점의 개수를 늘리지 않고 물체를 더욱 생동감 있게 표현하려면 어떻게 해야할까? 이럴때 사용하는 ..

DirectX11 2024.03.30

DirectX11 학습 - Light

현실세계에서 물체가 우리의 눈에 보이는 원리는 간단하게 말하자면 광원에서 나온 빛이 물체에 닿은 후 반사되어 눈에 들어오는 것이다. 이런 빛을 가상의 공간에서 표현하려면 어떻게 해야할까? 광원이 하나가 아닐수도 있고, 광원에서는 온갖 방향으로 빛을 쏠것이고, 물체에 반사된 빛은 또 다른 물체에 반사되기도 하는 상황도 있기 때문에 이런 모든 상황에 대해 빛을 추적하여 실시간으로 계산하는 것은 매우 힘들 것이다. 그래픽스에서 선택한 방법은 최소한의 비용으로 그럴듯하게 보이는 조명 연산식을 이용하여 빛을 흉내내는 것이다. 이런 빛 연산들 중 하나인 고전적이고 간단한 방법인 Phong Reflection Model이 있다. Phong Reflection Model은 표면에서 반사되는 빛을 세가지 요소로 나누고 ..

DirectX11 2024.03.30

DirectX11 학습 - Normal Vector

물체의 어떤 지점에서 표면과 수직인 방향벡터를 노말 벡터라고 한다. 이 노말 벡터는 빛 연산을 할때 사용된다. 노말 벡터와 빛이 들어오는 방향을 이용해 내적 연산을 해서 해당 픽셀에 들어오는 빛의 세기를 구할 수 있다. shared_ptr _geometry; struct VertexTextureNormalData { Vec3 position = { 0, 0, 0 }; Vec2 uv = { 0, 0 }; Vec3 normal = { 0, 0, 0 }; }; void P_3Normal::Init() { _shader = make_shared(L"_3_Normal.fx"); // Texture _texture = RESOURCES->Load(L"Veigar", L"..\\Resources\\Textures\\..

DirectX11 2024.03.28

DirectX11 학습 - 텍스쳐 입히기, 카메라

이번 시간에는 메쉬에 텍스쳐를 입히고 카메라를 추가하여 카메라의 위치에 따라서 물체가 다르게 보여지도록 하는 코드를 작성한다. 텍스쳐를 입히기 위해서는 UV좌표에 대한 이해가 필요하다. UV좌표란 텍스쳐 이미지를 메쉬에 입히기 위한 텍스쳐의 2D좌표이다. 텍스쳐의 크기에 상관없이 최소 좌표는 (0,0), 최대 좌표는 (1,1)이다. 텍스쳐에서 입히고 싶은 부분을 오려서 메쉬에 적용한다고 생각하면 이해하기 수월하다. 메쉬의 정점에 uv좌표를 포함시켜서 쉐이더에 올리면 Rasterizer 단계에서 uv좌표들이 보간되고 최종적으로 PixelShader 에 보간된 uv좌표가 전달되어서 텍스쳐에서 해당 좌표의 픽셀값을 가져오게 된다. 우리는 게임을 할때 가상의 3D 게임 세상을 2D 화면으로 보고 플레이하고있다...

DirectX11 2024.03.28

DirectX11 학습 - 삼각형 띄우기

가상의 공간에 등장하는 3D 모델들은 사실 삼각형으로 이루어져있다. 수많은 삼각형들로 기하학적인 모형을 만들고 그 위에 텍스쳐를 입혀서 화면에 출력하는 것이 우리가 보는 3D모델의 모습이다. 가장 기본이 되는 삼각형을 화면에 띄워볼건데, 삼각형을 띄우는 작업도 처음에는 생각보다 간단하지 않다. struct VertexColorData { Vec3 position = { 0, 0, 0 }; Color color = { 0, 0, 0, 0 }; }; vector _vertices; vector _indices; void Triangle::Init() { _shader = make_shared(L"_Triangle.fx"); _vertices.resize(3); // 정점 정보 설정 _vertices[0].p..

DirectX11 2024.03.26

DirectX11 학습 - 프로젝트 기본 프레임워크

https://www.inflearn.com/course/directx11-%EA%B2%8C%EC%9E%84%EA%B0%9C%EB%B0%9C-%EB%8F%84%EC%95%BD%EB%B0%98/dashboard [게임 프로그래머 도약반] DirectX11 입문 강의 - 인프런 게임 프로그래머 공부에 있어서 필수적인 DirectX 11 지식을 초보자들의 눈높이에 맞춰 설명하는 강의입니다., [사진][사진] [사진] 게임 개발자는 Unreal, Unity만 사용할 줄 알면 되는 거 아닌가요? 엔 www.inflearn.com 위 강의를 보며 약 2달간 DirectX11을 학습하며 이론으로만 알고있던 렌더링 파이프라인 과정들을 직접 실습해보고 다양한 렌더링 기술들에 대해 학습하였다. int WINAPI WinM..

DirectX11 2024.03.26