问题描述
似乎我部分工作了,但每次尝试登录时我都会收到此消息:
验证层:验证警告:[ UNASSIGNED-DEBUG-PRINTF ] 对象 0:句柄 = 0x19d6337ae88,类型 = VK_OBJECT_TYPE_DEVICE; |消息 ID = 0x92394c89 |警告 - 调试 Printf 消息被截断,可能是由于缓冲区大小对于消息来说太小
我现在只做一个字符测试日志,直到我让它工作,所以它不应该是一个问题。我也有 #extension GL_EXT_debug_printf :在着色器中启用。
我已将调试器设置设为:
VkDebugUtilsMessengerCreateInfoEXT DebugInfo = {};
DebugInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
DebugInfo.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;|
DebugInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;|
DebugInfo.pfnUserCallback = DebugCallBack;
启动验证信息:
DeviceExtensions.emplace_back(VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME);
VkValidationFeatureEnableEXT enabled[] = { VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT };
VkValidationFeaturedisableEXT disabled[] = {
VK_VALIDATION_FEATURE_disABLE_THREAD_SAFETY_EXT,VK_VALIDATION_FEATURE_disABLE_API_ParaMETERS_EXT,VK_VALIDATION_FEATURE_disABLE_OBJECT_LIFETIMES_EXT,VK_VALIDATION_FEATURE_disABLE_CORE_CHECKS_EXT };
std::vector<const char*> ExtensionList = getrequiredExtensions();
VkInstanceCreateInfo VulkanCreateInfo = {};
VulkanCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
VulkanCreateInfo.pApplicationInfo = &VulkanInfo;
VulkanCreateInfo.enabledExtensionCount = static_cast<uint32_t>(ExtensionList.size());
VulkanCreateInfo.ppEnabledExtensionNames = ExtensionList.data();
#ifdef NDEBUG
VulkanCreateInfo.enabledLayerCount = 0;
VulkanCreateInfo.pNext = nullptr;
#else
VkDebugUtilsMessengerCreateInfoEXT DebugInfo;
VulkanDebug.CreateDebugMessengerInfo(DebugInfo);
VkValidationFeaturesEXT ValidationFeatures{};
ValidationFeatures.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
ValidationFeatures.disabledValidationFeatureCount = 4;
ValidationFeatures.enabledValidationFeatureCount = 1;
ValidationFeatures.pEnabledValidationFeatures = enabled;
ValidationFeatures.pdisabledValidationFeatures = disabled;
ValidationFeatures.pNext = (VkDebugUtilsMessengerCreateInfoEXT*)&DebugInfo;
VulkanCreateInfo.enabledLayerCount = static_cast<unsigned int>(ValidationLayers.size());
VulkanCreateInfo.ppEnabledLayerNames = ValidationLayers.data();
VulkanCreateInfo.pNext = &ValidationFeatures;
vk_layer_settings:
khronos_validation.debug_action = VK_DBG_LAYER_ACTION_LOG_MSG
khronos_validation.report_flags = error,warn,perf
khronos_validation.log_filename = stdout
khronos_validation.printf_buffer_size = 1024
khronos_validation.printf_verbose = true
这是我试图从中记录和调试的计算着色器。 它应该可以做骨骼动画,但它遇到了一些问题,这让我找到了着色器记录器。
#version 460
#extension GL_ARB_separate_shader_objects : enable
#extension GL_EXT_nonuniform_qualifier : enable
#extension GL_EXT_scalar_block_layout : enable
#extension GL_EXT_debug_printf : enable
#include "Lighting.glsl"
struct Vertex
{
vec3 Position;
float Padding1;
vec3 normal;
float Padding2;
vec2 TexureCoord;
vec2 Padding3;
vec3 Tangant;
float Padding4;
vec3 BiTangant;
float Padding5;
vec4 Color;
ivec4 BoneID ;
vec4 BoneWeights;
};
layout(binding = 0,scalar) buffer Vertices
{
Vertex v[];
}
vertices;
layout(binding = 2) uniform UniformBufferObject {
mat4 viewInverse;
mat4 projInverse;
mat4 model;
mat4 view;
mat4 proj;
DirectionalLight dlight;
vec3 viewPos;
PointLight plight;
float vertexSize;
mat4 PVM;
mat4 BoneTransform[100];
float timer;
} ubo;
layout(binding = 5) buffer Transform { mat4 Transform; } MeshTransform[];
layout(push_constant) uniform MeshInfo
{
uint MeshID;
uint ModelID;
uint MaterialID;
} Mesh;
void main()
{
debugPrintfEXT("H");
Vertex v0 = vertices.v[gl_GlobalInvocationID.x];
mat4 BoneTransform = mat4(1.0f);
BoneTransform = ubo.BoneTransform[v0.BoneID[0]] * v0.BoneWeights[0];
BoneTransform += ubo.BoneTransform[v0.BoneID[1]] * v0.BoneWeights[1];
BoneTransform += ubo.BoneTransform[v0.BoneID[2]] * v0.BoneWeights[2];
BoneTransform += ubo.BoneTransform[v0.BoneID[3]] * v0.BoneWeights[3];
vec4 BonePosition = BoneTransform * vec4(v0.Position,1.0);
v0.Position = vec3(ubo.model * MeshTransform[0].Transform * BonePosition);
v0.normal = normalize(transpose(inverse(mat3(ubo.model * MeshTransform[0].Transform * BoneTransform))) * v0.normal);
v0.Color = vec4(v0.BoneID.xyz,1.0f);
vertices.v[gl_GlobalInvocationID.x] = v0;
}
是不是我遗漏了什么?
还制作了一个简单的骨骼样本,但仍然收到相同的消息:
好的,我使用 vulkantutorial 使用了一个基本的 vulkan 模板并输入了着色器 printf 设置,但仍然出现相同的错误。
https://github.com/ThomasDHZ/VulkanShaderLoggerTest
https://vulkan-tutorial.com/Drawing_a_triangle/Swap_chain_recreation
解决方法
您对每个计算着色器调用都进行了高度详细的打印。对于默认缓冲区大小 1024,这很可能是大量文本。
因此,您需要降低着色器中的 printf 调用,并且还希望将消息的详细程度降低到例如只有 VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT
而不是 VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT
。