pattern tweaks
This commit is contained in:
@@ -65,20 +65,20 @@
|
||||
|
||||
#define SHADER_FUNCTION_COLOR \
|
||||
"mediump vec3 brightness3(mediump vec3 c, mediump float val) {\n"\
|
||||
" return c + vec3(val * 2.0 - 1.0);\n"\
|
||||
" return clamp(c + vec3(val * 2.0 - 1.0), vec3(0), vec3(1));\n"\
|
||||
"}\n"\
|
||||
"mediump vec3 contrast3(mediump vec3 c, mediump float val) {\n"\
|
||||
" val = val * 2.0 - 1.0;\n"\
|
||||
" mediump float factor = ((259.0 / 255.0) * (val + 1.0)) / (1.0 * ((259.0 / 255.0) - val));\n"\
|
||||
" return factor * (c - 0.5) + 0.5;\n"\
|
||||
" return clamp(factor * (c - 0.5) + 0.5, vec3(0), vec3(1));\n"\
|
||||
"}\n"\
|
||||
"mediump float brightness1(mediump float c, mediump float val) {\n"\
|
||||
" return c + (val * 2.0 - 1.0);\n"\
|
||||
" return clamp(c + (val * 2.0 - 1.0), 0.0, 1.0);\n"\
|
||||
"}\n"\
|
||||
"mediump float contrast1(mediump float c, mediump float val) {\n"\
|
||||
" val = val * 2.0 - 1.0;\n"\
|
||||
" mediump float factor = ((259.0 / 255.0) * (val + 1.0)) / (1.0 * ((259.0 / 255.0) - val));\n"\
|
||||
" return factor * (c - 0.5) + 0.5;\n"\
|
||||
" return clamp(factor * (c - 0.5) + 0.5, 0.0, 1.0);\n"\
|
||||
"}\n"
|
||||
|
||||
// http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/
|
||||
@@ -236,23 +236,27 @@ void App::initShaders()
|
||||
"uniform sampler2D tex;\n"
|
||||
"uniform sampler2D tex_stroke;\n"
|
||||
"uniform sampler2D tex_mask;\n"
|
||||
"uniform sampler2D tex_dual;\n"
|
||||
"uniform sampler2D tex_pattern;\n"
|
||||
"uniform mediump float alpha;\n"
|
||||
"uniform mediump float stroke_alpha;\n"
|
||||
"uniform mediump float pattern_alpha;\n"
|
||||
"uniform mediump int blend_mode;\n"
|
||||
"uniform mediump int dual_blend_mode;\n"
|
||||
"uniform mediump vec2 resolution;\n"
|
||||
"uniform mediump vec2 pattern_scale;\n"
|
||||
"uniform mediump float pattern_bright;\n"
|
||||
"uniform mediump float pattern_contr;\n"
|
||||
"uniform mediump float dual_alpha;\n"
|
||||
"uniform bool lock;\n"
|
||||
"uniform bool mask;\n"
|
||||
"uniform bool fragUV2;\n"
|
||||
|
||||
"uniform bool use_dual;\n"
|
||||
"uniform sampler2D tex_dual;\n"
|
||||
"uniform mediump float dual_alpha;\n"
|
||||
"uniform mediump int dual_blend_mode;\n"
|
||||
|
||||
"uniform bool use_pattern;\n"
|
||||
"uniform sampler2D tex_pattern;\n"
|
||||
"uniform mediump float pattern_alpha;\n"
|
||||
"uniform mediump vec2 pattern_scale;\n"
|
||||
"uniform mediump float pattern_bright;\n"
|
||||
"uniform mediump float pattern_contr;\n"
|
||||
"uniform mediump vec2 pattern_offset;\n"
|
||||
|
||||
"in mediump vec2 uv;\n"
|
||||
"out mediump vec4 frag;\n"
|
||||
SHADER_FUNCTION_BLUR
|
||||
@@ -264,16 +268,16 @@ void App::initShaders()
|
||||
" mediump vec4 base = texture(tex, uv2);\n"
|
||||
" mediump vec4 stroke = texture(tex_stroke, uv);\n"
|
||||
" if (use_pattern){\n"
|
||||
" mediump float patt = texture(tex_pattern, uv2 * pattern_scale * 10.0).r;\n"
|
||||
" mediump vec2 rscale = resolution / vec2(512.0);\n"
|
||||
" mediump float patt = texture(tex_pattern, uv2 * (0.5 / pattern_scale) * rscale + pattern_offset).r;\n"
|
||||
" if (pattern_bright != 0.5)\n"
|
||||
" patt = brightness1(patt, pattern_bright);\n"
|
||||
" patt = brightness1(patt, 1.0 - pattern_bright);\n"
|
||||
" if (pattern_contr != 0.5)\n"
|
||||
" patt = contrast1(patt, pattern_contr);\n"
|
||||
" stroke.a = mix(stroke.a, stroke.a * patt, pattern_alpha);\n"
|
||||
" }\n"
|
||||
" if (use_dual){\n"
|
||||
" mediump vec4 dual = texture(tex_dual, uv);\n"
|
||||
//" stroke.a = stroke.a * dual.a;\n"
|
||||
" stroke.a = blend_stroke(stroke.a, dual.a * dual_alpha, dual_blend_mode);\n"
|
||||
" }\n"
|
||||
" stroke.a = mask ? stroke.a * stroke_alpha * blur(tex_mask, uv2).r : stroke.a * stroke_alpha;\n"
|
||||
@@ -418,17 +422,22 @@ void App::initShaders()
|
||||
SHADER_EXT_FB_FETCH
|
||||
"uniform mediump sampler2D tex;\n"
|
||||
"uniform mediump sampler2D tex_bg;\n"
|
||||
"uniform mediump sampler2D tex_pattern;\n"
|
||||
"uniform mediump sampler2D tex_mix;\n"
|
||||
"uniform mediump vec4 col;\n"
|
||||
"uniform mediump vec2 resolution;\n"
|
||||
"uniform mediump float alpha;\n"
|
||||
"uniform mediump float noise;\n"
|
||||
"uniform mediump vec2 pattern_offset;\n"
|
||||
"uniform mediump float pattern_alpha;\n"
|
||||
"uniform mediump float mix_alpha;\n"
|
||||
"uniform mediump float wet;\n"
|
||||
|
||||
"uniform bool use_pattern;\n"
|
||||
"uniform mediump sampler2D tex_pattern;\n"
|
||||
"uniform mediump float pattern_alpha;\n"
|
||||
"uniform mediump vec2 pattern_scale;\n"
|
||||
"uniform mediump float pattern_bright;\n"
|
||||
"uniform mediump float pattern_contr;\n"
|
||||
"uniform mediump vec2 pattern_offset;\n"
|
||||
|
||||
"in mediump vec2 uv;\n"
|
||||
"in mediump vec2 uv_2;\n"
|
||||
"in mediump float q;\n"
|
||||
@@ -438,11 +447,20 @@ void App::initShaders()
|
||||
" out mediump vec4 frag;\n"
|
||||
"#endif\n"
|
||||
SHADER_FUNCTION_RAND
|
||||
SHADER_FUNCTION_COLOR
|
||||
"void main() {\n"
|
||||
" mediump vec2 uv2 = gl_FragCoord.st / resolution;\n"
|
||||
" mediump float pattern = use_pattern ? 1.0 - (texture(tex_pattern, (uv2+pattern_offset) * 5.0).r) * pattern_alpha : 1.0;\n"
|
||||
" mediump float brush_alpha = ( 1.0 - texture(tex, uv/q).r ) * alpha;\n"
|
||||
" mediump vec4 fg = vec4(col.rgb, brush_alpha * pattern);\n"
|
||||
" mediump vec4 fg = vec4(col.rgb, brush_alpha);\n"
|
||||
" if (use_pattern){\n"
|
||||
" mediump vec2 rscale = resolution / vec2(512.0);\n"
|
||||
" mediump float patt = texture(tex_pattern, uv2 * (0.5 / pattern_scale) * rscale + pattern_offset).r;\n"
|
||||
" if (pattern_bright != 0.5)\n"
|
||||
" patt = brightness1(patt, 1.0 - pattern_bright);\n"
|
||||
" if (pattern_contr != 0.5)\n"
|
||||
" patt = contrast1(patt, pattern_contr);\n"
|
||||
" fg.a = mix(fg.a, fg.a * patt, pattern_alpha);\n"
|
||||
" }\n"
|
||||
"#if defined(GL_EXT_shader_framebuffer_fetch)\n"
|
||||
" mediump vec4 bg = frag;\n"
|
||||
"#elif defined(GL_ARM_shader_framebuffer_fetch)\n"
|
||||
@@ -464,9 +482,6 @@ void App::initShaders()
|
||||
" mediump vec4 frag_wet = vec4(rgb, max(bg.a, fg.a * 1.2));\n"
|
||||
" mediump vec4 frag_dry = vec4(rgb, alpha_tot);\n"
|
||||
" frag = mix(frag_dry, frag_wet, wet);\n"
|
||||
|
||||
// " mediump vec4 mbg = texture(tex_mix, uv_2 / q);\n"
|
||||
// " frag.rgb = mix(frag.rgb, mbg.rgb, mix_alpha * mbg.a);\n"
|
||||
"}\n";
|
||||
|
||||
static const char* shader_checkerboard_v =
|
||||
|
||||
@@ -106,6 +106,7 @@ void App::vr_draw(const glm::mat4& proj, const glm::mat4& camera, const glm::mat
|
||||
ShaderManager::u_vec2(kShaderUniform::PatternScale, glm::vec2(b->m_pattern_scale));
|
||||
ShaderManager::u_float(kShaderUniform::PatternBright, b->m_pattern_brightness);
|
||||
ShaderManager::u_float(kShaderUniform::PatternContrast, b->m_pattern_contrast);
|
||||
ShaderManager::u_vec2(kShaderUniform::PatternOffset, Canvas::I->m_pattern_offset);
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
canvas->m_canvas->m_layers[layer_index].m_rtt[plane_index].bindTexture();
|
||||
|
||||
@@ -246,7 +246,7 @@ void Canvas::stroke_draw_mix(const glm::vec2& bb_min, const glm::vec2& bb_sz)
|
||||
//ShaderManager::u_int(kShaderUniform::TexA, 0);
|
||||
ShaderManager::u_int(kShaderUniform::TexStroke, 1);
|
||||
ShaderManager::u_int(kShaderUniform::TexMask, 2);
|
||||
//ShaderManager::u_vec2(kShaderUniform::Resolution, m_size);
|
||||
ShaderManager::u_vec2(kShaderUniform::Resolution, m_size);
|
||||
ShaderManager::u_int(kShaderUniform::TexPattern, 3);
|
||||
ShaderManager::u_float(kShaderUniform::StrokeAlpha, b->m_tip_opacity);
|
||||
ShaderManager::u_float(kShaderUniform::PatternAlpha, b->m_pattern_opacity);
|
||||
@@ -493,8 +493,11 @@ void Canvas::stroke_draw()
|
||||
ShaderManager::u_int(kShaderUniform::TexMix, 3); // mixer
|
||||
//ShaderManager::u_int(kShaderUniform::TexMixA, 4); // mixer
|
||||
ShaderManager::u_vec2(kShaderUniform::Resolution, { m_width, m_height });
|
||||
ShaderManager::u_vec2(kShaderUniform::PatternOffset, stencil_offset);
|
||||
ShaderManager::u_float(kShaderUniform::PatternAlpha, brush->m_pattern_opacity);
|
||||
ShaderManager::u_vec2(kShaderUniform::PatternScale, glm::vec2(brush->m_pattern_scale));
|
||||
ShaderManager::u_float(kShaderUniform::PatternBright, brush->m_pattern_brightness);
|
||||
ShaderManager::u_float(kShaderUniform::PatternContrast, brush->m_pattern_contrast);
|
||||
ShaderManager::u_vec2(kShaderUniform::PatternOffset, m_pattern_offset);
|
||||
ShaderManager::u_int(kShaderUniform::UsePattern, brush->m_pattern_enabled && brush->m_pattern_eachsample);
|
||||
ShaderManager::u_float(kShaderUniform::MixAlpha, brush->m_tip_mix);
|
||||
ShaderManager::u_float(kShaderUniform::Wet, brush->m_tip_wet);
|
||||
@@ -787,7 +790,7 @@ void Canvas::stroke_commit()
|
||||
ShaderManager::u_int(kShaderUniform::TexMask, 2);
|
||||
ShaderManager::u_int(kShaderUniform::TexDual, 3);
|
||||
ShaderManager::u_int(kShaderUniform::TexPattern, 4);
|
||||
//ShaderManager::u_vec2(kShaderUniform::Resolution, m_size);
|
||||
ShaderManager::u_vec2(kShaderUniform::Resolution, m_size);
|
||||
ShaderManager::u_float(kShaderUniform::StrokeAlpha, b->m_tip_opacity);
|
||||
ShaderManager::u_float(kShaderUniform::PatternAlpha, b->m_pattern_opacity);
|
||||
ShaderManager::u_float(kShaderUniform::Alpha, 1);
|
||||
@@ -801,6 +804,7 @@ void Canvas::stroke_commit()
|
||||
ShaderManager::u_vec2(kShaderUniform::PatternScale, glm::vec2(b->m_pattern_scale));
|
||||
ShaderManager::u_float(kShaderUniform::PatternBright, b->m_pattern_brightness);
|
||||
ShaderManager::u_float(kShaderUniform::PatternContrast, b->m_pattern_contrast);
|
||||
ShaderManager::u_vec2(kShaderUniform::PatternOffset, m_pattern_offset);
|
||||
ShaderManager::u_float(kShaderUniform::DualAlpha, b->m_dual_opacity);
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
@@ -875,7 +879,7 @@ void Canvas::stroke_start(glm::vec3 point, float pressure)
|
||||
m_commit_delayed = false;
|
||||
}
|
||||
|
||||
stencil_offset = glm::vec2((rand()%1000)*0.001f, (rand()%1000)*0.001f);
|
||||
m_pattern_offset = glm::vec2((rand()%1000)*0.001f, (rand()%1000)*0.001f);
|
||||
|
||||
m_current_stroke = std::make_unique<Stroke>();
|
||||
m_current_stroke->m_camera.rot = m_cam_rot;
|
||||
@@ -1002,7 +1006,7 @@ void Canvas::layer_merge(int source_idx, int dest_idx) // m_layer index
|
||||
ShaderManager::use(kShader::CompDraw);
|
||||
ShaderManager::u_int(kShaderUniform::Tex, 0); // dest
|
||||
ShaderManager::u_int(kShaderUniform::TexStroke, 1); // source
|
||||
//ShaderManager::u_vec2(kShaderUniform::Resolution, m_size);
|
||||
ShaderManager::u_vec2(kShaderUniform::Resolution, m_size);
|
||||
ShaderManager::u_int(kShaderUniform::UseFragCoordUV2, false);
|
||||
ShaderManager::u_float(kShaderUniform::StrokeAlpha, 1);
|
||||
ShaderManager::u_float(kShaderUniform::PatternAlpha, 0);
|
||||
|
||||
@@ -185,7 +185,7 @@ public:
|
||||
static glm::vec3 m_plane_normal[6];
|
||||
static glm::vec3 m_plane_tangent[6];
|
||||
static glm::mat4 m_plane_transform[6];
|
||||
glm::vec2 stencil_offset;
|
||||
glm::vec2 m_pattern_offset;
|
||||
Sampler m_sampler;
|
||||
Sampler m_sampler_nearest;
|
||||
Sampler m_sampler_linear;
|
||||
|
||||
@@ -1157,7 +1157,7 @@ void CanvasModeTransform::leave()
|
||||
ShaderManager::u_float(kShaderUniform::StrokeAlpha, 1);
|
||||
ShaderManager::u_int(kShaderUniform::Lock, false);
|
||||
ShaderManager::u_int(kShaderUniform::Mask, false);
|
||||
ShaderManager::u_int(kShaderUniform::UseFragCoordUV2, true);
|
||||
ShaderManager::u_int(kShaderUniform::UseFragCoordUV2, false);
|
||||
ShaderManager::u_vec2(kShaderUniform::Resolution, Canvas::I->m_size);
|
||||
ShaderManager::u_int(kShaderUniform::BlendMode, 0);
|
||||
ShaderManager::u_int(kShaderUniform::UseDual, false);
|
||||
|
||||
@@ -209,7 +209,7 @@ void NodeCanvas::draw()
|
||||
ShaderManager::u_int(kShaderUniform::TexStroke, 1);
|
||||
ShaderManager::u_int(kShaderUniform::TexMask, 2);
|
||||
ShaderManager::u_int(kShaderUniform::TexDual, 3);
|
||||
//ShaderManager::u_vec2(kShaderUniform::Resolution, zw(m_canvas->m_box) / zoom);
|
||||
ShaderManager::u_vec2(kShaderUniform::Resolution, Canvas::I->m_size);
|
||||
ShaderManager::u_int(kShaderUniform::TexPattern, 4);
|
||||
ShaderManager::u_float(kShaderUniform::StrokeAlpha, b->m_tip_opacity);
|
||||
ShaderManager::u_float(kShaderUniform::PatternAlpha, b->m_pattern_opacity);
|
||||
@@ -225,6 +225,7 @@ void NodeCanvas::draw()
|
||||
ShaderManager::u_vec2(kShaderUniform::PatternScale, glm::vec2(b->m_pattern_scale));
|
||||
ShaderManager::u_float(kShaderUniform::PatternBright, b->m_pattern_brightness);
|
||||
ShaderManager::u_float(kShaderUniform::PatternContrast, b->m_pattern_contrast);
|
||||
ShaderManager::u_vec2(kShaderUniform::PatternOffset, Canvas::I->m_pattern_offset);
|
||||
ShaderManager::u_float(kShaderUniform::DualAlpha, b->m_dual_opacity);
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
|
||||
@@ -76,7 +76,7 @@ void NodeStrokePreview::stroke_draw_mix(const glm::vec2& bb_min, const glm::vec2
|
||||
ShaderManager::u_int(kShaderUniform::TexMask, 2);
|
||||
ShaderManager::u_int(kShaderUniform::TexDual, 3);
|
||||
ShaderManager::u_int(kShaderUniform::TexPattern, 4);
|
||||
//ShaderManager::u_vec2(kShaderUniform::Resolution, m_size);
|
||||
ShaderManager::u_vec2(kShaderUniform::Resolution, m_size);
|
||||
ShaderManager::u_float(kShaderUniform::StrokeAlpha, b->m_tip_opacity);
|
||||
ShaderManager::u_float(kShaderUniform::PatternAlpha, b->m_pattern_opacity);
|
||||
ShaderManager::u_float(kShaderUniform::Alpha, 1);
|
||||
@@ -91,6 +91,7 @@ void NodeStrokePreview::stroke_draw_mix(const glm::vec2& bb_min, const glm::vec2
|
||||
ShaderManager::u_vec2(kShaderUniform::PatternScale, glm::vec2(b->m_pattern_scale));
|
||||
ShaderManager::u_float(kShaderUniform::PatternBright, b->m_pattern_brightness);
|
||||
ShaderManager::u_float(kShaderUniform::PatternContrast, b->m_pattern_contrast);
|
||||
ShaderManager::u_vec2(kShaderUniform::PatternOffset, glm::vec2(0));
|
||||
ShaderManager::u_float(kShaderUniform::DualAlpha, b->m_dual_opacity);
|
||||
|
||||
m_sampler_linear.bind(0);
|
||||
@@ -288,8 +289,11 @@ void NodeStrokePreview::draw_stroke()
|
||||
ShaderManager::u_int(kShaderUniform::TexMix, 3); // mixer
|
||||
//ShaderManager::u_int(kShaderUniform::TexMixA, 4); // mixer
|
||||
ShaderManager::u_vec2(kShaderUniform::Resolution, size);
|
||||
ShaderManager::u_vec2(kShaderUniform::PatternOffset, glm::vec2(0));
|
||||
ShaderManager::u_float(kShaderUniform::PatternAlpha, b->m_pattern_opacity);
|
||||
ShaderManager::u_vec2(kShaderUniform::PatternScale, glm::vec2(b->m_pattern_scale));
|
||||
ShaderManager::u_float(kShaderUniform::PatternBright, b->m_pattern_brightness);
|
||||
ShaderManager::u_float(kShaderUniform::PatternContrast, b->m_pattern_contrast);
|
||||
ShaderManager::u_vec2(kShaderUniform::PatternOffset, glm::vec2(0));
|
||||
ShaderManager::u_int(kShaderUniform::UsePattern, b->m_pattern_enabled && b->m_pattern_eachsample);
|
||||
ShaderManager::u_mat4(kShaderUniform::MVP, ortho_proj);
|
||||
|
||||
@@ -378,7 +382,7 @@ void NodeStrokePreview::draw_stroke()
|
||||
ShaderManager::u_int(kShaderUniform::TexMask, 2);
|
||||
ShaderManager::u_int(kShaderUniform::TexDual, 3);
|
||||
ShaderManager::u_int(kShaderUniform::TexPattern, 4);
|
||||
//ShaderManager::u_vec2(kShaderUniform::Resolution, m_size);
|
||||
ShaderManager::u_vec2(kShaderUniform::Resolution, size);
|
||||
ShaderManager::u_float(kShaderUniform::StrokeAlpha, b->m_tip_opacity);
|
||||
ShaderManager::u_float(kShaderUniform::PatternAlpha, b->m_pattern_opacity);
|
||||
ShaderManager::u_float(kShaderUniform::Alpha, 1);
|
||||
@@ -392,6 +396,7 @@ void NodeStrokePreview::draw_stroke()
|
||||
ShaderManager::u_vec2(kShaderUniform::PatternScale, glm::vec2(b->m_pattern_scale));
|
||||
ShaderManager::u_float(kShaderUniform::PatternBright, b->m_pattern_brightness);
|
||||
ShaderManager::u_float(kShaderUniform::PatternContrast, b->m_pattern_contrast);
|
||||
ShaderManager::u_vec2(kShaderUniform::PatternOffset, glm::vec2(0));
|
||||
ShaderManager::u_float(kShaderUniform::DualAlpha, b->m_dual_opacity);
|
||||
|
||||
m_sampler_linear.bind(0);
|
||||
|
||||
Reference in New Issue
Block a user