Computer Graphics/Vulkan

Vulkan - 1. 전반적인 전략

surkim 2024. 12. 12. 12:00

튜토리얼 코드가 공부하면서 쓴 주석까지 포함하여 한파일이고 이게 2000줄이 넘는다.

지금은 심지어 모델하나를 렌더링하는 하드코딩 되어있는 상태고 한 클래스에 몰아서 작성되어있기 때문에 잘 분할해서 일반화 시켜야지 내가 나중에 모델이나 셰이더를 추가할 때 막힘없이 진행할 수 있겠다.

 

머리를 계속 굴린 결과 기본적인 뼈대는 세웠고 여기서 조금씩 추가/변경 해보려고 한다.

우선 뼈대는 이렇다

main

  • app
    • window
    • renderer
    • physics (내가 할 거 아님)
    • scene

기본적인 뼈대는 이렇게 짰고

app에 mainloop가 돌고

scene에는 model과 mesh, camera, light가 있다. (일단 여기까지, 나중에 더 추가될 게 있을 수도 있다.)

window는 이벤트를 받아 scene에 있는 오브젝트들을 (우선 camera만) 움직이고

physics(가칭)에서 오브젝트들의 위치를 결정하면

renderer에서 scene을 받아 렌더링을 할 예정

나는 renderer만 관리해주면 될 것이고

물리엔진하는 동료들은 physics작성과 내가 잘 만들어서 준 scene에 오브젝트 추가하고 싶음 하면된다.

 

우선 내가 짜지만 동료들이 만져야할 코드들을 이쁘장하게 짜고

renderer은 나만 수정가능하기 때문에 후순위로 미루자

 

우선은 scene부터 짜자

 

texture만 적용되는 심플 셰이더가 있다고 가정하고 만든 모든 오브젝트는 이 셰이더로 렌더링한다고 생각하고 짠다음에 나중에 셰이더를 추가하든 다른 셰이더 효과를 추가하든 하겠다.

 

scene으로 분할하는 것이 우선적인데 기본적인 전략은 이렇다.

scene이 있고 그안에 model을 선언할 수 있도록 한다. model을 벡터형식으로 이을 수 있고 (한 셰이더로 렌더링하니 가능)

model 안에 정보는 mesh와 texture, pos, rotate, scale, texture적용 가능 여부와 color가 있을 거 같다.

mesh와 texture는 class고 미리 정의해서 model 만들때 넣는 걸로 하자

예를 들어

initScene ()

{

    mesh1 = Mesh::createMesh(...); <- 구나

    mesh2 = Mesh::createMesh(...); <- 박스

    texture1 = Texture::createTexture(...);

    model1 = Model::createModel(mesh1, texture1, ...);

    // assimp를 사용해 obj를 로드할 경우

    model2 = Model::createModel(objPath, texture1, ...);

 

    std::vector<Model> 로 전부 push_back해준다. 그럼 내가 나중에 이 벡터를 순회하며 렌더링 하는 전략

}

Model 안에 위치정보까지 있는게 짜치긴하지만 우선 이렇게 짜고 나중에 더 좋은 방법을 생각해보자

 

그럼 내가 지금 짜야할거는 texture, mesh, model, scene을 짜고 window클래스 짜고, renderer는 그냥 2000줄 통으로 써서 scene을 만졌을 때 rendering 잘되는지 확인하는 거까지

 

화이팅..