我正在关注 vkguide,但不完全是。我正在努力让三角形出现。查看渲染文档时,似乎根据网格查看器正确绘制了顶点,但实际上最终没有绘制任何内容?
我已经根据 vkguide 检查了我的代码,一切看起来都很好,而且我不认为我错过了任何东西。
我还检查了 renderdoc 以查看着色器是否实际上是管道的一部分,看起来它们是正确的,并且每个着色器似乎都处于正确的阶段。
顶点缠绕顺序:CCW
剔除模式:无
渲染文档中的三角形网格:
顶点着色器:
#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 着色器,只是为了确定,这没有什么区别。
编辑:我尝试将着色器阶段计数更改为不同的值,但这没有帮助
我设法解决了这个问题。我转而在笔记本电脑上测试该程序,并收到了验证层错误,而我在其他计算机上没有收到该错误,这暗示颜色附件格式未定义。有了这些信息,我最终发现我没有将渲染附件信息添加到 pNext。
auto pipeline_info = vk::GraphicsPipelineCreateInfo{}
..
.setPNext(&rendering_create_info);