尽管 imgui 和计算绘图工作正常,但三角形未显示

问题描述 投票:0回答:1

我正在关注 vkguide,但不完全是。我正在努力让三角形出现。查看渲染文档时,似乎根据网格查看器正确绘制了顶点,但实际上最终没有绘制任何内容?

我已经根据 vkguide 检查了我的代码,一切看起来都很好,而且我不认为我错过了任何东西。

我还检查了 renderdoc 以查看着色器是否实际上是管道的一部分,看起来它们是正确的,并且每个着色器似乎都处于正确的阶段。

顶点缠绕顺序:CCW

剔除模式:无

渲染文档中的三角形网格:

Triangle mesh in render doc

绘制纹理视图之前: Before drawing texture view

绘制纹理视图后 After drawing texture view

Drawcmd管道状态: Draw pipeline state

顶点着色器:

#pragma shader_stage(vertex)

struct VSOutput {
    float4 position: SV_POSITION;
    [[vk::location(0)]] float3 out_colour: COLOR0;
};

VSOutput main(uint VertexIndex : SV_VertexID)
{
  float3x3 positions = float3x3(
    float3(0, -0.5, 0.5),
    float3(-0.5, 0.5, 0.5),
    float3(0.5, 0.5, 0.5)
  );

  float3x3 colours = float3x3(
    float3(1, 0, 0),
    float3(0, 1, 0),
    float3(0, 0, 1)
  );

    VSOutput output;
    output.position = float4(positions[VertexIndex], 1.0);
    output.out_colour = colours[VertexIndex];
    return output;
}

片段着色器:

#pragma shader_stage(fragment)

struct FSInput {
    [[vk::location(0)]] float3 colour: COLOR0;
};

struct FSOutput {
    [[vk::location(0)]] float4 colour: COLOR0;
};

FSOutput main(FSInput input)
{
  FSOutput output;
  output.colour = float4(input.colour , 1.0);
  return output;
}

命令缓冲区记录

void Engine2D::draw_geometry(vk::CommandBuffer command_buffer) {
    auto colour_attachment =
        init::attachment_info(swapchain.draw_image.image_view, nullptr,
                              vk::ImageLayout::eColorAttachmentOptimal);
    auto render_info =
        init::rendering_info(swapchain.extent, &colour_attachment, nullptr);
    command_buffer.beginRendering(&render_info);
    command_buffer.bindPipeline(vk::PipelineBindPoint::eGraphics,
                                triangle_pipeline.pipeline);

    auto view_port = vk::Viewport{}
                         .setX(0)
                         .setY(0)
                         .setWidth(swapchain.extent.width)
                         .setHeight(swapchain.extent.height)
                         .setMinDepth(0)
                         .setMaxDepth(1);
    command_buffer.setViewport(0, view_port);
    auto scissor = vk::Rect2D{}
                       .setOffset(vk::Offset2D{}.setX(0).setY(0))
                       .setExtent(swapchain.extent);
    command_buffer.setScissor(0, scissor);
    command_buffer.draw(3, 1, 0, 0);
    command_buffer.endRendering();
}

编辑:我尝试使用与 vkguide 相同的管道设置,我多次检查了所有内容,并使用和编译了与它们相同的 OpenGL 着色器,只是为了确定,这没有什么区别。

编辑:我尝试将着色器阶段计数更改为不同的值,但这没有帮助

c++ vulkan hlsl
1个回答
0
投票

我设法解决了这个问题。我转而在笔记本电脑上测试该程序,并收到了验证层错误,而我在其他计算机上没有收到该错误,这暗示颜色附件格式未定义。有了这些信息,我最终发现我没有将渲染附件信息添加到 pNext。

auto pipeline_info = vk::GraphicsPipelineCreateInfo{}
                         ..
                         .setPNext(&rendering_create_info);
© www.soinside.com 2019 - 2024. All rights reserved.