如何解决Vulkan 线条图未显示
所以我想渲染选定对象的边界框。我有一个缓冲区来存储 8 个点,另一个缓冲区来存储索引以使用这些点的线带绘制来制作一个框。我使用 RenderDoc 捕获了一个帧,我可以看到黄色框 bounding box
所以看起来值是正确的并且正在绘制框,但我没有在屏幕的最终渲染中看到它。。有人知道我在这里可能遗漏了什么吗?
VkDescriptorSetLayoutBinding camerabind = vkinit::descriptorset_layout_binding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,VK_SHADER_STAGE_VERTEX_BIT,0);
VkDescriptorSetLayoutCreateInfo setinfo = {};
setinfo.bindingCount = 1;
setinfo.flags = 0;
setinfo.pNext = nullptr;
setinfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
setinfo.pBindings = &camerabind;
vkCreateDescriptorSetLayout(_device,&setinfo,nullptr,&_globalSetLayout);
//setup push constant
VkPushConstantRange push_constant;
push_constant.offset = 0;
push_constant.size = sizeof(glm::mat4);
push_constant.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
VkPipelineLayoutCreateInfo mesh_pipeline_layout_info = vkinit::pipeline_layout_create_info();
mesh_pipeline_layout_info.setLayoutCount = 1;
mesh_pipeline_layout_info.pSetLayouts = &_globalSetLayout;
mesh_pipeline_layout_info.pPushConstantRanges = &push_constant;
mesh_pipeline_layout_info.pushConstantRangeCount = 1;
vkCreatePipelineLayout(_device,&mesh_pipeline_layout_info,&_highlightPipelineLayout);
PipelineBuilder highlightPipelineBuilder;
VertexInputDescription description;
VkVertexInputBindingDescription mainBinding = {};
mainBinding.binding = 0;
mainBinding.stride = sizeof(glm::vec3);
mainBinding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
description.bindings.push_back(mainBinding);
//Position will be stored at Location 0
VkVertexInputAttributeDescription positionAttribute = {};
positionAttribute.binding = 0;
positionAttribute.location = 0;
positionAttribute.format = VK_FORMAT_R32G32B32_SFLOAT;
positionAttribute.offset = 0;
description.attributes.push_back(positionAttribute);
highlightPipelineBuilder._pipelineLayout = _highlightPipelineLayout;
highlightPipelineBuilder.vertexDescription = description;
highlightPipelineBuilder._inputAssembly = vkinit::input_assembly_create_info(VK_PRIMITIVE_TOPOLOGY_LINE_STRIP);
highlightPipelineBuilder._rasterizer = vkinit::rasterization_state_create_info(VK_polyGON_MODE_LINE);
highlightPipelineBuilder._depthStencil = vkinit::depth_stencil_create_info(true,true,VK_COMPARE_OP_ALWAYS);
ShaderEffect* lineEffect = new ShaderEffect();
lineEffect->add_stage(_shadercache.get_shader(shader_path("wk_highlight.vert.spv")),VK_SHADER_STAGE_VERTEX_BIT);
lineEffect->add_stage(_shadercache.get_shader(shader_path("wk_highlight.frag.spv")),VK_SHADER_STAGE_FRAGMENT_BIT);
lineEffect->reflect_layout(_device,0);
highlightPipelineBuilder.setShaders(lineEffect);
_highlightPipeline = highlightPipelineBuilder.build_pipeline(_device,_renderPass);
这是绘图部分
vkCmdBindPipeline(cmd,VK_PIPELINE_BIND_POINT_GRAPHICS,_highlightPipeline);
uint32_t camera_data_offset = _dynamicData.push(_camera.matrices);
VkDescriptorBufferInfo camInfo = _dynamicData.source.get_info();
camInfo.range = sizeof(GPUCameraData);
camInfo.offset = camera_data_offset;
VkDescriptorSet cameraSet;
vkutil::DescriptorBuilder::begin(_descriptorLayoutCache,_dynamicDescriptorAllocator)
.bind_buffer(0,&camInfo,VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,VK_SHADER_STAGE_VERTEX_BIT)
.build(cameraSet);
vkCmdPushConstants(cmd,_highlightPipelineLayout,sizeof(glm::mat4),&_selectedMatrix);
VkDeviceSize offset = 0;
vkCmdBindVertexBuffers(cmd,1,&_highlightVertexBuffer._buffer,&offset);
vkCmdBindindexBuffer(cmd,_highlightIndexBuffer._buffer,VK_INDEX_TYPE_UINT16);
vkCmdBindDescriptorSets(cmd,&cameraSet,nullptr);
vkCmdDrawIndexed(cmd,16,0);
和着色器
#version 450
layout (location = 0) in vec3 vPosition;
layout(set = 0,binding = 0) uniform CameraBuffer{
mat4 view;
mat4 proj;
mat4 viewproj;
} cameraData;
layout(push_constant) uniform PushConstants {
mat4 matrix;
} pushConstants;
void main()
{
mat4 modelMatrix = pushConstants.matrix;
mat4 transformMatrix = (cameraData.viewproj * modelMatrix);
gl_Position = transformMatrix * vec4(vPosition,1.0f);
}
片段着色器
//glsl version 4.5
#version 450
//output write
layout (location = 0) out vec4 outFragColor;
void main()
{
outFragColor = vec4(1.0,1.0,0.0,1.0);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。