Client/Game 필터에 RenderDemo 클래스를 추가Shader만 다음과 같이 변경:_shader = make_shared<Shader>(L"23. RenderDemo.fx");
#include "RenderDemo.h"
desc.app = make_shared<RenderDemo>();
technique11 T0
{
PASS_VP(P0, VS_Mesh, PS)
PASS_VP(P1, VS_Model, PS)
PASS_VP(P2, VS_Animation, PS)
}
각 VS는 따로 정리되어 있으며, 공통 부분은 00. Render.fx로 분리해 관리한다.
#ifndef _RENDER_FX_
#define _RENDER_FX_
#include "00. Global.fx"
#define MAX_MODEL_TRANSFORMS 250
#define MAX_MODEL_KEYFRAMES 500
#define MAX_MODEL_INSTANCE 500
// [1] Mesh 렌더링용 구조체 + VS
...
// [2] Model 렌더링용 구조체 + VS (BoneTransform)
...
// [3] Animation 렌더링용 구조체 + VS (TweenBuffer, TransformMap)
...
#endif
이 파일에는 MeshOutput, VertexMesh, VertexModel, GetAnimationMatrix() 함수, 그리고 각각의 VS가 통합되어 있다.
이제 Shader마다 반복해서 작성할 필요 없이, #include "00. Render.fx" 한 줄이면 끝!
auto obj = make_shared<GameObject>();
obj->AddComponent(make_shared<ModelAnimator>(_shader));
obj->GetModelAnimator()->SetPass(2); // Pass 2: Animation
obj->AddComponent(make_shared<ModelRenderer>(_shader));
obj->GetModelRenderer()->SetPass(1); // Pass 1: Model
obj->AddComponent(make_shared<MeshRenderer>());
obj->GetMeshRenderer()->SetPass(0); // Pass 0: Mesh
_objs 벡터에 담기고, 이후 INSTANCING->Render(_objs)를 통해 일괄 렌더링된다.| Pass 번호 | 타입 | VS 함수명 | 설명 |
|---|---|---|---|
| 0 | Mesh | VS_Mesh | 단순 월드 변환만 |
| 1 | Model | VS_Model | BoneIndex로 BoneTransform 사용 |
| 2 | Anim | VS_Animation | 애니메이션 행렬 계산 + 트윈 |
즉, 렌더러에서 SetPass(x)만 적절히 해주면 Shader 내부에서 자동 분기되어 렌더링된다.
// RenderDemo.cpp
obj->Get[RendererType]()->SetPass(0 or 1 or 2);
_objs.push_back(obj);
// InstancingManager.cpp
Render(_objs); // 내부에서 타입별로 자동 분리 처리
technique11 T0
{
PASS_VP(P0, VS_Mesh, PS)
PASS_VP(P1, VS_Model, PS)
PASS_VP(P2, VS_Animation, PS)
}