gl_engine: implement darken and lighten mask method

Add new shader to support darken and lighten mask method.
This commit is contained in:
RuiwenTang 2024-09-30 21:01:49 +08:00 committed by Hermet Park
parent 2238109ada
commit 894ecd7461
4 changed files with 48 additions and 0 deletions

View file

@ -99,6 +99,8 @@ void GlRenderer::initShaders()
mPrograms.push_back(make_unique<GlProgram>(GlShader::gen(MASK_VERT_SHADER, MASK_SUB_FRAG_SHADER))); mPrograms.push_back(make_unique<GlProgram>(GlShader::gen(MASK_VERT_SHADER, MASK_SUB_FRAG_SHADER)));
mPrograms.push_back(make_unique<GlProgram>(GlShader::gen(MASK_VERT_SHADER, MASK_INTERSECT_FRAG_SHADER))); mPrograms.push_back(make_unique<GlProgram>(GlShader::gen(MASK_VERT_SHADER, MASK_INTERSECT_FRAG_SHADER)));
mPrograms.push_back(make_unique<GlProgram>(GlShader::gen(MASK_VERT_SHADER, MASK_DIFF_FRAG_SHADER))); mPrograms.push_back(make_unique<GlProgram>(GlShader::gen(MASK_VERT_SHADER, MASK_DIFF_FRAG_SHADER)));
mPrograms.push_back(make_unique<GlProgram>(GlShader::gen(MASK_VERT_SHADER, MASK_LIGHTEN_FRAG_SHADER)));
mPrograms.push_back(make_unique<GlProgram>(GlShader::gen(MASK_VERT_SHADER, MASK_DARKEN_FRAG_SHADER)));
// stencil Renderer // stencil Renderer
mPrograms.push_back(make_unique<GlProgram>(GlShader::gen(STENCIL_VERT_SHADER, STENCIL_FRAG_SHADER))); mPrograms.push_back(make_unique<GlProgram>(GlShader::gen(STENCIL_VERT_SHADER, STENCIL_FRAG_SHADER)));
// blit Renderer // blit Renderer
@ -797,6 +799,12 @@ void GlRenderer::endRenderPass(RenderCompositor* cmp)
case CompositeMethod::DifferenceMask: case CompositeMethod::DifferenceMask:
program = mPrograms[RT_MaskDifference].get(); program = mPrograms[RT_MaskDifference].get();
break; break;
case CompositeMethod::LightenMask:
program = mPrograms[RT_MaskLighten].get();
break;
case CompositeMethod::DarkenMask:
program = mPrograms[RT_MaskDarken].get();
break;
default: default:
break; break;
} }

View file

@ -47,6 +47,8 @@ public:
RT_MaskSub, RT_MaskSub,
RT_MaskIntersect, RT_MaskIntersect,
RT_MaskDifference, RT_MaskDifference,
RT_MaskLighten,
RT_MaskDarken,
RT_Stencil, RT_Stencil,
RT_Blit, RT_Blit,
RT_MultiplyBlend, RT_MultiplyBlend,

View file

@ -473,6 +473,42 @@ void main() { \n
} \n } \n
); );
const char* MASK_DARKEN_FRAG_SHADER = TVG_COMPOSE_SHADER(
uniform sampler2D uSrcTexture; \n
uniform sampler2D uMaskTexture; \n
\n
in vec2 vUV; \n
\n
out vec4 FragColor; \n
\n
void main() { \n
vec4 srcColor = texture(uSrcTexture, vUV); \n
vec4 maskColor = texture(uMaskTexture, vUV); \n
if (srcColor.a > 0.0) srcColor.rgb /= srcColor.a; \n
float alpha = min(srcColor.a, maskColor.a); \n
\n
FragColor = vec4(srcColor.rgb * alpha, alpha); \n
} \n
);
const char* MASK_LIGHTEN_FRAG_SHADER = TVG_COMPOSE_SHADER(
uniform sampler2D uSrcTexture; \n
uniform sampler2D uMaskTexture; \n
\n
in vec2 vUV; \n
\n
out vec4 FragColor; \n
\n
void main() { \n
vec4 srcColor = texture(uSrcTexture, vUV); \n
vec4 maskColor = texture(uMaskTexture, vUV); \n
if (srcColor.a > 0.0) srcColor.rgb /= srcColor.a; \n
float alpha = max(srcColor.a, maskColor.a); \n
\n
FragColor = vec4(srcColor.rgb * alpha, alpha); \n
} \n
);
const char* STENCIL_VERT_SHADER = TVG_COMPOSE_SHADER( const char* STENCIL_VERT_SHADER = TVG_COMPOSE_SHADER(
uniform float uDepth; \n uniform float uDepth; \n
layout(location = 0) in vec2 aLocation; \n layout(location = 0) in vec2 aLocation; \n

View file

@ -39,6 +39,8 @@ extern const char* MASK_ADD_FRAG_SHADER;
extern const char* MASK_SUB_FRAG_SHADER; extern const char* MASK_SUB_FRAG_SHADER;
extern const char* MASK_INTERSECT_FRAG_SHADER; extern const char* MASK_INTERSECT_FRAG_SHADER;
extern const char* MASK_DIFF_FRAG_SHADER; extern const char* MASK_DIFF_FRAG_SHADER;
extern const char* MASK_DARKEN_FRAG_SHADER;
extern const char* MASK_LIGHTEN_FRAG_SHADER;
extern const char* STENCIL_VERT_SHADER; extern const char* STENCIL_VERT_SHADER;
extern const char* STENCIL_FRAG_SHADER; extern const char* STENCIL_FRAG_SHADER;
extern const char* BLIT_VERT_SHADER; extern const char* BLIT_VERT_SHADER;