프로그래밍 공부

프로그래밍 700

카테고리 설명
  • Instancing 인스턴싱은, 최적화 기법중 하나로 동일 객체나 요소를 여러번 그리는 작업을 최적화 하기 위한 기술이다. 동일한 메시를 그릴 때 여러번 DrawCall 을 할 필요 없이 한번만 DrawCall 을 한 뒤, 같은 모델을 여러번 배치하는 형태로 이루어진다. 한번 생성된 데이터는 다시 날릴 필요 없이. 그 횟수동안 받아온 위치정보만 대입하여 그려주면 되기 때문에 여러번 데이터버퍼를 받아올 필요가 없기 때문이다. 이는 DrawCall 이 데이터를 Device에서 DeviceContext에서 넘기는 과정에서 생기는 Bus Latency나 Moemory Latency가 쌓이면 엄청난 시간적 손해가 발생하기 때문이다. 그래서 DrawCall 은 리소스를 많이 쓰는 작업이고 이러한 DrawCall을 ..

  • 캡슐형 오브젝트와 구, 캡슐, 사각형, 레이 오브젝트 끼리 충돌과정을 구현해보자. CapsuleCollider는 구체형 Collider에서 선분 Vector를 추가하여 충돌확인을 한다. CapsuleCollider는 위와같이 생겼다. 선분의 양 끝단에 구체가 생겨있고. 모든 선분이 중심점으로 이루어진. 무한히 많은 구가 선분에 끼어져 있다고 생각하면 된다. 대충 위와같이. 무한히 많은 구체가 선분을 따라 생겨있다고 이해하면된다. 그래서, 대부분의 충돌은 구체와 다른 오브젝트와의 충돌이라고 이해하면 된다. 이제 Collider의 정의에 대해 알아보자. CapsuleCollider class CapsuleCollider : public Collider { public: CapsuleCollider(float..

  • DirectX에서 FBXModel을 Import하고 Save할 때 원래 생각해놓고 구현해놓았던 방식대로 정상적으로 Import가 되지 않으면 매우 곤란하다. 이번에는 만약, Import 하였을 시, Mesh와 Matarial의 개수가 일치하지 않을 때, 각 Mesh에 Matarial을 밀어넣어줄 수 있는 코드를 작성한다. 우선 데이터 구조상, Model에서 Matarial과 Mesh값, Name값을 알아야 한다. 이전에 작성하였던 ModelExporter에서 동작하는 동작사항을 일부 수정해서 가져와 사용해야 한다는 의미이다. 또한, Model이 가지고있던 데이터에 접근하여 수정해야 하고, MeshData값을 ModelMesh가 가지고 있어야 한다. (프레임워크 상 MeshData는 ModelMesh가 아..

  • 3인칭 카메라를 구현해보자. Obejct의 Front와 Back, 그리고 Cam의 Rotationvalue와 Movevalue값을 알고 있어야 한다. 간단한 코드 예시를 살펴보자. float distance = 20.0f; float height = 20.0f; float moveDamping = 5.0f; // 따라가는 속도 float rotDamping = 0.0f; // 회전에서 따라가는 속도 float rotY = 0;// 쿼터뷰로 하였을 때, 45도각도를 바라보고 싶을 수도있기 때문, float destRot = 0.0f; Vector3 destPos; Vector3 focusOffset;// 카메라의 타겟 오프셋 // 특정 타겟을 바라보는데 X축 앵글로만 안바라보게 하고싶을 수 있다. // 모..

  • 함수포인터를 사용해서 애니메이션의 자동 프레임전환을 구현해보자. 언리얼에서 사용하는 애니메이션의 자동 전환은. 일정 시간 뒤에 애니메이션이 자동으로 전환되는 형식으로 구성되어있는데, https://docs.unrealengine.com/4.27/ko/AnimatingObjects/SkeletalMeshAnimation/Sequences/ 애니메이션 시퀀스 Animation Sequence, 애니메이션 시퀀스 애셋은 한 애니메이션을 이루는 모든 트랜스폼 데이터가 들어있는 개별 애셋입니다. docs.unrealengine.com 이러한 애니메이션간 선형전환방식을 사용할것 이다. class ModelClip { private: friend class ModelAnimator; ModelClip() = defa..

  • 저번에 만들었던 선형보간의 개량이다. 선형보간 시, Buffer에 데이터를 넘긴 후, 처리하는 방법이 있고, 데이터를 Device에서 처리 후 Buffer에 넘기는 방법이 있는데, 전에 만들었던 방법은, 데이터를 넘기기 전 Device에서 처리 후, Buffer에 넘기는것 이었는데, 이번에 한 방법은 Buffer에 데이터를 다 때려박은 후 DeviceContext에서 데이터를 처리하는 방법이다. Buffer를 수정한다. // Frame 구조체: 애니메이션 재생에 사용되는 프레임 정보를 저장하는 구조체 struct Frame { int clip = 0; // 현재 재생 중인 클립의 인덱스 int curFrame = 0; // 현재 프레임 인덱스 float time = 0.0f; // 현재 프레임에서의 경과..