#c #vulkan #raytracing #nsight
#c #vulkan #трассировка лучей #nsight
Вопрос:
ПРАВКА: Я нашел ошибку в коде. Я ошибочно установил значение «max_primive_count» равным 3, но оно должно быть 1, так как я хотел отобразить только один треугольник. Также maxVertex должен быть установлен на 3, и я забыл установить шаг вершины в sizeof(float) * 3. Тот факт, что Nsight потерпел крушение, заставил меня поверить, что что-то было полностью нарушено в моей программе, и я начал искать глубже, чем должен был. По крайней мере, я нашел кое-что еще по пути.
В настоящее время у меня возникли проблемы с настройкой экземпляра BLAS в моем приложении Vulkan, но у меня возникли некоторые проблемы с настройкой Nsight, поэтому я не могу отладить его должным образом.
Сборки работают нормально, и (обычная) отладка также работает, но этого недостаточно, чтобы понять, почему я не вижу никакой геометрии на своем экране. Поэтому я попытался отладить структуру ускорения с помощью Nsight, но у меня это вышло из строя.
Reason: EXCEPTION_ACCESS_VIOLATION_READ Address: 0x238 Assertion: Unknown assertion type 0x00000000 Thread 0 (crashed) lt;no framesgt; Thread 1 lt;no framesgt; Thread 2 lt;no framesgt; Thread 3 lt;no framesgt; Thread 4 lt;no framesgt; Thread 5 lt;no framesgt; Thread 6 lt;no framesgt; Thread 7 lt;no framesgt; Thread 8 lt;no framesgt; Thread 9 lt;no framesgt; Thread 10 lt;no framesgt; Thread 11 lt;no framesgt; Thread 12 lt;no framesgt; Thread 13 lt;no framesgt; Thread 14 lt;no framesgt; Thread 15 lt;no framesgt; Thread 16 lt;no framesgt; Thread 17 lt;no framesgt; Thread 18 lt;no framesgt;
Но он не выходит из строя при запуске, похоже, он выходит из строя именно в «CmdBuildAccelerationStructuresKHR», поэтому я действительно уверен, что проблема кроется где-то в создании BLAS или, возможно, в примере геометрии, который я использую.
Похоже, что Nsight не может получить доступ к адресу или не имеет на это прав, но я действительно не знаю.
Example geometry for test BLAS:
const float vertices[9] = { 0.25f, 0.25f, 0.0f, 0.75f, 0.25f, 0.0f, 0.50f, 0.75f, 0.0f }; const float indices[3] = { 0.0f, 1.0f, 2.0f }; BufferResource_t vertex_buffer_resource; BufferResource_t index_buffer_resource; VkResult err = buffer_create(amp;vertex_buffer_resource, sizeof(vertices), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR, VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT); if (err != VK_SUCCESS) Sys_Error("Buffer creation failed"); void* mem_vert = buffer_map(amp;vertex_buffer_resource); memcpy(mem_vert, vertices, vertex_buffer_resource.size); buffer_unmap(amp;vertex_buffer_resource); mem_vert = NULL; buffer_create(amp;index_buffer_resource, sizeof(indices), VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR, VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT); void* mem_ind = buffer_map(amp;index_buffer_resource); memcpy(mem_ind, amp;indices, index_buffer_resource.size); buffer_unmap(amp;index_buffer_resource); VkTransformMatrixKHR transform; memset(amp;transform, 0, sizeof(VkTransformMatrixKHR)); transform.matrix[0][0] = 1.0; transform.matrix[1][1] = 1.0; transform.matrix[2][2] = 1.0; BufferResource_t transform_buffer_resource; buffer_create(amp;transform_buffer_resource, sizeof(VkTransformMatrixKHR), VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR, VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT); void* mem_transf = buffer_map(amp;transform_buffer_resource); memcpy(mem_transf, amp;transform, transform_buffer_resource.size); buffer_unmap(amp;transform_buffer_resource);
BLAS Code:
VkDeviceOrHostAddressConstKHR vertex_device_or_host_address_const; memset(amp;vertex_device_or_host_address_const, 0, sizeof(VkDeviceOrHostAddressConstKHR)); vertex_device_or_host_address_const.deviceAddress = vertex_buffer_resource.address; VkDeviceOrHostAddressConstKHR index_device_or_host_address_const; memset(amp;index_device_or_host_address_const, 0, sizeof(VkDeviceOrHostAddressConstKHR)); index_device_or_host_address_const.deviceAddress = index_buffer_resource.address; VkDeviceOrHostAddressConstKHR transform_device_or_host_address_const; memset(amp;transform_device_or_host_address_const, 0, sizeof(VkDeviceOrHostAddressConstKHR)); transform_device_or_host_address_const.deviceAddress = transform_buffer_resource.address; VkAccelerationStructureGeometryTrianglesDataKHR geometry_triangles_data; memset(amp;geometry_triangles_data, 0, sizeof(VkAccelerationStructureGeometryTrianglesDataKHR)); geometry_triangles_data.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR; geometry_triangles_data.vertexFormat = VK_FORMAT_R32G32B32_SFLOAT; geometry_triangles_data.vertexData = vertex_device_or_host_address_const; geometry_triangles_data.maxVertex = 9; geometry_triangles_data.indexType = VK_INDEX_TYPE_UINT32; geometry_triangles_data.indexData = index_device_or_host_address_const; geometry_triangles_data.transformData = transform_device_or_host_address_const; VkAccelerationStructureGeometryKHR geometry; memset(amp;geometry, 0, sizeof(VkAccelerationStructureGeometryKHR)); geometry.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR; geometry.geometry.triangles = geometry_triangles_data; geometry.geometryType = VK_GEOMETRY_TYPE_TRIANGLES_KHR; geometry.flags = VK_GEOMETRY_OPAQUE_BIT_KHR; VkAccelerationStructureBuildGeometryInfoKHR buildInfo; memset(amp;buildInfo, 0, sizeof(VkAccelerationStructureBuildGeometryInfoKHR)); buildInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR; buildInfo.pNext = VK_NULL_HANDLE; buildInfo.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR; buildInfo.flags = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR; buildInfo.mode = VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR; buildInfo.srcAccelerationStructure = VK_NULL_HANDLE; buildInfo.dstAccelerationStructure = VK_NULL_HANDLE; buildInfo.geometryCount = 1; buildInfo.pGeometries = amp;geometry; buildInfo.ppGeometries = VK_NULL_HANDLE; const uint32_t max_primitive_count = 3; VkAccelerationStructureBuildSizesInfoKHR sizeInfo; memset(amp;sizeInfo, 0, sizeof(VkAccelerationStructureBuildSizesInfoKHR)); sizeInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR; fpGetAccelerationStructureBuildSizesKHR(vulkan_globals.device, VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR, amp;buildInfo, amp;max_primitive_count, amp;sizeInfo); VkAccelerationStructureCreateInfoKHR createInfo; memset(amp;createInfo, 0, sizeof(VkAccelerationStructureCreateInfoKHR)); createInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR; createInfo.size = sizeInfo.accelerationStructureSize; createInfo.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR; BufferResource_t scratch_buffer; buffer_create(amp;scratch_buffer, sizeInfo.buildScratchSize, VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); VkDeviceOrHostAddressKHR scratchDeviceOrHostAddress; memset(amp;scratchDeviceOrHostAddress, 0, sizeof(VkDeviceOrHostAddressKHR)); scratchDeviceOrHostAddress.deviceAddress = scratch_buffer.address; buildInfo.scratchData = scratchDeviceOrHostAddress; buffer_create(amp;blas-gt;mem, sizeInfo.accelerationStructureSize, VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); createInfo.buffer = blas-gt;mem.buffer; VkResult err = fpCreateAccelerationStructureKHR(vulkan_globals.device, amp;createInfo, NULL, amp;blas-gt;accel); if (err != VK_SUCCESS) Sys_Error("vkCreateAccelerationStructure failed"); buildInfo.dstAccelerationStructure = blas-gt;accel; VkAccelerationStructureBuildRangeInfoKHR* build_range = amp;(VkAccelerationStructureBuildRangeInfoKHR) { .primitiveCount = 1, .primitiveOffset = 0, .firstVertex = 0, .transformOffset = 0 }; const VkAccelerationStructureBuildRangeInfoKHR** build_range_infos = amp;build_range; fpCmdBuildAccelerationStructuresKHR(vulkan_globals.command_buffer, 1, amp;buildInfo, build_range_infos);
Я ценю все отзывы и предложения!