For me
[DirectX12] 17) 직교투영 본문
직교 투영은 언제 사용하나?
League of Legend의 관전모드의 시점이다.
좌, 우 , 하단 맵 등 UI부분들은 사용자에게 직교투영이 되어 움직이지않고 보이게 된다.
이러한 UI는 카메라가 회전한다고 회전하지 않고, 확대한다고 커지지 않는 것처럼, 사용자에게 항상 같은 모습으로 보여주게 된다.
UI
Camera와 UI Camera 2개의 카메라를 이용한다.
이후, UI는 Layer을 이용하여 구분한다. (Unity의 Water, UI, Player etc.. 와 같다)
layerIndex 를 추출하여, SetCullingMaskLayerOnOff 메소드를 불러들여, 원하는 layer을 끄거나 킬 수 있다.
SceneManager.cpp
Camera는 UI를 안찍고, UI Camera는 UI만 찍게 된다.
UI는 LayerNameToIndex를 이용하여 UI인 것을 명시한다.
더보기
#pragma region Camera
{
shared_ptr<GameObject> camera = make_shared<GameObject>();
camera->SetName(L"Main_Camera");
camera->AddComponent(make_shared<Transform>());
camera->AddComponent(make_shared<Camera>()); // Near=1, Far=1000, FOV=45도
camera->AddComponent(make_shared<TestCameraScript>());
camera->GetTransform()->SetLocalPosition(Vec3(0.f, 0.f, 0.f));
uint8 layerIndex = GET_SINGLE(SceneManager)->LayerNameToIndex(L"UI");
camera->GetCamera()->SetCullingMaskLayerOnOff(layerIndex, true); // UI는 안 찍음
scene->AddGameObject(camera);
}
#pragma endregion
#pragma region UI_Camera
{
shared_ptr<GameObject> camera = make_shared<GameObject>();
camera->SetName(L"Orthographic_Camera");
camera->AddComponent(make_shared<Transform>());
camera->AddComponent(make_shared<Camera>()); // Near=1, Far=1000, 800*600
camera->GetCamera()->SetFar(10000);
camera->GetTransform()->SetLocalPosition(Vec3(0.f, 0.f, 0.f));
camera->GetCamera()->SetProjectionType(PROJECTION_TYPE::ORTHOGRAPHIC);
uint8 layerIndex = GET_SINGLE(SceneManager)->LayerNameToIndex(L"UI");
camera->GetCamera()->SetCullingMaskAll(); // 다 끄고
camera->GetCamera()->SetCullingMaskLayerOnOff(layerIndex, false); // UI만 찍음
scene->AddGameObject(camera);
}
#pragma endregion
#pragma region UI_Test
for (int32 i = 0; i < 6; i++)
{
shared_ptr<GameObject> obj = make_shared<GameObject>();
obj->SetLayerIndex(GET_SINGLE(SceneManager)->LayerNameToIndex(L"UI")); // UI
obj->AddComponent(make_shared<Transform>());
obj->GetTransform()->SetLocalScale(Vec3(100.f, 100.f, 100.f));
obj->GetTransform()->SetLocalPosition(Vec3(-350.f + (i * 120), 250.f, 500.f));
shared_ptr<MeshRenderer> meshRenderer = make_shared<MeshRenderer>();
{
shared_ptr<Mesh> mesh = GET_SINGLE(Resources)->LoadRectangleMesh();
meshRenderer->SetMesh(mesh);
}
{
shared_ptr<Shader> shader = GET_SINGLE(Resources)->Get<Shader>(L"Texture");
shared_ptr<Texture> texture;
if (i < 3)
texture = GEngine->GetRTGroup(RENDER_TARGET_GROUP_TYPE::G_BUFFER)->GetRTTexture(i);
else if (i < 5)
texture = GEngine->GetRTGroup(RENDER_TARGET_GROUP_TYPE::LIGHTING)->GetRTTexture(i - 3);
else
texture = GEngine->GetRTGroup(RENDER_TARGET_GROUP_TYPE::SHADOW)->GetRTTexture(0);
shared_ptr<Material> material = make_shared<Material>();
material->SetShader(shader);
material->SetTexture(0, texture);
meshRenderer->SetMaterial(material);
}
obj->AddComponent(meshRenderer);
scene->AddGameObject(obj);
}
#pragma endregion
Camera.h
Layer을 키고 끌 수 있는 메소드
더보기
void SetCullingMaskLayerOnOff(uint8 layer, bool on)
{
if (on)
_cullingMask |= (1 << layer);
else
_cullingMask &= ~(1 << layer);
}
'DirectX12' 카테고리의 다른 글
[DirectX12] 19) Deferred , Forward Rendering (0) | 2023.01.19 |
---|---|
[DirectX12] 18) Render Target (1) | 2023.01.19 |
[DirectX12] 16) Quaternion (0) | 2023.01.19 |
[DirectX12] 15) SkyBox (0) | 2023.01.18 |
[DirectX12] 14) Normal Mapping (0) | 2023.01.18 |