-
스카이박스 구조 변경Programming/DirectX12 2022. 3. 15. 21:23
Graduation Project 문제점
Skybox::Skybox(const array<shared_ptr<Mesh>, 6>& meshes, const shared_ptr<Shader>& shader, const array<shared_ptr<Texture>, 6>& textures) : m_faces{ new GameObject[6] } { // 앞, 좌, 우, 뒤, 상, 하 for (int i = 0; i < 6; ++i) { m_faces[i].SetMesh(meshes[i]); m_faces[i].SetShader(shader); m_faces[i].SetTexture(textures[i]); } }
기존에는 클래스를 하나 만들어서 6개의 사각형과 6개의 텍스쳐를 갖고 6개의 사각형을 렌더링하는 방식이였다.
하지만 현재 프레임워크 구조상 class Texture 객체를 여러개 만드는 것은 비효율적이다.
더불어 부동소수점 문제인지 각 면 사이에 경계선이 보이는 경우가 있었다.
해결 방법
class Skybox : public GameObject { public: Skybox() = default; ~Skybox() = default; void Update(FLOAT deltaTime); void SetCamera(const shared_ptr<Camera>& camera) { m_camera = camera; } private: shared_ptr<Camera> m_camera; };
// 스카이박스 생성 m_skybox = make_unique<Skybox>(); m_skybox->SetMesh(m_meshes["SKYBOX"]); m_skybox->SetShader(m_shaders["SKYBOX"]); m_skybox->SetTexture(m_textures["SKYBOX"]); m_skybox->SetCamera(m_camera);
그래서 스카이박스에 사용할 큐브 메쉬를 하나와 그 큐브에 사용될 텍스쳐 하나가 되도록 변경했다.
이렇게 구조를 변경함으로서 별개의 클래스가 아닌 게임오브젝트를 상속받는 스카이박스 클래스로 바꿀 수 있었다.
코드 상으로도, 메모리 효율적인 면에서도 이게 더 낫다.
TRANSFORM_MATRIX: 1 0 0 0 0 0 1 -5 0 -1 0 0 0 0 0 1 VERTEX_COUNT: 36 P: 5 5 0 N: 0 0 1 T: 0.250783 0.9995 MI: -1 BI: 0 0 0 0 BW: 0 0 0 0 P: -5 5 0 N: 0 0 1 T: 0.500829 0.9995 MI: -1 BI: 0 0 0 0 BW: 0 0 0 0 P: -5 -5 0 N: 0 0 1 T: 0.500829 0.749213 MI: -1 BI: 0 0 0 0 BW: 0 0 0 0 ...
스카이박스에 사용하는 큐브 메쉬는 3DS MAX로 직접 만들었다.
그 후 내가 만든 FBXExporter로 내가 원하는 형태의 정점으로 추출한 뒤 사용했다.
이는 졸업작품에서 사용하는 모든 메쉬, 애니메이션이 동일하다.
스카이박스 이제 각 면의 경계선도 보이지않고 코드도 깔끔해졌다.
'Programming > DirectX12' 카테고리의 다른 글
케스케이드 그림자맵 (2) 2022.04.12 조명과 그림자 (1) 2022.04.10 서버-클라이언트 연결 (0) 2022.03.30 애니메이션하는 객체가 여러 개일 때 발생하던 문제 해결 (0) 2022.03.07 상하체 애니메이션 분리 (0) 2022.03.01