vertex属性在我的Vulkan Programs

问题描述 投票:0回答:0
const std::vector<Vertex> vertices = { {{0.0f, -0.5f}, {0.0f, 1.0f, 0.0f}}, // green at the top {{-0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}}, // blue in the bottom left {{0.5f, 0.5f}, {1.0f, 0.0f, 0.0f}}, // red in the bottom right };

,在我提供的图像中,红色在顶部,而蓝色和绿色则在底部……使我感到困惑。 additiondition,我的控制台中出现了一个注释,说这些信息不能传递到顶点着色器(位于位置0和1,这分别是顶点和颜色分别传递的位置)。我已经寻找有关此错误的解决方案,但我仍然无法弄清楚问题所在。

确切的错误是:

validation error: Validation Performance Warning: [ UNASSIGNED-CoreValidation-Shader-OutputNotConsumed ] Object 0: handle = 0xec4bec0000000000b, type = VK_OBJECT_TYPE_SHADER_MODULE; | MessageID = 0x609a13b | Vertex attribute at location 0 not consumed by vertex shader

。位置0应该是屏幕上作为VEC2的位置的输入,而位置为VEC3。
顶点着色器代码(GLSL)如下:

#version 450 layout(location = 0) in vec2 inPosition; layout(location = 1) in vec3 inColor; layout(location = 0) out vec3 fragColor; void main() { gl_Position = vec4(inPosition, 0.0, 1.0); fragColor = inColor; }

表示,我创建顶点缓冲区的C ++代码是:

void createVertexBuffer() { VkBufferCreateInfo bufferInfo{}; bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; bufferInfo.size = sizeof(vertices[0]) * vertices.size(); bufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; if (vkCreateBuffer(device, &bufferInfo, nullptr, &vertexBuffer) != VK_SUCCESS) { throw std::runtime_error("failed to create vertex buffer!"); } }

最终,我将顶点绑定到适当缓冲区的C ++代码为:

void RTXApp::recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) { VkCommandBufferBeginInfo beginInfo{}; beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; beginInfo.flags = 0; beginInfo.pInheritanceInfo = nullptr; // error catching if (vkBeginCommandBuffer(commandBuffer, &beginInfo) != VK_SUCCESS) { throw std::runtime_error("failed to begin recording command buffer!"); } VkRenderPassBeginInfo renderPassInfo{}; renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; renderPassInfo.renderPass = renderPass; renderPassInfo.framebuffer = swapChainFramebuffers[imageIndex]; renderPassInfo.renderArea.offset = { 0, 0 }; renderPassInfo.renderArea.extent = swapChainExtent; VkClearValue clearColor = { {{0.0f, 0.0f, 0.0f, 1.0f}} }; // set "default" color to black renderPassInfo.clearValueCount = 1; renderPassInfo.pClearValues = &clearColor; // begin render pass vkCmdBeginRenderPass(commandBuffer, &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE); // bind graphics pipeline object to command buffer vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline); // bind the vertex buffer to draw from VkBuffer vertexBuffers[] = { vertexBuffer }; VkDeviceSize offsets[] = { 0 }; vkCmdBindVertexBuffers(commandBuffer, 0, 1, vertexBuffers, offsets); // draw from the vertex buffer vkCmdDraw(commandBuffer, static_cast<uint32_t>(vertices.size()), 1, 0, 0); // end render pass vkCmdEndRenderPass(commandBuffer); // error catching if (vkEndCommandBuffer(commandBuffer) != VK_SUCCESS) { throw std::runtime_error("failed to record command buffer!"); } }

我尝试了我使用的代码版本和我使用的教程中的代码(在此处
found),这两者似乎都具有相同的效果。我不确定我在做什么错,因为我已经遵循了整个信件,因此非常仔细地尝试确保所有结果都像我想要的那样,然后再继续前进。老实说,我不确定该怎么做,因为我为这个特定问题寻找解决方案,但我什么也没找到。
apologies如果这不是最清晰的,那么代码很长,我不确定为什么会发生此错误,而且我对堆栈溢出有些新鲜。任何帮助都将不胜感激,我正在失去理智,试图弄清楚出了什么问题。

该页面底部的代码基本上是我所拥有的长期版本,也是我试图用我使用的代码重新创建的代码。我在Windows 11上,使用MSVS 2022和Windows 10 Vulkan SDK,如果这完全很重要 - 我的项目设置据说都很好,并且匹配了此设置的Windows版本。

Edit:根据要求,这是
VkPipelineVertexInputCreateInfo
代码的一部分。仍然无法弄清楚发生了什么。

auto vertShaderCode = readFile("shaders/vert.spv"); auto fragShaderCode = readFile("shaders/frag.spv"); VkShaderModule vertShaderModule = createShaderModule(vertShaderCode); VkShaderModule fragShaderModule = createShaderModule(fragShaderCode); // create the vertex shader stage of the pipleline VkPipelineShaderStageCreateInfo vertShaderStageInfo{}; vertShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; vertShaderStageInfo.stage = VK_SHADER_STAGE_VERTEX_BIT; vertShaderStageInfo.module = vertShaderModule; vertShaderStageInfo.pName = "main"; // create the fragment shader stages of the pipeline VkPipelineShaderStageCreateInfo fragShaderStageInfo{}; fragShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; fragShaderStageInfo.stage = VK_SHADER_STAGE_FRAGMENT_BIT; fragShaderStageInfo.module = fragShaderModule; fragShaderStageInfo.pName = "main"; // store steps of shader stages in an array (vertex first, then fragment) VkPipelineShaderStageCreateInfo shaderStages[] = { vertShaderStageInfo, fragShaderStageInfo }; VkPipelineVertexInputStateCreateInfo vertexInputInfo{}; vertexInputInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; auto bindingDescription = Vertex::getBindingDescription(); auto attributeDescriptions = Vertex::getAttributeDescriptions(); vertexInputInfo.vertexBindingDescriptionCount = 1; vertexInputInfo.pVertexBindingDescriptions = &bindingDescription; vertexInputInfo.vertexAttributeDescriptionCount = static_cast<uint32_t>(attributeDescriptions.size()); vertexInputInfo.pVertexAttributeDescriptions = attributeDescriptions.data();

	
我有一个相同的问题。 问题是我的更新的着色器文件未编译。

您需要在教程中重做编译着色器步骤:Https://vulkan-tutorial.com/drawing_a_triangle/graphics_pipeline_basics/shader_modules

run compile.bat文件中的vulkan/着色器目录中的bat文件。

graphics vulkan vertex-shader vertex-buffer
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.