我在尝试让 debugPrintfEXT 在着色器中工作时遇到问题

问题描述

似乎我部分工作了,但每次尝试登录时我都会收到此消息:

验证层:验证警告:[ 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