diff options
Diffstat (limited to 'src/gl_calls.cpp')
-rw-r--r-- | src/gl_calls.cpp | 78 |
1 files changed, 68 insertions, 10 deletions
diff --git a/src/gl_calls.cpp b/src/gl_calls.cpp index 82e8be2..68380aa 100644 --- a/src/gl_calls.cpp +++ b/src/gl_calls.cpp @@ -4,6 +4,9 @@ #include "gl_calls.h" + +// TODO(fox): Combine into one after fixing Mac/Windows blend mode slowdown. + const char *DefaultVertexShaderSource = "#version 330 core\n" "layout (location = 0) in vec3 Point;\n" "layout (location = 1) in vec2 aTexCoord;\n" @@ -52,11 +55,6 @@ const char *DefaultFragmentShaderSource = "#version 330 core\n" " FragColor = vec4(InputCol, Col.a);\n" "} else if (FragmentMode == 2) {\n" " FragColor = Col;\n" -"} else {\n" -" vec4 Dest = texture(Texture1, TexCoord);\n" -" FragColor = Dest + Col;\n" -" FragColor = ((1.0f - Dest * 2) * Col * Col) + (Dest * 2 * Col);\n" -" FragColor.a = Col.a;\n" "}\n" "}\0"; @@ -111,12 +109,15 @@ const char *BlendVertexShaderSource = "#version 330 core\n" "}\0"; #endif +// NOTE(fox): Is this slower than using multiple fragment shaders with less source code? +// TODO(fox): Multiply and add can be optimized without the texture copy. const char *BlendFragmentShaderSource = "#version 330 core\n" "out vec4 FragColor;\n" "in vec2 TexCoord;\n" "in vec2 TexCoordBlend;\n" "uniform sampler2D Texture;\n" "uniform sampler2D Texture1;\n" +"uniform int BlendMode;\n" "uniform vec3 InputCol;\n" "uniform vec2 ScreenDimensions;\n" "void main()\n" @@ -124,12 +125,68 @@ const char *BlendFragmentShaderSource = "#version 330 core\n" " vec2 NewCoord = gl_FragCoord.xy / ScreenDimensions;\n" " vec4 Col = texture(Texture, TexCoord);\n" " vec4 Dest = texture(Texture1, NewCoord);\n" -" FragColor = Dest + Col;\n" -" FragColor = ((1.0f - Dest * 2) * Col * Col) + (Dest * 2 * Col);\n" +" vec4 Blend = Dest;\n" +" FragColor.a = Dest.a;\n" +" switch (BlendMode)\n" +" {\n" +" case 0:\n" +" {\n" +" FragColor.a = Col.a;\n" +" } break;\n" +" case 1:\n" +" {\n" +" Blend = Dest * Col;\n" +" } break;\n" +" case 2:\n" +" {\n" +" Blend = 1.0f - ((1.0f - Dest) / Col);\n" +" } break;\n" +" case 3:\n" +" {\n" +" Blend = (Dest + Col) - 1.0f;\n" +" } break;\n" +" case 4:\n" +" {\n" +" Blend = Dest + Col;\n" +" } break;\n" +" case 5:\n" +" {\n" +" Blend = 1.0f - ((1.0f - Dest) * (1.0f - Col));\n" +" } break;\n" +" case 6:\n" +" {\n" +" Blend = 2.0f * Dest * Col;\n" +" vec4 BlendSecond = 1.0f - (2.0f * (1.0f - Dest) * (1.0f - Col));\n" +" Blend = mix(BlendSecond, Blend, lessThan(Dest, vec4(0.5)));\n" +" } break;\n" +" case 7:\n" +" {\n" +" Blend = ((1.0f - Col * 2) * Dest * Dest) + (Col * 2 * Dest);\n" +" } break;\n" +" case 8:\n" +" {\n" +" Blend = 2.0f * Dest * Col;\n" +" vec4 BlendSecond = 1.0f - (2.0f * (1.0f - Dest) * (1.0f - Col));\n" +" Blend = mix(BlendSecond, Blend, greaterThan(Dest, vec4(0.5)));\n" +" } break;\n" +" case 9:\n" +" {\n" +" Blend = Dest - Col;\n" +" } break;\n" +" case 10:\n" +" {\n" +" Blend = Dest / (Col + 0.001f);\n" +" } break;\n" +" case 11:\n" +" {\n" +" Blend = Col - Dest;\n" +" vec4 BlendSecond = Dest - Col;\n" +" Blend = mix(BlendSecond, Blend, greaterThan(Col - Dest, vec4(0.0f)));\n" +" } break;\n" +" }\n" +" FragColor.rgb = Blend.rgb ;\n" "}\0"; -// " vec2 NewCoord = vec2(0.5, 0.5) + vec2(XAxis + YAxis);\n" - static void GL_InitDefaultShader(uint32 *VertexShader, const char *VertexShaderSource, uint32 *FragmentShader, const char *FragmentShaderSource, uint32 *ShaderProgram) @@ -305,7 +362,7 @@ GL_BlitStencil(gl_effect_layer *TestM, void *StrokeData, void *FillData, uint32 static void GL_RasterizeShape2(gl_effect_layer *TestM, gl_effect_layer *TestM2, void *StrokeData, void *FillData, uint32 StrokeCount, uint32 FillCount, layer_transforms T, int Width, int Height, int BytesPerPixel, void *Bitmap, - int L_Width, int L_Height,v4 StrokeCol, v4 FillCol, int RenderMode, int Vector, + int L_Width, int L_Height,v4 StrokeCol, v4 FillCol, blend_mode BlendMode, int RenderMode, int Vector, ImVec2 ViewportSize, ImVec2 UIPos, ImVec2 UIZoom, v2 BlendMin, v2 BlendMax, int StencilLayer) { int Uniform = 0; @@ -444,6 +501,7 @@ GL_RasterizeShape2(gl_effect_layer *TestM, gl_effect_layer *TestM2, void *Stroke glBindTexture(GL_TEXTURE_2D, TestM2->Texture); glUniform1i(glGetUniformLocation(BlendShaderProgram, "Texture"), 0); glUniform1i(glGetUniformLocation(BlendShaderProgram, "Texture1"), 1); + glUniform1i(glGetUniformLocation(BlendShaderProgram, "BlendMode"), BlendMode); } else { glGenTextures(1, &Texture); glBindTexture(GL_TEXTURE_2D, Texture); |