diff --git a/engine/shader/glsl/mesh.vert b/engine/shader/glsl/mesh.vert index 42c4556bf..32f59dd9f 100644 --- a/engine/shader/glsl/mesh.vert +++ b/engine/shader/glsl/mesh.vert @@ -3,6 +3,7 @@ #extension GL_GOOGLE_include_directive : enable #include "constants.h" +#include "structures.h" struct DirectionalLight { @@ -38,21 +39,13 @@ layout(set = 0, binding = 0) readonly buffer _unused_name_perframe layout(set = 0, binding = 1) readonly buffer _unused_name_per_drawcall { - mat4 model_matrices[m_mesh_per_drawcall_max_instance_count]; - float enable_vertex_blendings[m_mesh_per_drawcall_max_instance_count]; + VulkanMeshInstance mesh_instances[m_mesh_per_drawcall_max_instance_count]; }; layout(set = 0, binding = 2) readonly buffer _unused_name_per_drawcall_vertex_blending { - mat4 joint_matrices[m_mesh_vertex_blending_max_joint_count * m_mesh_per_drawcall_max_instance_count]; + highp mat4 joint_matrices[m_mesh_vertex_blending_max_joint_count * m_mesh_per_drawcall_max_instance_count]; }; - -struct VulkanMeshVertexJointBinding -{ - highp ivec4 indices; - highp vec4 weights; -}; - layout(set = 1, binding = 0) readonly buffer _unused_name_per_mesh_joint_binding { VulkanMeshVertexJointBinding indices_and_weights[]; @@ -70,8 +63,8 @@ layout(location = 3) out vec2 out_texcoord; void main() { - highp mat4 model_matrix = model_matrices[gl_InstanceIndex]; - highp float enable_vertex_blending = enable_vertex_blendings[gl_InstanceIndex]; + highp mat4 model_matrix = mesh_instances[gl_InstanceIndex].model_matrix; + highp float enable_vertex_blending = mesh_instances[gl_InstanceIndex].enable_vertex_blending; highp vec3 model_position; highp vec3 model_normal; diff --git a/engine/shader/glsl/mesh_directional_light_shadow.vert b/engine/shader/glsl/mesh_directional_light_shadow.vert index e10268921..c5e4a8da8 100644 --- a/engine/shader/glsl/mesh_directional_light_shadow.vert +++ b/engine/shader/glsl/mesh_directional_light_shadow.vert @@ -3,6 +3,7 @@ #extension GL_GOOGLE_include_directive : enable #include "constants.h" +#include "structures.h" layout(set = 0, binding = 0) readonly buffer _unused_name_global_set_per_frame_binding_buffer { @@ -11,8 +12,7 @@ layout(set = 0, binding = 0) readonly buffer _unused_name_global_set_per_frame_b layout(set = 0, binding = 1) readonly buffer _unused_name_per_drawcall { - mat4 model_matrices[m_mesh_per_drawcall_max_instance_count]; - float enable_vertex_blendings[m_mesh_per_drawcall_max_instance_count]; + VulkanMeshInstance mesh_instances[m_mesh_per_drawcall_max_instance_count]; }; layout(set = 0, binding = 2) readonly buffer _unused_name_per_drawcall_vertex_blending @@ -20,12 +20,6 @@ layout(set = 0, binding = 2) readonly buffer _unused_name_per_drawcall_vertex_bl mat4 joint_matrices[m_mesh_vertex_blending_max_joint_count * m_mesh_per_drawcall_max_instance_count]; }; -struct VulkanMeshVertexJointBinding -{ - highp ivec4 indices; - highp vec4 weights; -}; - layout(set = 1, binding = 0) readonly buffer _unused_name_per_mesh_joint_binding { VulkanMeshVertexJointBinding indices_and_weights[]; @@ -35,8 +29,8 @@ layout(location = 0) in highp vec3 in_position; void main() { - highp mat4 model_matrix = model_matrices[gl_InstanceIndex]; - highp float enable_vertex_blending = enable_vertex_blendings[gl_InstanceIndex]; + highp mat4 model_matrix = mesh_instances[gl_InstanceIndex].model_matrix; + highp float enable_vertex_blending = mesh_instances[gl_InstanceIndex].enable_vertex_blending; highp vec3 model_position; if (enable_vertex_blending > 0.0) diff --git a/engine/shader/glsl/mesh_inefficient_pick.vert b/engine/shader/glsl/mesh_inefficient_pick.vert index cf62c494f..871d56100 100644 --- a/engine/shader/glsl/mesh_inefficient_pick.vert +++ b/engine/shader/glsl/mesh_inefficient_pick.vert @@ -3,6 +3,7 @@ #extension GL_GOOGLE_include_directive : enable #include "constants.h" +#include "structures.h" layout(set = 0, binding = 0) readonly buffer _unused_name_perframe { @@ -23,12 +24,6 @@ layout(set = 0, binding = 2) readonly buffer _unused_name_per_drawcall_vertex_bl mat4 joint_matrices[m_mesh_vertex_blending_max_joint_count * m_mesh_per_drawcall_max_instance_count]; }; -struct VulkanMeshVertexJointBinding -{ - highp ivec4 indices; - highp vec4 weights; -}; - layout(set = 1, binding = 0) readonly buffer _unused_name_per_mesh_joint_binding { VulkanMeshVertexJointBinding indices_and_weights[]; diff --git a/engine/shader/glsl/mesh_point_light_shadow.vert b/engine/shader/glsl/mesh_point_light_shadow.vert index 681a27623..ba40b96bc 100644 --- a/engine/shader/glsl/mesh_point_light_shadow.vert +++ b/engine/shader/glsl/mesh_point_light_shadow.vert @@ -3,11 +3,11 @@ #extension GL_GOOGLE_include_directive : enable #include "constants.h" +#include "structures.h" layout(set = 0, binding = 1) readonly buffer _unused_name_per_drawcall { - mat4 model_matrices[m_mesh_per_drawcall_max_instance_count]; - float enable_vertex_blendings[m_mesh_per_drawcall_max_instance_count]; + VulkanMeshInstance mesh_instances[m_mesh_per_drawcall_max_instance_count]; }; layout(set = 0, binding = 2) readonly buffer _unused_name_per_drawcall_vertex_blending @@ -15,12 +15,6 @@ layout(set = 0, binding = 2) readonly buffer _unused_name_per_drawcall_vertex_bl mat4 joint_matrices[m_mesh_vertex_blending_max_joint_count * m_mesh_per_drawcall_max_instance_count]; }; -struct VulkanMeshVertexJointBinding -{ - highp ivec4 indices; - highp vec4 weights; -}; - layout(set = 1, binding = 0) readonly buffer _unused_name_per_mesh_joint_binding { VulkanMeshVertexJointBinding indices_and_weights[]; @@ -32,8 +26,8 @@ layout(location = 0) out highp vec3 out_position_world_space; void main() { - highp mat4 model_matrix = model_matrices[gl_InstanceIndex]; - highp float enable_vertex_blending = enable_vertex_blendings[gl_InstanceIndex]; + highp mat4 model_matrix = mesh_instances[gl_InstanceIndex].model_matrix; + highp float enable_vertex_blending = mesh_instances[gl_InstanceIndex].enable_vertex_blending; highp vec3 model_position; if (enable_vertex_blending > 0.0) diff --git a/engine/shader/include/structures.h b/engine/shader/include/structures.h new file mode 100644 index 000000000..66aa5ef57 --- /dev/null +++ b/engine/shader/include/structures.h @@ -0,0 +1,14 @@ +struct VulkanMeshInstance +{ + highp float enable_vertex_blending; + highp float _padding_enable_vertex_blending_1; + highp float _padding_enable_vertex_blending_2; + highp float _padding_enable_vertex_blending_3; + highp mat4 model_matrix; +}; + +struct VulkanMeshVertexJointBinding +{ + highp ivec4 indices; + highp vec4 weights; +}; diff --git a/engine/source/runtime/function/render/include/render/vulkan_manager/vulkan_common.h b/engine/source/runtime/function/render/include/render/vulkan_manager/vulkan_common.h index c14c4b7db..e8198b7a5 100644 --- a/engine/source/runtime/function/render/include/render/vulkan_manager/vulkan_common.h +++ b/engine/source/runtime/function/render/include/render/vulkan_manager/vulkan_common.h @@ -51,10 +51,18 @@ namespace Pilot glm::mat4 directional_light_proj_view; }; + struct VulkanMeshInstance + { + float enable_vertex_blending; + float _padding_enable_vertex_blending_1; + float _padding_enable_vertex_blending_2; + float _padding_enable_vertex_blending_3; + glm::mat4 model_matrix; + }; + struct MeshPerdrawcallStorageBufferObject { - glm::mat4 model_matrices[m_mesh_per_drawcall_max_instance_count]; - float enable_vertex_blendings[m_mesh_per_drawcall_max_instance_count]; + VulkanMeshInstance mesh_instances[m_mesh_per_drawcall_max_instance_count]; }; struct MeshPerdrawcallVertexBlendingStorageBufferObject @@ -87,8 +95,7 @@ namespace Pilot struct MeshPointLightShadowPerdrawcallStorageBufferObject { - glm::mat4 model_matrices[m_mesh_per_drawcall_max_instance_count]; - float enable_vertex_blendings[m_mesh_per_drawcall_max_instance_count]; + VulkanMeshInstance mesh_instances[m_mesh_per_drawcall_max_instance_count]; }; struct MeshPointLightShadowPerdrawcallVertexBlendingStorageBufferObject @@ -103,8 +110,7 @@ namespace Pilot struct MeshDirectionalLightShadowPerdrawcallStorageBufferObject { - glm::mat4 model_matrices[m_mesh_per_drawcall_max_instance_count]; - float enable_vertex_blendings[m_mesh_per_drawcall_max_instance_count]; + VulkanMeshInstance mesh_instances[m_mesh_per_drawcall_max_instance_count]; }; struct MeshDirectionalLightShadowPerdrawcallVertexBlendingStorageBufferObject diff --git a/engine/source/runtime/function/render/source/vulkan_manager/passes/directional_light.cpp b/engine/source/runtime/function/render/source/vulkan_manager/passes/directional_light.cpp index 9f779bd56..f79b5d105 100644 --- a/engine/source/runtime/function/render/source/vulkan_manager/passes/directional_light.cpp +++ b/engine/source/runtime/function/render/source/vulkan_manager/passes/directional_light.cpp @@ -588,8 +588,8 @@ namespace Pilot m_command_info._current_command_buffer, mesh.mesh_index_buffer, 0, VK_INDEX_TYPE_UINT16); uint32_t drawcall_max_instance_count = - (sizeof(MeshDirectionalLightShadowPerdrawcallStorageBufferObject::model_matrices) / - sizeof(MeshDirectionalLightShadowPerdrawcallStorageBufferObject::model_matrices[0])); + (sizeof(MeshDirectionalLightShadowPerdrawcallStorageBufferObject::mesh_instances) / + sizeof(MeshDirectionalLightShadowPerdrawcallStorageBufferObject::mesh_instances[0])); uint32_t drawcall_count = roundUp(total_instance_count, drawcall_max_instance_count) / drawcall_max_instance_count; @@ -625,9 +625,9 @@ namespace Pilot perdrawcall_dynamic_offset)); for (uint32_t i = 0; i < current_instance_count; ++i) { - perdrawcall_storage_buffer_object.model_matrices[i] = + perdrawcall_storage_buffer_object.mesh_instances[i].model_matrix = mesh_nodes[drawcall_max_instance_count * drawcall_index + i].model_matrix; - perdrawcall_storage_buffer_object.enable_vertex_blendings[i] = + perdrawcall_storage_buffer_object.mesh_instances[i].enable_vertex_blending = mesh_nodes[drawcall_max_instance_count * drawcall_index + i] .enable_vertex_blending ? 1.0 : diff --git a/engine/source/runtime/function/render/source/vulkan_manager/passes/lighting.cpp b/engine/source/runtime/function/render/source/vulkan_manager/passes/lighting.cpp index d24f876b4..d2dfbb640 100644 --- a/engine/source/runtime/function/render/source/vulkan_manager/passes/lighting.cpp +++ b/engine/source/runtime/function/render/source/vulkan_manager/passes/lighting.cpp @@ -1401,8 +1401,8 @@ namespace Pilot m_command_info._current_command_buffer, mesh.mesh_index_buffer, 0, VK_INDEX_TYPE_UINT16); uint32_t drawcall_max_instance_count = - (sizeof(MeshPerdrawcallStorageBufferObject::model_matrices) / - sizeof(MeshPerdrawcallStorageBufferObject::model_matrices[0])); + (sizeof(MeshPerdrawcallStorageBufferObject::mesh_instances) / + sizeof(MeshPerdrawcallStorageBufferObject::mesh_instances[0])); uint32_t drawcall_count = roundUp(total_instance_count, drawcall_max_instance_count) / drawcall_max_instance_count; @@ -1436,9 +1436,9 @@ namespace Pilot perdrawcall_dynamic_offset)); for (uint32_t i = 0; i < current_instance_count; ++i) { - perdrawcall_storage_buffer_object.model_matrices[i] = + perdrawcall_storage_buffer_object.mesh_instances[i].model_matrix = mesh_nodes[drawcall_max_instance_count * drawcall_index + i].model_matrix; - perdrawcall_storage_buffer_object.enable_vertex_blendings[i] = + perdrawcall_storage_buffer_object.mesh_instances[i].enable_vertex_blending = mesh_nodes[drawcall_max_instance_count * drawcall_index + i].enable_vertex_blending ? 1.0 : -1.0; diff --git a/engine/source/runtime/function/render/source/vulkan_manager/passes/point_light.cpp b/engine/source/runtime/function/render/source/vulkan_manager/passes/point_light.cpp index c152d0dab..3ef6a6911 100644 --- a/engine/source/runtime/function/render/source/vulkan_manager/passes/point_light.cpp +++ b/engine/source/runtime/function/render/source/vulkan_manager/passes/point_light.cpp @@ -597,8 +597,8 @@ namespace Pilot m_command_info._current_command_buffer, mesh.mesh_index_buffer, 0, VK_INDEX_TYPE_UINT16); uint32_t drawcall_max_instance_count = - (sizeof(MeshPointLightShadowPerdrawcallStorageBufferObject::model_matrices) / - sizeof(MeshPointLightShadowPerdrawcallStorageBufferObject::model_matrices[0])); + (sizeof(MeshPointLightShadowPerdrawcallStorageBufferObject::mesh_instances) / + sizeof(MeshPointLightShadowPerdrawcallStorageBufferObject::mesh_instances[0])); uint32_t drawcall_count = roundUp(total_instance_count, drawcall_max_instance_count) / drawcall_max_instance_count; @@ -632,9 +632,9 @@ namespace Pilot perdrawcall_dynamic_offset)); for (uint32_t i = 0; i < current_instance_count; ++i) { - perdrawcall_storage_buffer_object.model_matrices[i] = + perdrawcall_storage_buffer_object.mesh_instances[i].model_matrix = mesh_nodes[drawcall_max_instance_count * drawcall_index + i].model_matrix; - perdrawcall_storage_buffer_object.enable_vertex_blendings[i] = + perdrawcall_storage_buffer_object.mesh_instances[i].enable_vertex_blending = mesh_nodes[drawcall_max_instance_count * drawcall_index + i] .enable_vertex_blending ? 1.0 : diff --git a/engine/source/runtime/function/render/source/vulkan_manager/vulkan_global_resource.cpp b/engine/source/runtime/function/render/source/vulkan_manager/vulkan_global_resource.cpp index a6ac58ca8..c81d71ebf 100644 --- a/engine/source/runtime/function/render/source/vulkan_manager/vulkan_global_resource.cpp +++ b/engine/source/runtime/function/render/source/vulkan_manager/vulkan_global_resource.cpp @@ -181,11 +181,12 @@ void Pilot::PGlobalRenderResource::initializeStorageBuffer(PVulkanContext& conte // null descriptor PVulkanUtil::createBuffer(context._physical_device, context._device, - 1, + 64, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, 0, _storage_buffer._global_null_descriptor_storage_buffer, _storage_buffer._global_null_descriptor_storage_buffer_memory); + static_assert(64 >= sizeof(PMeshVertex::VulkanMeshVertexJointBinding), ""); } void Pilot::PGlobalRenderResource::mapStorageBuffer(PVulkanContext& context) diff --git a/engine/source/runtime/function/render/source/vulkan_manager/vulkan_manager.cpp b/engine/source/runtime/function/render/source/vulkan_manager/vulkan_manager.cpp index 18c807432..6a31d92c1 100644 --- a/engine/source/runtime/function/render/source/vulkan_manager/vulkan_manager.cpp +++ b/engine/source/runtime/function/render/source/vulkan_manager/vulkan_manager.cpp @@ -117,13 +117,6 @@ void Pilot::PVulkanManager::beginFrame() m_vulkan_context._vkCmdBeginRenderPass( m_command_buffers[m_current_frame_index], &renderpass_begin_info, VK_SUBPASS_CONTENTS_INLINE); - - if (m_enable_debug_untils_label) - { - VkDebugUtilsLabelEXT label_info = { - VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT, NULL, "Lighting", {1.0f, 1.0f, 1.0f, 1.0f}}; - m_vulkan_context._vkCmdBeginDebugUtilsLabelEXT(m_command_buffers[m_current_frame_index], &label_info); - } } m_mesh_lighting_pass.draw();