载入中...
搜索中...
未找到
GraphicsMeshStylePipeline.cpp
浏览该文件的文档.
3
4namespace eve::graphics::vulkan {
5vk::Pipeline Graphics::createMesh3DStylePipeline(const std::vector<uint32_t>& vert, const std::vector<uint32_t>& frag,
6 vk::PipelineLayout layout, const vkb::BuiltRenderPass& rp,
7 vk::SampleCountFlagBits samples, BlendMode blend, bool depthWrite,
8 bool doubleSided, const MeshShaderRasterState& raster) {
9 vk::ShaderModuleCreateInfo vertexInfo{};
10 vertexInfo.codeSize = vert.size() * sizeof(uint32_t);
11 vertexInfo.pCode = vert.data();
12 auto vertModule = device->createShaderModuleUnique(vertexInfo);
13 vk::ShaderModuleCreateInfo fragmentInfo{};
14 fragmentInfo.codeSize = frag.size() * sizeof(uint32_t);
15 fragmentInfo.pCode = frag.data();
16 auto fragModule = device->createShaderModuleUnique(fragmentInfo);
17 const auto cull = doubleSided ? vk::CullModeFlagBits::eNone : vk::CullModeFlagBits::eBack;
18 const auto compare = raster.depthCompare == MeshDepthCompare::Always ? vk::CompareOp::eAlways
19 : raster.depthCompare == MeshDepthCompare::LessEqual ? vk::CompareOp::eLessOrEqual
20 : vk::CompareOp::eLess;
21 vk::Pipeline pipe{};
22 if (blend != BlendMode::Opaque || raster.colorWriteMask != 15) {
23 std::vector<vk::PipelineColorBlendAttachmentState> attachments(1, makeBlendAttachment(blend));
24 attachments[0].blendEnable = blend != BlendMode::Opaque;
25 attachments[0].colorWriteMask = vk::ColorComponentFlags(raster.colorWriteMask);
26 vk::PipelineColorBlendStateCreateInfo cbs{};
27 cbs.attachmentCount = 1;
28 cbs.pAttachments = attachments.data();
29 pipe =
30 device.createPipeline()
31 .useClassicPipeline(vertModule.get(), fragModule.get())
32 .setPipelineLayout(layout)
33 .setVertexInputState(
34 vkb::VertexInputStateBuilder().addInputBinding<MeshVertex>().addAttributeDescription<MeshVertex>())
35 .setDynamicStatesViewportScissor()
36 .setRasterizer(vk::PolygonMode::eFill, false, false, 1.0f, cull, vk::FrontFace::eCounterClockwise)
37 .setMultisampler(false, samples)
38 .setDepthBias(raster.depthBiasConstant, raster.depthBiasSlope)
39 .setDepthStencil(true, depthWrite, compare)
40 .setColorBlending(cbs)
41 .build(rp);
42 } else {
43 pipe =
44 device.createPipeline()
45 .useClassicPipeline(vertModule.get(), fragModule.get())
46 .setPipelineLayout(layout)
47 .setVertexInputState(
48 vkb::VertexInputStateBuilder().addInputBinding<MeshVertex>().addAttributeDescription<MeshVertex>())
49 .setDynamicStatesViewportScissor()
50 .setRasterizer(vk::PolygonMode::eFill, false, false, 1.0f, cull, vk::FrontFace::eCounterClockwise)
51 .setMultisampler(false, samples)
52 .setDepthBias(raster.depthBiasConstant, raster.depthBiasSlope)
53 .setDepthStencil(true, depthWrite, compare)
54 .setColorAttachmentCount(1)
55 .build(rp);
56 }
57 return pipe;
58}
59
60} // namespace eve::graphics::vulkan
std::string layout
vk::ShaderModule vert
vk::ShaderModule frag
float blend
bool doubleSided
eve::BlendMode BlendMode
Compatibility alias for the shared 2D blend mode.
Definition BlendMode.h:8