2025/03 6

Vulkan Game Engine - 24. 평가 받을 준비..

장렬하게 전사했다..이젠 정말 시간이 없어서 애초에 오브젝트 1000개의 프레임 방어가 주 과제였던지라오브젝트 material별 인스턴싱을 안해도 프레임 드랍이 없어타협을 하고 평가준비를 하기로 했다. 너무너무너무 아쉬운데일단 실패 원인과 과정을 조금 적어보자면..우선 인스터싱을 고려하지 않고 설계한게 문제이다.지금 생각해보면 게임 엔진인데인스터싱을 처음부터 고려하지 않은 내 무지함이 만든 스노우볼이다.오브젝트가 수천개 떠다닐텐데 그거마다 descriptorset을 만든다는게 말이 안된다.초창기에는 vulkan 배우기도 바빠 최적화를 전혀 고려하지 않았다는게 이런식의 실패를 만들줄 몰랐다.  현재 우리엔진의 draw콜 구조는 블로그에 적은 적이 없어 잠깐 적어보자면draw콜이 불릴 때 가장 윗단이Mesh..

Vulkan Game Engine - 23. deferred renderpass의 descriptorset 줄이기 고민

shadowmap 그리는 descriptorset은 줄였다.이제 오브젝트가 몇개가 있든 상관없이 descriptorset은 16개다.-> 작업할 프레임 2 * (shadowmap 4 + shadowcubemap 4) 이제 진짜 그리는 main renderpass의 descriptorset을 줄여야하는데여기서 고민이 많다.아니 고민은 끝났고 사실 잘 구현하기만 남았다. descriptorset을 통합하려면shader에 입력되는 값의 공통부분을 uniform buffer로달라지는 부분을 storage buffer로 나누면 된다. 이제 그 공통부분을 어떻게 나눌지를 고민해봤는데아무리 생각해도 material별로 나눠야겠다는게 내 답이다. 우선 기존 geopass의 shader의 입력만을 살펴보면#version..

Vulkan Game Engine - 22. shadowmap에 storage buffer, push constants 적용

아오.. 처음부터 고려하면서 했어야했다.이제와서 고치니깐 고칠 것이 많아서 약간 애먹었다.사실 아직 다 못고쳤는데 이 정도까지는 픽스일 거같아 먼저 블로그에 올린다. 현재 문제는 RenderingComponent마다 descriptorset이 생겨 많은 오브젝트에 비례해서 descriptorset이 생기는 문제였다. 일단은 shadow를 그리기위한 descriptorset을 통합시켰다.어떻게 해결했고 어떤 고민을 했는지 써놔야겠다. 일단 결과물여기서 이렇게 개선됐다.역시 1000개가지고 프레임 드랍되면 말이 안되지 아직 다 완성 못했지만 바로 정상화된게 보여 뿌듯하다..ㅎ 우선 descirptorset을 줄이기 위한 방법은 많았고 거기서 선택을 했다.3가지를 고민했었는데 뭐가 더 좋은 방법인지는 모르겠다..

Vulkan Game Engine - 21. 엔진 문제와 해결 방안 고민 (최적화)

드디어 최적화까지 왔다!이 부분만 해결하면 사실상 과제에서 요구하는 기능들은 전부 구현한 것이고추가하고싶은 기능은 너무 많은데 내 욕심이고 기다리고 있는 동료들에게 예의가 아니라다른 프로젝트에서 하든 평가를 받고 추가하든 해야겠다.   우선 문제점은 씬에 오브젝트를 1000개 만들때 있다.오브젝트를 1000개 배치하고 프레임이 생각보다 너무 떨어져서 확인했을때우리엔진 파이프라인 구성상 큰 오버헤드가 발생할 구석이 없어서 cpu 병목인가 하고 살펴봤는데 cpu에서는 더더욱 병목이 일어날 일이 없었고gpu병목이면 draw호출을 없애보자하고씬을 그리지 않고 텍스쳐만 그리게 draw호출을 바꿔봤는데도 프레임드랍이 일어나서원인을 못찾아서 아.. 큰일났다 이건 정말 큰일이다.. 했는데다행히 동료의 컴퓨터로 debu..

Vulkan Game Engine - 20. point light PCF 그림자 수정

코드를 보니깐 바보같이 shader 작성한 부분이 있어 급히 수정하고이걸 좋다고 블로그에 올렸어서 어디가 잘못 되었고 어떤 부분을 수정했는지 블로그에 올린다. PCF를 적용하는 부분에서 shadow cubemap에서 주변 벡터를 샘플링하는 과정에서 생긴 문제인데기존 코드vec3 rotatedVectors[8];vec3 getRotationAxis(vec3 direction) { vec3 worldUp = vec3(0.0, 1.0, 0.0); if (abs(dot(direction, worldUp)) > 0.99) { return normalize(vec3(1.0, 0.0, 0.0)); } return normalize(cross(direction, worldUp)..