Picked up vkguide again, switched from slang to glsl.
Created the triangle pipeline
This commit is contained in:
parent
50c0e866cf
commit
c20c6928b1
@ -1,30 +0,0 @@
|
|||||||
static float2 positions[3] = float2[](
|
|
||||||
float2(0.0, -0.5),
|
|
||||||
float2(0.5, 0.5),
|
|
||||||
float2(-0.5, 0.5)
|
|
||||||
);
|
|
||||||
|
|
||||||
static float3 colors[3] = float3[] (
|
|
||||||
float3(1.0, 0.0, 0.0),
|
|
||||||
float3(0.0, 1.0, 0.0),
|
|
||||||
float3(0.0, 0.0, 1.0)
|
|
||||||
);
|
|
||||||
|
|
||||||
struct VertexOutput {
|
|
||||||
float3 color;
|
|
||||||
float4 sv_position : SV_Position;
|
|
||||||
};
|
|
||||||
|
|
||||||
[shader("vertex")]
|
|
||||||
VertexOutput vertMain(uint vid : SV_VertexID) {
|
|
||||||
VertexOutput output;
|
|
||||||
output.sv_position = float4(positions[vid], 0.0, 1.0);
|
|
||||||
output.color = colors[vid];
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
[shader("fragment")]
|
|
||||||
float4 fragMain(VertexOutput inVert) : SV_Target {
|
|
||||||
float3 color = inVert.color;
|
|
||||||
return float4(color, 1.0);
|
|
||||||
}
|
|
||||||
13
shaders/colored_triangle_fragment.frag
Normal file
13
shaders/colored_triangle_fragment.frag
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#version 450
|
||||||
|
|
||||||
|
//shader input
|
||||||
|
layout (location = 0) in vec3 inColor;
|
||||||
|
|
||||||
|
//output write
|
||||||
|
layout (location = 0) out vec4 outFragColor;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
//return red
|
||||||
|
outFragColor = vec4(inColor,1.0f);
|
||||||
|
}
|
||||||
24
shaders/colored_triangle_vertices.vert
Normal file
24
shaders/colored_triangle_vertices.vert
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#version 450
|
||||||
|
|
||||||
|
layout (location = 0) out vec3 outColor;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
//const array of positions for the triangle
|
||||||
|
const vec3 positions[3] = vec3[3](
|
||||||
|
vec3(1.f,1.f, 0.0f),
|
||||||
|
vec3(-1.f,1.f, 0.0f),
|
||||||
|
vec3(0.f,-1.f, 0.0f)
|
||||||
|
);
|
||||||
|
|
||||||
|
//const array of colors for the triangle
|
||||||
|
const vec3 colors[3] = vec3[3](
|
||||||
|
vec3(1.0f, 0.0f, 0.0f), //red
|
||||||
|
vec3(0.0f, 1.0f, 0.0f), //green
|
||||||
|
vec3(00.f, 0.0f, 1.0f) //blue
|
||||||
|
);
|
||||||
|
|
||||||
|
//output the position of each vertex
|
||||||
|
gl_Position = vec4(positions[gl_VertexIndex], 1.0f);
|
||||||
|
outColor = colors[gl_VertexIndex];
|
||||||
|
}
|
||||||
@ -840,6 +840,7 @@ void Engine::initPipelines() {
|
|||||||
fmt::println("[Engine:Init] Initializing pipelines...");
|
fmt::println("[Engine:Init] Initializing pipelines...");
|
||||||
#endif
|
#endif
|
||||||
initBackgroundPipelines();
|
initBackgroundPipelines();
|
||||||
|
initTrianglePipeline();
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fmt::println("[Engine:Init] Pipelines initialized !");
|
fmt::println("[Engine:Init] Pipelines initialized !");
|
||||||
@ -1000,6 +1001,87 @@ void Engine::initBackgroundPipelines() {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Engine::initTrianglePipeline() {
|
||||||
|
#ifdef DEBUG
|
||||||
|
fmt::println("[Engine:Init] Initializing triangle pipeline...");
|
||||||
|
#endif
|
||||||
|
// Create the shader
|
||||||
|
VkShaderModule triangleFragShader;
|
||||||
|
if(!vkutil::loadShaderModule("shaders/colored_triangle_fragment.spv", _device, &triangleFragShader)) {
|
||||||
|
fmt::println("[Engine:Error] Failed to load the triangle fragment shader !");
|
||||||
|
} else {
|
||||||
|
fmt::println("[Engine:Info] Successfully loaded the triangle fragment shader !");
|
||||||
|
}
|
||||||
|
|
||||||
|
VkShaderModule triangleVertShader;
|
||||||
|
if(!vkutil::loadShaderModule("shaders/colored_triangle_vertices.spv", _device, &triangleVertShader)) {
|
||||||
|
fmt::println("[Engine:Error] Failed to load the triangle vertex shader !");
|
||||||
|
} else {
|
||||||
|
fmt::println("[Engine:Info] Successfully loaded the triangle vertex shader !");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build the pipeline with the helper functions
|
||||||
|
// Build the pipeline layout that controls the inputs/outputs of the shader
|
||||||
|
// We are not using descriptor sets or other systems yet, so no need to use anything other than empty default
|
||||||
|
// This is because we don't have push constants or descriptor bindings
|
||||||
|
VkPipelineLayoutCreateInfo pipelineLayoutInfo = vkinit::pipelineLayoutCreateInfo();
|
||||||
|
VK_CHECK(
|
||||||
|
vkCreatePipelineLayout(
|
||||||
|
_device,
|
||||||
|
&pipelineLayoutInfo,
|
||||||
|
nullptr,
|
||||||
|
&_trianglePipelineLayout
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
PipelineBuilder pipelineBuilder;
|
||||||
|
pipelineBuilder._pipelineLayout = _trianglePipelineLayout;
|
||||||
|
// Connect both the vertex and fragment shader together
|
||||||
|
// Todo : Handle the case where they are both in the same VkShaderModule,
|
||||||
|
// with slang shaders for example
|
||||||
|
pipelineBuilder.setShaders(triangleVertShader, triangleFragShader);
|
||||||
|
// Draw triangles
|
||||||
|
// Can also draw "wireframe"
|
||||||
|
pipelineBuilder.setInputTopology(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST);
|
||||||
|
// Fill those triangles.
|
||||||
|
// For wireframe, don't
|
||||||
|
pipelineBuilder.setPolygonMode(VK_POLYGON_MODE_FILL);
|
||||||
|
// No backface culling atm
|
||||||
|
// Enable it for optimization, but beware of clockwise/anticlockwise coordinates
|
||||||
|
// Also, Vulkan uses -Y, so take note
|
||||||
|
pipelineBuilder.setCullMode(VK_CULL_MODE_NONE, VK_FRONT_FACE_CLOCKWISE);
|
||||||
|
// No multisampling,
|
||||||
|
// used for a more "retro" look,
|
||||||
|
// and more performance
|
||||||
|
// also useless because it's a single triangle
|
||||||
|
pipelineBuilder.setMultisamplingNone();
|
||||||
|
// No blending
|
||||||
|
pipelineBuilder.disableBlending();
|
||||||
|
// No depth testing,
|
||||||
|
// 'cause no depth buffer nor 3D triangle
|
||||||
|
pipelineBuilder.disableDepthtest();
|
||||||
|
|
||||||
|
// Connect the image format we will draw into, from draw image
|
||||||
|
pipelineBuilder.setColorAttachmentFormat(_drawImage.imageFormat);
|
||||||
|
pipelineBuilder.setDepthFormat(VK_FORMAT_UNDEFINED);
|
||||||
|
|
||||||
|
// Finally build the pipeline
|
||||||
|
_trianglePipeline = pipelineBuilder.buildPipeline(_device);
|
||||||
|
|
||||||
|
// clean structures
|
||||||
|
vkDestroyShaderModule(_device, triangleFragShader, nullptr);
|
||||||
|
vkDestroyShaderModule(_device, triangleVertShader, nullptr);
|
||||||
|
|
||||||
|
_mainDeletionQueue.pushFunction([this]() {
|
||||||
|
vkDestroyPipelineLayout(_device, _trianglePipelineLayout, nullptr);
|
||||||
|
vkDestroyPipeline(_device, _trianglePipeline, nullptr);
|
||||||
|
});
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fmt::println("[Engine:Init] Triangle pipeline initalized !");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void Engine::initImgui() {
|
void Engine::initImgui() {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fmt::println("[Engine:Init] Initializing ImGui...");
|
fmt::println("[Engine:Init] Initializing ImGui...");
|
||||||
|
|||||||
@ -70,6 +70,8 @@ namespace vkinit {
|
|||||||
VkRenderingAttachmentInfo* depthAttachment
|
VkRenderingAttachmentInfo* depthAttachment
|
||||||
);
|
);
|
||||||
|
|
||||||
|
VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo();
|
||||||
|
|
||||||
VkPipelineShaderStageCreateInfo pipelineShaderStageCreateInfo(
|
VkPipelineShaderStageCreateInfo pipelineShaderStageCreateInfo(
|
||||||
VkShaderStageFlagBits stage,
|
VkShaderStageFlagBits stage,
|
||||||
VkShaderModule shaderModule,
|
VkShaderModule shaderModule,
|
||||||
@ -310,6 +312,21 @@ namespace vkinit {
|
|||||||
return renderInfo;
|
return renderInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo() {
|
||||||
|
VkPipelineLayoutCreateInfo info {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
|
||||||
|
.pNext = nullptr,
|
||||||
|
// Empty defaults
|
||||||
|
.flags = 0,
|
||||||
|
.setLayoutCount = 0,
|
||||||
|
.pSetLayouts = nullptr,
|
||||||
|
.pushConstantRangeCount = 0,
|
||||||
|
.pPushConstantRanges = nullptr,
|
||||||
|
};
|
||||||
|
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
VkPipelineShaderStageCreateInfo pipelineShaderStageCreateInfo(
|
VkPipelineShaderStageCreateInfo pipelineShaderStageCreateInfo(
|
||||||
VkShaderStageFlagBits stage,
|
VkShaderStageFlagBits stage,
|
||||||
VkShaderModule shaderModule,
|
VkShaderModule shaderModule,
|
||||||
|
|||||||
@ -28,6 +28,7 @@ class PipelineBuilder {
|
|||||||
VkPipelineLayout _pipelineLayout;
|
VkPipelineLayout _pipelineLayout;
|
||||||
VkPipelineDepthStencilStateCreateInfo _depthStencil;
|
VkPipelineDepthStencilStateCreateInfo _depthStencil;
|
||||||
VkPipelineRenderingCreateInfo _renderInfo;
|
VkPipelineRenderingCreateInfo _renderInfo;
|
||||||
|
VkFormat _colorAttachmentFormat;
|
||||||
|
|
||||||
PipelineBuilder() { clear(); }
|
PipelineBuilder() { clear(); }
|
||||||
|
|
||||||
@ -330,6 +331,15 @@ void PipelineBuilder::disableBlending() {
|
|||||||
_colorBlendAttachment.blendEnable = VK_FALSE;
|
_colorBlendAttachment.blendEnable = VK_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PipelineBuilder::setColorAttachmentFormat(
|
||||||
|
VkFormat format
|
||||||
|
) {
|
||||||
|
_colorAttachmentFormat = format;
|
||||||
|
// connect the format to the renderInfo structure
|
||||||
|
_renderInfo.colorAttachmentCount = 1;
|
||||||
|
_renderInfo.pColorAttachmentFormats = &_colorAttachmentFormat;
|
||||||
|
}
|
||||||
|
|
||||||
void PipelineBuilder::setDepthFormat(
|
void PipelineBuilder::setDepthFormat(
|
||||||
VkFormat format
|
VkFormat format
|
||||||
) {
|
) {
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
Subproject commit 5220a3f48d39c000da8b46fb0fccf3dd62695c51
|
Subproject commit b48d1afbe8ee8b238e2961dc363a949dd7304e23
|
||||||
Loading…
x
Reference in New Issue
Block a user