전체 글

성장 과정 일기, 누군가에게 정보를 제공하기 위해서가 아닌 스스로 배운 내용을 정리하기 위해 작성하는 블로그 입니다. 잘못된 정보가 있으면 댓글로 적어주세요.
MaterialMaterial 이란 물체들이 가지고 있는 잡동사니 특성이라고 생각하면 된다. 쉐이더를 통해서 물체를 그려줄 때 넘겨주는 인자중 하나인 셈이다. 어떻게 물체를 표현할 것이고 이 물체는 어떤 재질이고 빛은 어느 색을 흡수할 것인지 등등 을 넘겨주는 것이다. Texture와 같은 것도 Material에 포함되어 있는 것이다.#pragma once#include "ResourceBase.h"class Material : public ResourceBase{ using Super = ResourceBase;public: Material(); virtual ~Material(); shared_ptr GetShader() { return _shader; } MaterialDesc& GetMateria..
Global Shader이전에 작업하던 방식은 MeshRenderer 컴포넌트에서 .fx 파일의 쉐이더 에서 cubffer GLOBAL에 선언된 World, View, Projection 등의 행렬에 직접 접근해 Const Buffer에서 설정해 주었다. 이는 엄청난 편리함을 가져다 주는 장점이 있었다. 그런데 이 방식으로 고집해서 계속 하게되면 진지한 게임을 제작하는데 있어 문제가 발생한다.이렇게 하게되면 한가지 변수만 바뀌어도 나머지 변수들도 다 Update를 해주어야 하는 문제가 발생한다. 그렇기 때문에 이를 나눠 관리할 필요성이 있다.World, View, Projection에서 개개인의 물체마다 다르게 관리해야할 것은 바로 World 이고 나머지 행렬 두개는 묶어서 한번에 관리가 가능하다. 가령..
Height Map지면을 까는 Grid를 지난 포스팅에 해봤는데 이제 이것을 산 처럼 어디는 내려가고 어디는 올라가는 형식의 높이가 있는 맵을 한번 테스트 해보자. 유니티에서는 Terrain 툴이 존재해서 이것을 할 수 있다.이것을 이용할 것인데 이는 terrain의 높이를 8비트로 저장한 사진이다. 즉 0,0 부터 맵 끝까지 어느 지형의 높이를 0부터 255의 숫자로 나타낸 것이다. 이것을 우린 파싱해서 실제 맵에 적용해 줘야하는 것이다.이걸 CPU에서 연산해서 가지고 있다가 필요할 때 마다 GPU에 넘겨주는 방식도 있고 GPU 자체가 들고있어서 필요할 때마다 사용하는 방식 등 여러가지가 있지만 전자로 해보겠다.#include "pch.h"#include "07. HeightMapDemo.h"#incl..
카메라게임에서 가장 중요한 요소라고 할 수 있다.이전 포스팅에는 카메라가 없으니 view와 projection을 비워뒀는데 이제 카메라를 만들어서 카메라가 찍는 영역을 추출해서 화면에 보여주는 걸 만들어보자.#pragma once#include "Component.h"enum class ProjectionType{ Perspective, // 원근 투영 Orthographic, // 직교 투영};class Camera : public Component{ using Super = Component;public: Camera(); virtual ~Camera(); virtual void Update() override; void UpdateMatrix(); void SetNear(float value) ..
프로젝트 설정기존에 작업했던 작업물에서 3D 에 맞춰 작업하기 위해 새로운 프로젝트를 만들어보자. 기존에 사용했던 코드들 중 일부는 그대로 가져와주고 파이프라인 작업은 조금더 세련된 방법으로 수정한다. VS에서 Windows 데스크탑 마법사로 프로젝트를 만들어준다.그리고 나서 먼저 라이브러리를 만들어주자.파일 구조는 위와 같이 맞춰주고 Enginge 프로젝트에서 설정을 맞춰준다.위 과정은 많은 생략이 되어있다. 기존에 작성된 코드를 복사 하기도 한 반면 새로운 라이브러리들도 많이 추가되었기 때문에 너무 긴 글이 탄생할까 생략되었다.여기서 중요한건 Shader인데 우리가 2D 에서 사용하던 Render는 IA 과정과 VS, RS, PS 등등 여러 과정을 수동으로 전부 다 넣어줬어야 하는 반면 이건 자동으로..
Material렌더를 할 때 중복되는 부분인 Material과 Mesh를 Resource의 개념으로 따로 분리하도록 하자. MeshRenderer에서 사용하는 Mesh를 따로 설정하기 위해 Mesh라는 클래스를 만든다.#pragma once#include "ResourceBase.h"class Mesh : public ResourceBase{ using Super = ResourceBase;public: Mesh(ComPtr device); virtual ~Mesh(); void CreateDefaultRectangle(); shared_ptr GetVertexBuffer() { return _vertexBuffer; } shared_ptr GetIndexBuffer() { return ..
공용으로 관리될 부분은 Manager로 빼서 관리를 해보자.SceneManager지금까지 짠 코드를 보면 GameObject들을 그냥 Main 프로그램이 전부 다 가지고 있고 Update를 요청했다.우리가 생각해보면 유니티에서는 Scene이라고 하는 객체가 모든 GameObject를 가지고 있고 이를 관리하고 있다.그렇기에 SceneManager를 만들어서 관리해보자.여기서 Scene은 위에서 말한 대로 각종 오브젝트들을 보관하고 있는 클래스이다.SceneManager는 이러한 여러개의 Scene들을 하나로 묶어서 관리하기 위한 클래스이다.#pragma onceclass GameObject;class Scene{public: void Awake(); void Start(); void Update(); v..
엔진 구조를 완벽히 분석하는 것은 실제 상용 엔진을 이해하는데 매우 큰 도움이 된다.Component유니티에서는 어떤 오브젝트에 Component를 여러개를 조립해서 하나의 생명을 불어넣을 수 있다.이전 포스팅에서 다뤘던 Transform도 하나의 Component라고 할 수 있다. 각 Component는 하나의 특정 역할을 하는 것이 대부분이다. 그래서 지금 작업중인 GameObject를 수정해보자. 현재 GameObject는 Mesh에 대한 정보, 즉 한번만 로드하면 될 정보들도 같이 들고 있다. 이는 고블린의 쉐이더나 정점정보를 각 고블린 당 하나씩 들고 있다는 점이 문제인 것이다. 이는 나중에 MeshRenderer로 수정할 것이다. enum class ComponentType : uint8{ T..
마지막으로 엔진을 만드는 초석이 되는 프레임워크 중 GameObjcet 마다 개별로 가지고 있는(공용으로 사용되는 쉐이더나 Vertex 정보들이 아닌) 것들을 따로 분리해보자.유니티에서 부모와 자식 계층을 잘 생각해보자.자식의 좌표는 부모의 좌표계에 종속된다. 만약 B 가 10,0,0 좌표에 있다고 하고 A는 5,0,0에 있다고 해보자. B가 A의 자식이 되었을 때, B에 표시되는 좌표는 5,0,0으로 바뀐다. 그 이윤 부모의 좌표계를 기준으로 5,0,0에 있기 때문이다.그럼 B의 월드 좌표를 얻기 위해서는 어떻게 해야할까? 먼저 부모를 기준으로 하는 변환 행렬을 구한 뒤(SRT) 다시 그 위치를 기준으로 한번 더 SRT를 하면 구할 수 있을 것이다. 이런 것처럼 Transform에는 많은 정보가 있고 ..
지난 포스팅에 이어서 프레임워크를 제작해보자.Shader쉐이더는 vertexShader와 vsBlob, pixelShader와 psBlob을 묶어줘야한다.#pragma onceenum ShaderScope{ SS_None = 0, SS_VertexShader = (1 device); virtual ~Shader(); virtual void Create(const wstring& path, const string& name, const string& version) abstract; ComPtr GetBlob() { return _blob; }protected: void LoadShaderFromFile(const wstring& path, const string& name, const string& v..
Mintriever
어제보다 성장한 나