🎨DirectX 34

[DX] Animator 작업 : Animation 실행, TweenFrame

🚶🏻Animation 실행 이전에는 애니메이션의 한 프레임, 한 프레임을 출력했다면 이젠 존재하는 프레임을 자동으로 전부 출력하여 애니메이션을 실행시키도록 구현하였다. 애니메이션의 시간 비율을 만들어서 비율이 1을 넘어가는 순간 다음 Frame을 출력하도록 만들었다. 그러나 이렇게 현재 프레임만을 출력하면 언뜻볼 때 괜찮아보이지만, 속도를 0.1로 늦춰 재생하면 한가지 문제점이 발생한다. 직접 확인을 위해 현재 프레임인 CurrFrame의 애니메이션을 출력한 결과는 아래와 같다. 느리게 재생되는 애니메이션을 보면, 현재 프레임 프레임이 뚝뚝 끊겨서 출력되는 것을 볼 수 있었다. 그러나, 애니메이션은 동작 사이사이가 부드럽게 연결되어야 퀄리티 좋은 게임을 만들어낼 수 있다. 🏃🏻Lerp Animation ..

🎨DirectX 2023.07.13

[DX] Animator 작업 : Animation Frame 출력 (SRV, Shader)

🚩 SRV 생성하기 이전에 작성해왔던 Create Texture 함수에 SRV를 생성하는 코드를 추가해주었다. 만들어놨던 Texture2D를 이용해 ResourceView를 생성하고, Model Mesh의 TransformSRV로 지정해주었다. Model Mesh에는 이러한 애니메이션 TransformSRV를 저장하기 위한 변수를 각각 선언해주었고, Shader에 생성해둔 Texture2DArray인 TransformsMap에 연결해준 뒤 Render해주었다. 📄 45_Animation.fx #include "00_Global.fx" float3 Direction = float3(-1, -1, +1); struct VertexModel { float4 Position : Position; float2 U..

🎨DirectX 2023.07.12

[DX] Animator 작업 : Create Texture (Texture2D)

Texture의 Format은 일반적으로 R,G,B,A (각각 1비트, 총 4바이트 = R8G8B8A8)를 사용한다. DX11부터는 R32G32B32A21 - Float 자료형을 사용할 수 있다. 각각 RGBA 값이 4바이트를 가져 총 16바이트로 구성된다. UNORM이 붙으면 0~1까지 값을 사용하고, NORM 이 붙으면 -1~1 까지의 값을 사용한다. 그러나 해당 자료형을 사용하면 만들고자했던 Texture에 문제가 생긴다. 만들고자했던 Texture의 행에는 keyframe에 해당하는 Bone의 행렬을 적고, 열에는 Bone의 정보를 써서 행과 열에 들어가는 값이 Bone이 된다. 이때 Bone 행렬 하나는 64바이트인데, Texture의 픽셀 하나가 쓸 수 있는 값은 16바이트라서 문제가 생긴다...

🎨DirectX 2023.06.27

[DX] Animator 작업 : Create Clip Transform (bones 연산)

Model에서 Bone 정보를 넘기기 위해선 Cbuffer를 사용했지만, Animation에서는 Cbuffer를 사용할 수 없다. Tranfrom이 250개이고, Frame이 500개라고 한다면 125,000개의 데이터가 필요한데, CBuffer에서 넘겨줄 수 있는 최댓값은 4996개이다. 따라서 Animation을 CBuffer로 넘기는 것은 불가능하기 때문에 Texture로 만들어서 보내야 한다. Texture는 GB급 Texture가 아닌 이상, 데이터가 얼마나 커지든 상관없다. Texture의 행에는 Keyframe 정보를 넣고, 열에는 Bone 정보를 넣는다. 면에는 Clip 정보를 넣어둔다. ModelAnimator에서 bone 정보를 저장하는 과정을 이해하기 위해선 Converter 클래스 ..

🎨DirectX 2023.06.27

[DX] Animation Read Clip

🎬 Animation의 Clip, Frame 정보 읽어오기 애니메이션에는 ModelBone과 ModelMesh가 존재한다. ModelMesh는 ModelBone을 참조하여 ModelBone의 위치를 가져와 애니메이션을 출력한다. 이때의 ModelBone은 애니메이션이 진행되는 시간에 따라 계속 변화하는데, 이러한 움직이는 정보를 Animation Clip에 저장한다. Animation Clip은 Bone별로 SRP 정보가 Matrix형태로 저장된다. 이때 ModelBone과 Animation Clip의 Bone정보를 일치시켜서, 해당 프레임에 따라 매칭되는 ModelBone을 움직여 애니메이션대로 출력해 주는 것이다. 이렇게 Keyframe단위로 저장되어있는 애니메이션을 Keyframe Animation..

🎨DirectX 2023.05.25

[DX] Animation Skin 데이터 : Skinning 기법

🦿 Skinning 애니메이션에서는 Skinning 이라는 기법을 사용한다. Skinning은 단어 그대로 피부를 메꿔주는 기능을 말한다. 허벅지와 종아리가 일자로 있을때는 아무런 문제가 없지만, 캐릭터가 걸을 때 허벅지와 무릎의 관절이 회전되면서 비어있는 Mesh 공간이 생기고, 허벅지와 무릎이 연결된 정점이 비어있게 된다. 이러한 빈 공간을 메꾸기 위한 기법을 Skinning 기법이라고 한다. 본의 각 정점은 위치(Position)와 본의 번호 BlendIndices(x,y,z,w)와, 본의 가중치 BlendWeights(x,y,z,w) 값을 갖는다. 어떤 모델인지, 어떤 종류인지에 따라 x,y,z,w 4개의 데이터로 이루어질수도 있지만 8개의 데이터로 이루어질수도 있다. (인간형 Bone의 정점이 ..

🎨DirectX 2023.05.11

[DX] 3D Model 회전하기 (UpdateTransform, UpdateBones, sinf)

3D Model의 Transform을 업데이트하면서 회전시키도록 구현해보았다. 💡 3D Model 회전 ModelDemo 클래스의 Update 함수에서 탱크 객체의 포탑부분이 빙글빙글 돌아가도록 회전시켜보았다. 탱크의 포탑 부분의 Bone 인덱스는 10 이므로 인덱스를 통한 Bone을 불러오고, Transform의 회전값(rotation)을 sinf 함수로 변화시켰다. Delta 값과 PI 값을 가져와서 회전속도(100)에 맞춰 Rotation의 Yaw값을 변화시켜주었다. 💡 Update Transform ModelRender 클래스의 UpdateTransform 함수에서는 Update 시킬 Bone과 변환된 Transform 정보(Matrix)를 매개변수로 받아온다. Bone이 존재한다면 UpdateB..

🎨DirectX 2023.05.08

[DX] Model Material Render (DiffuseMap)

이전 학습을 통해 Material 파일을 Export하여 "_Textures" 경로에 .material 파일을 저장해두었다. 이번에는 해당 .material 파일을 읽어들여 Model의 Mesh에 입히는 작업을 수행하였다. ModelRender 객체를 생성하며 .material이 저장되어있는 경로를 ReadMaterial 함수에 전달해준다. ReadMaterial 함수에서는 xml 코드로 저장해두었던 .material 파일을 읽어들이기 위해 똑같이 TINYXML 라이브러리를 사용하였다. xml 코드의 root를 먼저 읽어들인 후, root 노드의 자식들에 접근하며 material 정보를 수집하였다. 차례로 Texture 정보와 Color의 정보를 읽어와 material 객체에 저장하였다. 읽어들인 mat..

🎨DirectX 2023.05.08

[DX] Model Material Export (.material, TINYXML)

하얀색으로만 그렸던 Model의 렌더링에 색상이나 무늬를 입히기 위해 Model Material을 입히는 작업을 학습하였다. 이전에 Mesh를 가져올때 Material Name을 가져왔던 방식과 비슷하게, Scene에 존재하는 Material을 전부 파일로 저장한 뒤, 저장해놓은 Material 배열을 읽어들여서 이름을 비교한 후 렌더링하는 방식으로 구현하였다. 👀 Material 구조체 Material의 정보를 저장하기 위한 구조체로, Material의 색상값들과 각 Material File의 경로를 저장하기 위한 변수를 담아두었다. 📦 Material Export (.material) Material을 읽기에 앞서 먼저 fbx 파일을 읽어 .material 파일로 Export 해보았다. ExportM..

🎨DirectX 2023.05.03

[DX] 3D Model Render -2(Shader)

🪄 3D Model Render Shader Model이 그려지는 위치인 Transform이 SRT로 존재하고, Model의 Mesh마다 BoneIndex가 존재할 때, BoneIndex를 참조해서 Bone에 있는 Transform을 그리게 된다. Model이 움직이거나 크기가 변화할 때 바뀌는 값이 바로 Model의 Transform SRT 인 것이다. 따라서 3D Model을 출력한 후, SRT 변화에도 정상적인 Mesh를 출력하기 위해 아래와 같은 연산을 거쳐야 한다. 먼저, Bone이 기준이므로 먼저 움직이므로 자신이 가지고있는 BoneTransforms의 BoneIndex 요소를 가져와서, mul (BoneTransforms[BoneIndex]) World에 곱하고 mul (BoneTransfo..

🎨DirectX 2023.05.02
728x90