remove unused shaders, fix color blending algorithm in shader

This commit is contained in:
2017-08-18 02:01:35 +01:00
parent 90ee185dcd
commit de59ae151c
6 changed files with 36 additions and 155 deletions

View File

@@ -119,7 +119,7 @@
<node height="20" justify="center"><text text="Mixer" font-face="arial" font-size="11"/></node>
</node>
<border dir="col" align="center" grow="1" width="1">
<node height="20" pad="1" width="100%"><slider-h id="tip-size" value=".5"/></node>
<node height="20" pad="1" width="100%"><slider-h id="tip-size" value=".25"/></node>
<node height="20" pad="1" width="100%"><slider-h id="tip-flow" value=".15"/></node>
<node height="20" pad="1" width="100%"><slider-h id="tip-opacity" value="1"/></node>
<node height="20" pad="1" width="100%"><slider-h id="tip-spacing" value=".25"/></node>

View File

@@ -76,19 +76,10 @@ void App::initShaders()
" mediump vec4 stroke = texture(tex_stroke, uv.xy);\n"
" stroke.a = stroke.a * alpha;\n"
" if (lock){\n"
" mediump float alpha_tot = stroke.a + (1.0 - stroke.a) * base.a;"
" mediump vec3 rgb = mix(base.rgb, stroke.rgb, stroke.a / alpha_tot);\n"
" frag = vec4(rgb, base.a);\n"
" } else {\n"
" mediump float alpha_tot = stroke.a + (1.0 - stroke.a) * base.a;"
" mediump vec3 rgb = mix(base.rgb, stroke.rgb, stroke.a / alpha_tot);\n"
" frag = vec4(rgb, alpha_tot);\n"
" }\n"
// " mediump float alpha_tot = stroke.a + (1.0 - stroke.a) * base.a;"
// " mediump vec3 rgb = mix(base.rgb, stroke.rgb, stroke.a / alpha_tot);\n"
// " frag = vec4(rgb, alpha_tot);\n"
" mediump float contribution = (1.0 - base.a) * stroke.a;\n"
" mediump float alpha_tot = base.a + contribution;"
" mediump vec3 rgb = mix(base.rgb, stroke.rgb, stroke.a / alpha_tot);\n"
" frag = vec4(rgb, lock ? base.a : alpha_tot);\n"
"}\n";
// TEXTURE ATLAS
@@ -213,9 +204,9 @@ void App::initShaders()
"}\n";
static const char* shader_stroke_f =
SHADER_VERSION
#ifdef __IOS__
#ifdef __IOS__
"#extension GL_EXT_shader_framebuffer_fetch : enable\n"
#endif
#endif
"uniform mediump sampler2D tex;\n"
"uniform mediump sampler2D tex_bg;\n"
"uniform mediump vec4 col;\n"
@@ -223,130 +214,26 @@ void App::initShaders()
"uniform mediump float alpha;\n"
"in mediump vec2 uv;\n"
"in mediump float q;\n"
#ifdef __IOS__
#ifdef __IOS__
"inout mediump vec4 frag;\n"
#else
#else
"out mediump vec4 frag;\n"
#endif
#endif
"void main(){\n"
" mediump vec2 uv2 = gl_FragCoord.st / resolution;\n"
" mediump float brush_alpha = ( 1.0 - texture(tex, uv/q).r ) * alpha;\n"
" mediump vec4 fg = vec4(col.rgb, brush_alpha);\n"
#ifdef __IOS__
#ifdef __IOS__
" mediump vec4 bg = frag;\n"
#else
#else
" mediump vec4 bg = texture(tex_bg, uv2);\n"
#endif
//" if (fg.a < 1.0/255.0) { frag = bg; return; }\n"
" mediump float alpha_tot = fg.a + (1.0 - fg.a) * bg.a;"
#endif
" if (fg.a == 1.0/255.0) { frag = bg; return; }\n"
" mediump float contribution = max((1.0 - bg.a) * fg.a, 1.0/255.0);\n"
" mediump float alpha_tot = bg.a + contribution;"
" mediump vec3 rgb = mix(bg.rgb, fg.rgb, fg.a / alpha_tot);\n"
" frag = vec4(rgb, clamp(alpha_tot, 0.0, 1.0));\n"
"}\n";
// ALPHA LOCK
static const char* shader_stroke_lock_f =
SHADER_VERSION
#ifdef __IOS__
"#extension GL_EXT_shader_framebuffer_fetch : enable\n"
#endif
"uniform mediump sampler2D tex;\n"
"uniform mediump sampler2D tex_bg;\n"
"uniform mediump sampler2D tex_mask;\n"
"uniform mediump vec4 col;\n"
"uniform mediump vec2 resolution;\n"
"uniform mediump float alpha;\n"
"in mediump vec2 uv;\n"
#ifdef __IOS__
"inout mediump vec4 frag;\n"
#else
"out mediump vec4 frag;\n"
#endif
"void main(){\n"
" mediump vec2 uv2 = gl_FragCoord.st / resolution;\n"
" mediump float brush_alpha = ( 1.0 - texture(tex, uv).r ) * alpha;\n"
" mediump vec4 fg = vec4(col.rgb, brush_alpha);\n"
#ifdef __IOS__
" mediump vec4 bg = frag;\n"
#else
" mediump vec4 bg = texture(tex_bg, uv2);\n"
#endif
" mediump vec4 msk = texture(tex_mask, uv2);\n"
//" if (fg.a < (1.0/255.0)) { 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, msk.a);\n"
"}\n";
// ERASER
static const char* shader_stroke_erase_f =
SHADER_VERSION
#ifdef __IOS__
"#extension GL_EXT_shader_framebuffer_fetch : enable\n"
#endif
"uniform mediump sampler2D tex;\n"
"uniform mediump sampler2D tex_bg;\n"
"uniform mediump vec4 col;\n"
"uniform mediump vec2 resolution;\n"
"uniform mediump float alpha;\n"
"in mediump vec2 uv;\n"
#ifdef __IOS__
"inout mediump vec4 frag;\n"
#else
"out mediump vec4 frag;\n"
#endif
"void main(){\n"
" mediump vec2 uv2 = gl_FragCoord.st / resolution;\n"
" mediump float brush_alpha = ( 1.0 - texture(tex, uv).r ) * alpha;\n"
#ifdef __IOS__
" mediump vec4 bg = frag;\n"
#else
" mediump vec4 bg = texture(tex_bg, uv2);\n"
#endif
" frag = vec4(bg.rgb, bg.a - bg.a * brush_alpha);\n"
"}\n";
// STROKE LAYER BLEND
static const char* shader_stroke_layer_v =
SHADER_VERSION
"uniform mat4 mvp;"
"in vec4 pos;"
"in vec2 uvs;"
"out vec2 uv;"
"void main(){"
" uv = uvs;"
" gl_Position = mvp * vec4(pos.xyz, 1.0);"
"}";
static const char* shader_stroke_layer_f =
SHADER_VERSION
#ifdef __IOS__
"#extension GL_EXT_shader_framebuffer_fetch : enable\n"
#endif
"uniform mediump sampler2D tex;\n"
"uniform mediump sampler2D tex_bg;\n"
"uniform mediump vec2 resolution;\n"
"uniform mediump float alpha;\n"
"uniform bool lock;\n"
"uniform bool erase;\n"
"in mediump vec2 uv;\n"
#ifdef __IOS__
"inout mediump vec4 frag;\n"
#else
"out mediump vec4 frag;\n"
#endif
"void main(){\n"
" mediump vec4 fg = texture(tex, uv) * vec4(1,1,1,alpha);\n"
#ifdef __IOS__
" mediump vec4 bg = frag;\n"
#else
" mediump vec4 bg = texture(tex_bg, uv);\n"
#endif
//" if (fg.a < (1.0/255.0)) { frag = bg; return; }\n"
" if (erase){\n"
" frag = vec4(bg.rgb, bg.a - fg.a);\n"
" } else {\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, lock ? bg.a : alpha_tot);\n"
" }\n"
"}\n";
static const char* shader_checkerboard_v =
SHADER_VERSION
@@ -422,12 +309,6 @@ void App::initShaders()
LOG("Failed to create shader Atlas");
if (!ShaderManager::create(kShader::Stroke, shader_stroke_v, shader_stroke_f))
LOG("Failed to create shader Stroke");
if (!ShaderManager::create(kShader::StrokeLock, shader_stroke_v, shader_stroke_lock_f))
LOG("Failed to create shader StrokeLock");
if (!ShaderManager::create(kShader::StrokeErase, shader_stroke_v, shader_stroke_erase_f))
LOG("Failed to create shader StrokeErase");
if (!ShaderManager::create(kShader::StrokeLayer, shader_stroke_layer_v, shader_stroke_layer_f))
LOG("Failed to create shader StrokeLayer");
if (!ShaderManager::create(kShader::Checkerboard, shader_checkerboard_v, shader_checkerboard_f))
LOG("Failed to create shader Checkerboard");
if (!ShaderManager::create(kShader::Equirect, shader_equirect_v, shader_equirect_f))

View File

@@ -164,7 +164,7 @@ ui::StrokeSample ui::Stroke::randomize_sample(const glm::vec2& pos, float pressu
StrokeSample s;
s.angle = (m_brush.m_tip_angle + rnd_nor() * m_brush.m_jitter_angle) * (float)(M_PI * 2.0);
s.pos = pos + (rnd_vec() * m_brush.m_jitter_spread * 100.f);
s.size = 800.f * glm::pow(m_brush.m_tip_size, 2.f) * (1.f - rnd_nor() * m_brush.m_jitter_scale);
s.size = 800.f * glm::pow(m_brush.m_tip_size, 3.f) * (1.f - rnd_nor() * m_brush.m_jitter_scale);
s.flow = glm::pow(m_brush.m_tip_flow, 2.f) * (1.f - rnd_nor() * m_brush.m_jitter_flow) * pressure;
return s;
}
@@ -214,7 +214,7 @@ void ui::Stroke::start(const ui::Brush& brush)
{
m_last_kp = 0;
m_dist = 0.f;
m_step = glm::max(brush.m_tip_spacing * 10, 1.f);
m_step = glm::max(brush.m_tip_spacing * brush.m_tip_size * 100, 1.f);
m_brush = brush;
prng.seed(0);
}

View File

@@ -81,20 +81,21 @@ void ui::Canvas::pick_update(int plane)
{
// copy to tmp2 for layer blending
glActiveTexture(GL_TEXTURE0); // TODO: maybe remove this line
#ifndef __IOS__
m_tex2[i].bind();
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, m_width, m_height);
m_tex2[i].unbind();
#endif
// #ifndef __IOS__
// m_tex2[i].bind();
// glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, m_width, m_height);
// m_tex2[i].unbind();
// #endif
m_layers[layer_index].m_rtt[i].bindTexture();
glActiveTexture(GL_TEXTURE1);
m_tex2[i].bind();
m_sampler.bind(0);
m_sampler_bg.bind(1);
ShaderManager::use(ui::kShader::StrokeLayer);
ShaderManager::use(ui::kShader::TextureAlpha);
ShaderManager::u_int(kShaderUniform::TexBG, 1);
ShaderManager::u_float(kShaderUniform::Alpha, m_layers[layer_index].m_opacity);
ShaderManager::u_int(kShaderUniform::Highlight, false);
ShaderManager::u_int(kShaderUniform::Tex, 0);
ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-.5f, .5f, -.5f, .5f, -1.f, 1.f));
m_plane.draw_fill();
@@ -765,7 +766,7 @@ void ui::Canvas::export_equirectangular(std::string data_path)
// prepare common states
glViewport(0, 0, m_width, m_height);
glDisable(GL_BLEND);
glEnable(GL_BLEND);
RTT m_latlong;
m_latlong.create(m_width * 4, m_height * 2); // NOTE: w and h must be equal to make sense
@@ -792,18 +793,19 @@ void ui::Canvas::export_equirectangular(std::string data_path)
{
// copy to tmp2 for layer blending
glActiveTexture(GL_TEXTURE0); // TODO: maybe remove this line
m_tex2[i].bind();
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, m_width, m_height);
m_tex2[i].unbind();
// m_tex2[i].bind();
// glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, m_width, m_height);
// m_tex2[i].unbind();
m_layers[layer_index].m_rtt[i].bindTexture();
glActiveTexture(GL_TEXTURE1);
m_tex2[i].bind();
m_sampler.bind(0);
m_sampler_bg.bind(1);
ShaderManager::use(ui::kShader::StrokeLayer);
ShaderManager::u_int(kShaderUniform::TexBG, 1);
ShaderManager::use(ui::kShader::TextureAlpha);
//ShaderManager::u_int(kShaderUniform::TexBG, 1);
ShaderManager::u_float(kShaderUniform::Alpha, m_layers[layer_index].m_opacity);
ShaderManager::u_int(kShaderUniform::Highlight, false);
ShaderManager::u_int(kShaderUniform::Tex, 0);
ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-.5f, .5f, -.5f, .5f, -1.f, 1.f));
m_plane.draw_fill();
@@ -921,9 +923,10 @@ void ui::Canvas::export_anim(std::string data_path)
m_tex2[i].bind();
m_sampler.bind(0);
m_sampler_bg.bind(1);
ShaderManager::use(ui::kShader::StrokeLayer);
ShaderManager::use(ui::kShader::TextureAlpha);
ShaderManager::u_int(kShaderUniform::TexBG, 1);
ShaderManager::u_float(kShaderUniform::Alpha, 1);
ShaderManager::u_int(kShaderUniform::Highlight, false);
ShaderManager::u_int(kShaderUniform::Tex, 0);
ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-.5f, .5f, -.5f, .5f, -1.f, 1.f));
m_plane.draw_fill();

View File

@@ -30,7 +30,7 @@ void CanvasModeBasicCamera::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
break;
case kEventType::MouseMove:
if (m_draggingR)
canvas->m_pan = m_pan_start + (me->m_pos - m_dragR_start) * glm::vec2(-1, -1);
canvas->m_pan = m_pan_start + (me->m_pos - m_dragR_start) * glm::vec2(-1, -1) * (canvas->m_cam_fov / 85.f);
canvas->m_cam_rot = canvas->m_pan * 0.003f;
break;
case kEventType::MouseScroll:
@@ -56,7 +56,7 @@ void CanvasModeBasicCamera::on_GestureEvent(GestureEvent* ge)
m_camera_fov = canvas->m_cam_fov;
break;
case kEventType::GestureMove:
canvas->m_pan = m_pan_start + ge->m_pos_delta * glm::vec2(-1, -1) * 0.3f;
canvas->m_pan = m_pan_start + ge->m_pos_delta * glm::vec2(-1, -1) * 0.3f * (canvas->m_cam_fov / 85.f);
canvas->m_cam_fov = m_camera_fov - ge->m_distance_delta * .05f;
canvas->m_cam_rot = canvas->m_pan * 0.003f;
break;

View File

@@ -33,9 +33,6 @@ enum class kShader : uint16_t
Font = const_hash("font"),
Atlas = const_hash("atlas"),
Stroke = const_hash("stroke"),
StrokeLock = const_hash("stroke-lock"),
StrokeErase = const_hash("stroke-erase"),
StrokeLayer = const_hash("stroke-layer"),
Checkerboard= const_hash("checkerboard"),
Equirect = const_hash("equirect"),
};