[DirectX11] 14

모델 #3 모델 띄우기

지난시간까진 Assimp라이브러리를 이용해서 fbx파일을 읽고 필요한 정보만 머티리얼정보는 .xml파일로, 그외의 메쉬정보(정점, 인덱스, 이름, 계층구조)는 .mesh정보로 저장하는 작업을 AssimpTool프로젝트를 만들어 작업했다. 이제 이렇게 만든 파일을 다시 AssimpTool프로젝트에서 읽어다가 쓰는 작업을 해보자. 우선 Engine프로젝트에서 우리가 직접만든 파일을 쓰기전에는 텍스쳐를 로드하고 GeometryHelper로 만든 메쉬를 ResourceBase를 상속받은 Mesh에서 인덱스정보와 버텍스 정보를 갖고있게하고, 리소스 매니저에서 이를 가져와 오브젝트에 메쉬를 설정하도록 해서 쓰고 있었다.더보기// 18.NormalMappingDemo.cpp // Object _obj = make_s..

[DirectX11] 2024.09.19

모델 #2 Assimp라이브러리 이용해 Material, Bone, Mesh로딩하기.

우선 본격적으로 Assimp라이브러리를 사용하기에 앞서 Assimp라이브러리로 읽어들인 fbx파일을 어떤 구조를 가지고 있을지 살펴보자.Assimp에서 관리하는 최상위 객체인 Scene이 하나 우선 있다.Scene:이 안에 RootNode와 Mesh,Material 배열이 있다.RootNode : 메쉬의 계층구조를 위한 정보. 자신의 메쉬정보 Meshes[]와 직접 자식들의 포인터들 같은 정보가 들어있다. 만약 계층구조가 아니라면 RootNode가 아닌 Material, Mesh하나씩만 Scene에 들고 있으면 된다.ChildNode: RootNode의 직접자식들의 포인터가 가리키는 것 중 하나로 또 자신의 메쉬들 정보와/직접자식들의 포인터들 같은 정보가 들어있다. (*그리고 들고있는 메쉬가 꼭 메쉬가 ..

[DirectX11] 2024.09.19

모델 #1 Assimp 라이브러리

Assimp를 사용해 fbx파일 로드하기지금까지는 기본도형 큐브같은걸 코드로 만들어서 갖다 썼지만 유니티짱같은건 만드는게 말이 안된다.그래서 맥스나 마야로 만든 파일을 가져다가 쓸 것이다.그 맥스나 마야에서 추출하면 fbx타입으로 나오고 이를 로드할수 있도록 도와주는게 Assimp라이브러리다. 유니티에서 fbx파일을 열어서 보면 하나의 파일이 여러 정보를 포함하고있는데 대부분 메쉬이고 경우에 따라서 머티리얼이나 조명도 포함하고있다.드래곤 모델 같은경우는 라이트와 카메라도 들고있다.그런데 왜 이렇게 많은 정보를 포함하고 있을까? 지오메트리 정보(정점정보)만 갖고있으면 되는게 아닐까 싶지만 꼭 모델이 게임에만 쓰이라는 법은 없다. 애니메이션, 영화용으로 쓰일 수도 있기 때문에 복잡하다.그래서 fbx로 만들어..

[DirectX11] 2024.09.19

Normal Mapping

지난번 시간의 Material에 쉐이더에 넘겨줄 값들을 한데 모으는 작업을 했었다.이번 시간엔 Material에 질감을 주는 방법을 더 연구해보자.예를들어 같은 메쉬에 같은 디퓨즈맵 텍스쳐를 입히면 같은 오브젝트처럼 보일것이다. 그러나 어떤한곳에는 울툴불퉁한 느낌을 주고싶다. 그럼 어떻게 해야될까? 한 면에서도 빛을 반사시키는 각도를 다르게 보이게 하면 마치 굴절이 있는것처럼 보인다. 그럼 이를 구현하는 방법은 무엇이 있을까?방법 1) 메쉬의 정점수를 늘리는 것이다. 그럼 정말로 표면이 울퉁불퉁한 것이고 빛 계산도 정점에 따라 다르게 될 것이다. 그러나 정점수가 늘어난다는 것은 파이프라인에 들어가는 정점의 수가 늘어난단다는것으로 렌더링의 부하가 같이 커지게 된다.방법2) 그럼 음영효과를 줄 수 있으면서 ..

[DirectX11] 2024.09.18

Material

Material이란 무엇인가?이전에 RenderManager에서 MaterialDesc타입을 정의해서 ambient, diffuse, specular값을 들고 있는데 각각의 오브젝트가 하나씩 들고 있도록 했다. 그리고 이 MaterialDesc를 값을 넣어 RenderManager클래스의 PushMaterialData로 상수버퍼에 넘겨주었다. 또 MeshRenderer컴포넌트의 Update에서는 메쉬와 텍스쳐를 이용해 그릴 수 있도록 쉐이더에 넘겨주기도 했었다. => 이 둘에서 공통적으로 볼 수 있는 것은 쉐이더에서 그리는데 필요한 값들을 넘겨주는 역할을 한다는 것이다.*그리고 MeshRenderer컴포넌트에서 텍스쳐를 지금은 가지고있는데 사실은 이부분이 머티리얼로 빠지고 RenderManager에서 하..

[DirectX11] 2024.09.10

Light #5 Light 통합

앞서 배운 네 개의 조명 기법 Ambient, Diffuse, Specular, Emissive를 합쳐보자.공용으로 사용할 쉐이더 파일 00.Lightfx 를 만들어서 Client프로젝트의 Shaders/ Common필터에 00.Global.fx와 함께 뒀다.그리고 13.Light.fx를 만들어서 모든 연산을 다 통합해서 연산하는 쉐이더를 만들 것이다. 1. 00.Light.fx우선 00.Light.fx를 보자 빛 연산은 공용적으로 여기에 저장하고 쓸것이헤더가드#ifndef _LIGHT_FX_#define _LIGHT_FX_를 해줬다.그리고 이전에 공용으로 사용하던 00.Global.fx도 인클루드 해준다. 00.Global.fx에는 기본 쉐이더에서 쓰는 자료형(VertexData, VertexOutpu..

[DirectX11] 2024.09.09

Light #4 - Emissive

Emissive는 오브젝트의 외곽선을 나타낼 때 사용하며 림라이트라고 불린다.이를 구하는 방법은 여러가지가 있는데 우선 15.EmissiveDemo,h,.cpp와 12.Lighting_Emissive.fx를 만들었다. 12.Lighting_Emessive.fx에서 우선 어떤 값들을 필요로 하는지 살펴보자.우선 Emessive의 빛이 방향, 빛의 색 다 필요 없고 카메라와 물체에 둘 만 적용된다. 빛에 직접적인 연관이 없고 물체의 재질에 따라 달라질수 잇기 때문에 float4 타입의 MaterialEmessive만 하나 남겨뒀다. 그리고 DiffuseMap(텍스쳐)도 크게 필요 없지만 그냥 VS는 패스하고 픽셀쉐이더를 살펴보자.// 12.Lighting_Emissive.fxfloat4 MaterialEmi..

[DirectX11] 2024.09.09

Light #3 - Specular

Specular는 Diffuse랑 비슷한데 차이가 있다. 이를 알아보자. 우선 Diffuse처럼 물체의 표면에 수직하는 Normal 벡터값과 조명에서 나온는 빛의 방향을 필요로 하는것은 동일하다.그러나 빛이 물체의 표면에 반사돼서 노멀벡터값을 기준으로 대칭되는 방향으로 나아가는 빛을 계산한다.즉, 반사되는 부분의 빛을 나타내기 위해 사용한다는 것이다.크리링의 머리에 빛이 반사되는 빨간 원 안의 부분의 효과를 위한 것이다.구하는 원리를 간단하게 살펴보면Diffuse는 노멀벡터와 빛 사이의 각도(→n, →L)가 핵심이었다면 Specular는 반사된 빛(주황색)과 눈(카메라) 사이(파랑색)의 각(연두색 θ)을 중심으로 보는 것이다. Diffuse와 비슷한 원리로 Specular도 카메라의 각과 빛이 반사된는 ..

[DirectX11] 2024.09.02

Light #2 - Diffuse

Diffuse는 분산광이라고 해서 일반적으로 우리가 생각하는 조명과 유사하다. 빛을 받는곳은 밝고 반대편은 어둡다.어떤 오브젝트에 대해 표면에 수직인 방향의 값은 노멀맵이 이미 저장되어 있을 것이다.분산광은 물체의 표면에서 분산되어 눈으로 들어오는 빛이라 각도에 따라 밝기가 달라진다는 특징이 있다. 즉, 노멀맵 데모에서 봤던것처럼 연산을 하면 되는데 이 연산식을 만든 사람이 람베르트라 람베르트 공식이라고한다.노멀값과 평행인 방향으로 빛이 들어올 때 가장 세고 수직이면 거의 영향을 못받는다. (뒤에서오는것은 마이너스 값이나 아직 계산하지 않을것이다.)( 노멀은 표면에 수직인 벡터이다.) 이 람베르트 공식은 코사인 공식을 이용했었다. 노멀벡터와 조명벡터를 내적해서 구하는데 둘 다 정규화된 값이라 두벡터 사이..

[DirectX11] 2024.08.30

Light #1 - Ambient

조명? 빛 4총사에 대해서 알아볼 것이다.  사물이 사람의 눈에 보이는 원리는 빛이 사물에 반사되어 보이는데, 빛이 사물에 닿았을때 일종의 필터처럼 어떤 색의 빛으로 반사하느냐에 따라 색이 다르게 보인다.다만 현실에서는 빛이 넓게 비춰지고 반사된 빛이 다른곳에 또 다중으로 반사되는데 이를 게임 엔진에서 똑같이 만드는것은 무리라 최소한의 연산의로 그럴듯하게 만드는게 목표이다.  게임은 영화나 애니메이션과 다르게 매 프레임마다 카메라의 위치가 바뀌고 조명의 위치가 바뀌는 실시간 렌더링이 필요하니 연산 규모를 축소시키는것이 목표인것이다. 요즘에는 물리기반렌더링(PBR) 기법등이 새로 나왔지만 환경적인 제약이 있어 특히 모바일에서는 사용하지 못한다. 그럼 기본이 되는 4가지 기법 Ambient, Diffuse,..

[DirectX11] 2024.08.27