Vulkan 26

Vulkan Game Engine - 15. UI 이식

포스트 글 타이틀이 바뀌었다!!이전까지는 rendering만 다뤄서 vulkan이라고만 했는데앞으로 작업들은 rendering 뿐만아니라 engine 요소도 다룰 거 같아서 변경했다.그래도 넘버링은 0부터 시작하기 아쉬우니깐 이어가야지..ㅎ ui 작업과 드디어 합쳤다.물리엔진은 오늘 내일 합쳐질 예정이고이식을 내가 주도적으로 한게 아니라ui 작업자가 해줘서중간중간 이제 내가 손봐줘야할 부분이 남았다. 우선 결과꽤나 엔진스러워 졌다!! 이제 내가 손봐야할 부분인데우선 위에를 잘 보면 보이는데rendering 결과물이 swapchain에 제출되어모든 화면에 그려지고 ui가 그 위를 덮는 형식으로 그려진다. 이제 main renderpass에서 swapchain에 직접 넣을 이미지를 만드는게 아니라따로 이미지..

Vulkan - 14. 점광원에 대한 그림자 적용 (shadow cubemap)

점광원에 대한 그림자 적용했다. 렌더패스에서 만든 이미지를 다른 렌더패스로 받아 쓰는 것은directional light, spotlight 그림자 할 때 했기 때문에 어렵지 않았는데이번에 받아올 이미지는 cubemap이었기 때문에cubemap을 생성, 사용하기 위해서 어떤 작업을 했어야했나에 대해 써야겠다. 일단 cubemap을 생성하기위해shader에서 layer를 변경해줘가며 그려야하는데일단 나는 깊이맵을 직접가져와다른 랜더패스에서 읽을 수 있게 바꿔서 사용하는 방법을 사용했고그래서 vertex shader는 이렇고 fragment shader는 없다.#version 450#extension GL_ARB_shader_viewport_layer_array : enablelayout(location =..

Vulkan - 13. shadow map 생성, 다중 그림자 적용 (Spot light, Directional light)

어우 드디어 했다. 이번의 주 도전과제는 새로운 렌더패스를 만들어 거기서 만든 것을 가져오는 것이다! 하면서 큰 이슈 사항이 나왔던 것은 두가지 였는 데그 중 하나는 이미지 레이어를 잘 맞춰주지 않아 문제가 생긴 것이다. 이번에 만든 renderpass의 결과물은 depthmap image 였고 이미지 생성 당시 옵션은VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_USAGE_SAMPLED_BIT 이다.하나는 깊이 계산 때문이고 (shadowmap 렌더패스)하나는 이 이미지를 써서 빛 계산을 해야 하기 때문이다. (deferred shading 렌더패스) 처음엔만들 당시 옵션만 정해주면 자연스럽게 변환이 되는 줄 알았는데이것도 전부 명시 해줘야 Vulkan..

Vulkan - 12. 다중 광원 적용, 광원 타입 적용

deferred shading을 먼저해서 사실 다중 광원은 별 거 없었다. lighting pass fragment shader code#version 450layout(input_attachment_index = 0, binding = 0) uniform subpassInput positionAttachment;layout(input_attachment_index = 1, binding = 1) uniform subpassInput normalAttachment;layout(input_attachment_index = 2, binding = 2) uniform subpassInput albedoAttachment;layout(input_attachment_index = 3, binding = 3) un..

Vulkan - 11. gltf 형식의 모델 로드, normal map 수정

gltf를 받도록 아예 설계를 다시했다. 가장 큰 문제점이었던model이 sub mesh가 있으면 material을 각각의 mesh마다 적용시켜야 하는데내 엔진은 하나의 model이 하나의 material을 갖는 다는 점을 고치기 위해많은 것을 바꿔야 했다. 우선 그전의 내 object 구조는 이랬다. object - transform - material - model model - meshes model이 assimp로 model file을 로드해 받아놓는 형식이고이 모델을 object생성시에 가져와 object를 만드는 형식이었다.  여기서 object 생성시 material을 가져와 model 전체에 적용한다는 점이 문제였는데이걸 고치기위해 첫번째로 고안한 방법이mesh에서 material을 관리하..

Vulkan - 10. pbr 적용

pbr 적용했다. subpass간 attachment 늘리고 uniform buffer 추가만 하면 될 줄 알았는데 고생을 많이 했다. 직전 쓴 블로그의 흐름대로 적용했지만초기 설계와는 조금 다르게 된 부분에 대해 다루겠다. 1. attachment 개수 변경직전에는 geo pass가 light pass로 넘겨주는 attachment가 7개(position, normal, albedo, roughness, metallic, height, ao) 라고 했는데4개로 바뀜 (position, normal, albedo, pbr) pbr attachment로 roughness, metallic, ao를 통합했다. 각 1채널 밖에 없기 때문이다.  height map은 geo pass의 vertex shader에..

Vulkan - 9. pbr 적용 전략

대망의 pbr 적용이다. gui도 있고 카메라도 움직이니깐아주 든든해서 편하게 변수들만 바꿔야지 생각했는데막상 시작하려니깐 그 바꿔야할 양에 압도당했다... 추가해야할 요소가 많아서 미리 설계를 하고 들어가지 않으면 안된다! 일단 했던거 복습 Scene에 Object들이 있다. Object는 name(imgui layer 구분용도), model (mesh), texture, position, rotate, scale이 있다.  예시코드)m_objects.push_back(Object::createObject("box1", m_boxModel, m_sampleTexture, glm::vec3(-2.0f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(1..

Vulkan - 8. 키보드 마우스 입력 추가와 imgui 적용

키보드 마우스 입력 추가는 예전에 Opengl에서 하던거 가져와서 쉽게 적용했고 imgui 요녀석이 문제가 많았다.심지어 아직 잠정적인 문제가 많은 상태지만간이로 만들어 놓은거기 때문에 일단 쓰고 나중에 고치자 일단 결과물 부터!오브젝트 추가할 때마다 imgui에서도 작업해줄 필요없이 오브젝트 벡터를 순회하면서 자동으로 추가되게끔 만들었다.지금은 렌더링할 때 light object를 제일 앞에 추가해서 구형 형태로 light 위치가 보이게 만들었는데 (심지어 텍스쳐 그냥 sample텍스쳐 가져다 썼다.)이러니깐 shader에서 보는 것은 scene의 light위치고 light object 위치와는 값만 같지 다른 녀석이라imgui에서 값을 변경할 때  얘만 특별취급을 해야한다. (scene의 위치와 li..

Vulkan - 7. deferred shading + phong shading 삽질 기록들

이번 단계의 가장 중요한 것은 subpass간 attachment가 3개로 늘어난다는 점이었다. 앞에서는 좀 .. 아주 획획 넘어가며 당연한 듯이 적어놓았지만삽질한 게 좀 많다. 0. 아예 렌더링 자체가 안됐다.이게 msaa를 없앤 이유가 됐는데 초창기 설계에서 framebuffer는 color, depth, position, normal, albedo, swapchain 이었다.제일 첫번째오는 color가 msaa용 attachment인데처음에는 pColorAttachment를 color하나로 놓고 resolve를 position normal albedo 3개로 놨었다.이러니깐 colorattachment 랑 resolve가 1대 1 매칭이 아니여서 당연히 렌더링이 안됐었고 그래서 고친게 그냥 colo..

Vulkan - 6. deferred shading + phong shading 구현 (code)

1. 지금 잘되고있는 렌더링에 서브패스만 추가해서 감마값만 바꿔보기 - 서브패스 추가하기2. 이 서브패스에 유니폼 버퍼를 추가해보기3. 택스쳐도 넣어보기    4. 지연 렌더링 기본 구현하기 - 퐁모델로 간단하게5. pbr적용6. 렌더패스 추가하여 쉐도우맵 생성해보기 - 일단 방향성 광원으로7. 이걸 받아서 그림자 만들어 보기8. 렌더 패스 동적 생성 - 빛의 개수만큼9. 다중 광원 적용 - 방향성 광원만10. 큐브맵 활용해서 점광원 + 스포트라이트까지 추가 여기서 4단계!를 드디어 구현했다. 이미 서브패스 두개 연결되어있는 상태라 쉬울 것이라 예상했지만생각보단 만만하진 않았다. 생각해보니깐 블로그에 코드를 진짜 안쓴 거 같아서사람들이 블로그에 vulkan 찾아왔다가 내 하소연만 보고 가는 거 같아코드 ..