shadowmap 그리는 descriptorset은 줄였다.
이제 오브젝트가 몇개가 있든 상관없이 descriptorset은 16개다.
-> 작업할 프레임 2 * (shadowmap 4 + shadowcubemap 4)
이제 진짜 그리는 main renderpass의 descriptorset을 줄여야하는데
여기서 고민이 많다.
아니 고민은 끝났고 사실 잘 구현하기만 남았다.
descriptorset을 통합하려면
shader에 입력되는 값의 공통부분을 uniform buffer로
달라지는 부분을 storage buffer로 나누면 된다.
이제 그 공통부분을 어떻게 나눌지를 고민해봤는데
아무리 생각해도 material별로 나눠야겠다는게 내 답이다.
우선 기존 geopass의 shader의 입력만을 살펴보면
#version 450
#include "../AL/include/Renderer/Animation/Bones.h"
layout(binding = 0) uniform GeometryPassVertexUniformBufferObject {
mat4 model;
mat4 view;
mat4 proj;
mat4 finalJointsMatrices[MAX_BONES];
bool heightFlag;
float heightScale;
} ubo;
layout(binding = 1) uniform sampler2D heightMap;
layout(location = 0) in vec3 inPosition;
layout(location = 1) in vec3 inNormal;
layout(location = 2) in vec2 inTexCoord;
layout(location = 3) in vec3 inTangent;
layout(location = 4) in ivec4 inBoneIds;
layout(location = 5) in vec4 inWeights;
layout(location = 0) out vec3 fragPosition;
layout(location = 1) out vec3 fragNormal;
layout(location = 2) out vec2 fragTexCoord;
layout(location = 3) out mat3 fragTBN;
#version 450
// 통합 Uniform 구조체
layout(binding = 2) uniform GeometryPassFragmentUniformBufferObject {
vec4 albedoValue; // vec4는 16바이트 정렬이므로 먼저 배치
float roughnessValue;
float metallicValue;
float aoValue;
bool albedoFlag;
bool normalFlag;
bool roughnessFlag;
bool metallicFlag;
bool aoFlag;
} ubo;
// Textures
layout(binding = 3) uniform sampler2D normalTex;
layout(binding = 4) uniform sampler2D roughnessTex;
layout(binding = 5) uniform sampler2D metallicTex;
layout(binding = 6) uniform sampler2D aoTex;
layout(binding = 7) uniform sampler2D albedoTex;
// Inputs from Vertex Shader
layout(location = 0) in vec3 fragPosition;
layout(location = 1) in vec3 fragNormal;
layout(location = 2) in vec2 fragTexCoord;
layout(location = 3) in mat3 fragTBN;
// Outputs to Light Pass
layout(location = 0) out vec4 outPosition;
layout(location = 1) out vec4 outNormal;
layout(location = 2) out vec4 outAlbedo;
layout(location = 3) out vec4 outPBR;
uniform buffer와 이미지들이 있는데
처음에 model을 주체로 생각하니깐 계속 꼬여서 곰곰히 생각해보니깐
이놈은 본체가 material이다. 들어가는 이미지가 전부 material이고 uniform도 대부분 material을 결정짓는 입력이었다.
구분을 material로 지으면
공통되는 부분이 proj, view를 포함한 입력 전부이고
달라지는 부분이 model, animation의 jointMatrix 밖에 없다.
이걸 내가 object별로 model로 먼저 구별하고 들어가려고 하니깐 헤매지..
이런 이유가 있었는데
내가 material을 만들어놓긴 했는데 얘는 소속이 model이다.
model이 만들어질 때 material이 결정되고 material을 찾으려면 model을 거쳐야한다..
애초에 model이 submesh들과 material들을 가지고 있고
이걸 1대 1 매칭을 시켜줘야 제대로된 텍스쳐가 적용된 gltf모델이 나와서
gltf을 받아올 때 그래서 바로 그 녀석의 material을 만들어주는데
이때 관리하기 용이하게 하려고 그렇게 했었다...ㅠㅠ
엔진에서 gltf model을 material로 드래그하면 그 오브젝트에 드래그한 model의 material을 적용시키는 것도
이거 때문에 편하게 가능했는데 그때는 편했지.. 처음부터 model과 material을 따로 생각하고 만들어 놨어야 됐다.
지금은 너무 멀리와서 이걸 그대로 활용하기로 했다.
쨋든 material 별로 생각하자!
인스터싱은 shadowmap하면서 연습했으니깐
material별로 descriptorset을 생성하고
mesh별로 정렬해서 ssbo에 적재한 뒤에
mesh별로 draw호출하면된다.
material별로 descriptorset 바인드 -> material로 구분한 것들 mesh별로 정렬해서 ssbo에 넣기
-> mesh정렬된걸 잘 인스터싱해서 draw호출
대신 material접근하려면 model에 들어가서 찾아줘야한다.
잘 기억하고
잘 생각해서 한번 해보겠다!
'Computer Graphics > Vulkan' 카테고리의 다른 글
Vulkan Game Engine - 25. 후기 (0) | 2025.03.26 |
---|---|
Vulkan Game Engine - 24. 평가 받을 준비.. (0) | 2025.03.20 |
Vulkan Game Engine - 22. shadowmap에 storage buffer, push constants 적용 (0) | 2025.03.17 |
Vulkan Game Engine - 21. 엔진 문제와 해결 방안 고민 (최적화) (0) | 2025.03.12 |
Vulkan Game Engine - 20. point light PCF 그림자 수정 (0) | 2025.03.10 |