Something went wrong. Try again.
art software for the rest of us
drawing paint image sdl art
Something went wrong. Try again.
5.1 kB · 106 lines
C++
at master
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107#include "BlendingPipelineManagementContext.h"#include "../PrimitivesBuilder/PipelineBuilder.h"#include "../PrimitivesBuilder/VertexInputStateBuilder.h"#include "../Assets.h"
std::unordered_map<Blendmode, GraphicsPipeline*> BlendingPipelineManagementContext::Pipelines;
GraphicsPipeline* BlendingPipelineManagementContext::createPipeline(Blendmode blendmode){ auto* vertShader = new Shader(Assets::Path("shaders/CanvasRenderingTarget.vert.spirv"), "main", 0, 0, 0, 0); auto* fragShader = new Shader(Assets::Path("shaders/CanvasRenderingTarget.frag.spirv"), "main", 1, 0, 0, 1);
SDL_GPUColorTargetBlendState blendState = {}; blendState.enable_blend = true; switch (blendmode) { default: case NORMAL: blendState.alpha_blend_op = SDL_GPU_BLENDOP_ADD; blendState.color_blend_op = SDL_GPU_BLENDOP_ADD; blendState.src_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.src_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.dst_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; blendState.dst_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; break; case ADDITIVE: blendState.alpha_blend_op = SDL_GPU_BLENDOP_ADD; blendState.color_blend_op = SDL_GPU_BLENDOP_ADD; blendState.src_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.src_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.dst_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; blendState.dst_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE; break; case SUBTRACT: blendState.alpha_blend_op = SDL_GPU_BLENDOP_SUBTRACT; blendState.color_blend_op = SDL_GPU_BLENDOP_SUBTRACT; blendState.src_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.src_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.dst_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.dst_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE; break; case MULTIPLY: blendState.alpha_blend_op = SDL_GPU_BLENDOP_ADD; blendState.color_blend_op = SDL_GPU_BLENDOP_ADD; blendState.src_alpha_blendfactor = SDL_GPU_BLENDFACTOR_DST_COLOR; blendState.src_color_blendfactor = SDL_GPU_BLENDFACTOR_ZERO; blendState.dst_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; blendState.dst_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; break; case SCREEN: blendState.alpha_blend_op = SDL_GPU_BLENDOP_ADD; blendState.color_blend_op = SDL_GPU_BLENDOP_ADD; blendState.src_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.src_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.dst_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; blendState.dst_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; break; case DARKEN: blendState.alpha_blend_op = SDL_GPU_BLENDOP_ADD; blendState.color_blend_op = SDL_GPU_BLENDOP_ADD; blendState.src_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.src_color_blendfactor = SDL_GPU_BLENDFACTOR_ZERO; blendState.dst_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; blendState.dst_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; break; case LIGHTEN: blendState.alpha_blend_op = SDL_GPU_BLENDOP_ADD; blendState.color_blend_op = SDL_GPU_BLENDOP_ADD; blendState.src_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.src_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.dst_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; blendState.dst_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; break; case LINEAR_DODGE: blendState.alpha_blend_op = SDL_GPU_BLENDOP_ADD; blendState.color_blend_op = SDL_GPU_BLENDOP_ADD; blendState.src_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.src_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.dst_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; blendState.dst_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; break; }
auto vertexInputState = VertexInputStateBuilder() .AddAttribute(0, SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2) .AddAttribute(1, SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2) .BuildDeferred();
GraphicsPipeline* pipeline = PipelineBuilder() .Shaders(vertShader, fragShader) .Blend(blendState) .Format(SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM) .Vertex(vertexInputState.Use()) .Primitive(SDL_GPU_PRIMITIVETYPE_TRIANGLESTRIP) .Build();
Pipelines[blendmode] = pipeline; return pipeline;}
GraphicsPipeline* BlendingPipelineManagementContext::GetPipeline(Blendmode blendmode){ if (Pipelines.find(blendmode) != Pipelines.end()) return Pipelines[blendmode]; return createPipeline(blendmode);}