fix stroke shader with better blending and initial support to opacity

This commit is contained in:
2017-04-07 01:45:50 +01:00
parent 4d930b4429
commit d340324c3d
4 changed files with 34 additions and 14 deletions

View File

@@ -48,7 +48,17 @@ void App::initShaders()
"void main(){"
" frag = vec4(uv.xy, 0.0, 1.0);"
"}";
// TEXTURE ALPHA
static const char* shader_alpha_f =
SHADER_VERSION
"uniform sampler2D tex;\n"
"uniform mediump float alpha;\n"
"in mediump vec3 uv;\n"
"out mediump vec4 frag;\n"
"void main(){\n"
" frag = texture(tex, uv.xy) * vec4(1,1,1,alpha);\n"
"}\n";
// TEXTURE ATLAS
static const char* shader_atlas_v =
SHADER_VERSION
@@ -177,11 +187,13 @@ void App::initShaders()
"out mediump vec4 frag;\n"
"void main(){\n"
" mediump vec2 uv2 = gl_FragCoord.st / resolution;\n"
" mediump float brush = ( 1.0 - texture(tex, uv).r ) * alpha;\n"
" mediump float brush_alpha = ( 1.0 - texture(tex, uv).r ) * alpha;\n"
" mediump vec4 fg = vec4(col.rgb, brush_alpha);\n"
" mediump vec4 bg = texture(tex_bg, uv2);\n"
" mediump vec3 rgb = mix( bg.rgb, col.rgb, clamp( brush/(brush + bg.a), 0.0, 1.0 ) );\n"
" mediump float a = bg.a + (1.0 - bg.a) * brush;\n"
" frag = vec4(rgb, a);\n"
" if (fg.a < (1.0/255.0)) { frag = bg; return; }\n"
" mediump float alpha_tot = fg.a + (1.0 - fg.a) * bg.a;"
" mediump vec3 rgb = mix(bg.rgb, fg.rgb, fg.a / alpha_tot);\n"
" frag = vec4(rgb, alpha_tot);\n"
"}\n";
// STROKE LAYER BLEND
@@ -204,16 +216,19 @@ void App::initShaders()
"in mediump vec2 uv;\n"
"out mediump vec4 frag;\n"
"void main(){\n"
" mediump vec4 fg = texture(tex, uv);\n"
" mediump vec4 fg = texture(tex, uv) * vec4(1,1,1,alpha);\n"
" mediump vec4 bg = texture(tex_bg, uv);\n"
" mediump vec3 rgb = mix( bg.rgb, fg.rgb, clamp( fg.a/(fg.a + bg.a), 0.0, 1.0 ) );\n"
" mediump float a = bg.a + (1.0 - bg.a) * fg.a;\n" // this can be optimized as lerp/mix(1, fg.a, bg.a)
" frag = vec4(rgb, a);\n"
" if (fg.a < (1.0/255.0)) { frag = bg; return; }\n"
" mediump float alpha_tot = fg.a + (1.0 - fg.a) * bg.a;"
" mediump vec3 rgb = mix(bg.rgb, fg.rgb, fg.a / alpha_tot);\n"
" frag = vec4(rgb, alpha_tot);\n"
"}\n";
LOG("initializing shaders");
if (!ShaderManager::create(kShader::Texture, shader_v, shader_f))
LOG("Failed to create shader Texture");
if (!ShaderManager::create(kShader::TextureAlpha, shader_v, shader_alpha_f))
LOG("Failed to create shader TextureAlpha");
if (!ShaderManager::create(kShader::Color, shader_color_v, shader_color_f))
LOG("Failed to create shader Color");
if (!ShaderManager::create(kShader::ColorQuad, shader_color_quad_v, shader_color_quad_f))