| Index: cc/output/shader.cc
|
| diff --git a/cc/output/shader.cc b/cc/output/shader.cc
|
| index 1a7332d9f2ee42c34423b46bf212464bcaed2c1b..ee0e6a7ae30087f86fa1a6d533f2470ac97d2d7d 100644
|
| --- a/cc/output/shader.cc
|
| +++ b/cc/output/shader.cc
|
| @@ -770,6 +770,9 @@ FragmentShaderBase::FragmentShaderBase() {}
|
|
|
| std::string FragmentShaderBase::GetShaderString(TexCoordPrecision precision,
|
| SamplerType sampler) const {
|
| + // The AA shader values will use TexCoordPrecision.
|
| + if (has_aa_ && precision == TEX_COORD_PRECISION_NA)
|
| + precision = TEX_COORD_PRECISION_MEDIUM;
|
| return SetFragmentTexCoordPrecision(
|
| precision, SetFragmentSamplerType(
|
| sampler, SetBlendModeFunctions(GetShaderSource())));
|
| @@ -794,16 +797,20 @@ void FragmentShaderBase::Init(GLES2Interface* context,
|
| uniforms.push_back("colorMatrix");
|
| uniforms.push_back("colorOffset");
|
| }
|
| - if (has_sampler_)
|
| - uniforms.push_back("s_texture");
|
| if (has_uniform_alpha_)
|
| uniforms.push_back("alpha");
|
| if (has_background_color_)
|
| uniforms.push_back("background_color");
|
| - if (has_fragment_tex_transform_)
|
| - uniforms.push_back("fragmentTexTransform");
|
| - if (has_uniform_color_)
|
| - uniforms.push_back("color");
|
| + switch (input_color_type_) {
|
| + case INPUT_COLOR_SOURCE_RGBA_TEXTURE:
|
| + uniforms.push_back("s_texture");
|
| + if (has_rgba_fragment_tex_transform_)
|
| + uniforms.push_back("fragmentTexTransform");
|
| + break;
|
| + case INPUT_COLOR_SOURCE_UNIFORM:
|
| + uniforms.push_back("color");
|
| + break;
|
| + }
|
|
|
| locations.resize(uniforms.size());
|
|
|
| @@ -825,16 +832,20 @@ void FragmentShaderBase::Init(GLES2Interface* context,
|
| color_matrix_location_ = locations[index++];
|
| color_offset_location_ = locations[index++];
|
| }
|
| - if (has_sampler_)
|
| - sampler_location_ = locations[index++];
|
| if (has_uniform_alpha_)
|
| alpha_location_ = locations[index++];
|
| if (has_background_color_)
|
| background_color_location_ = locations[index++];
|
| - if (has_fragment_tex_transform_)
|
| - fragment_tex_transform_location_ = locations[index++];
|
| - if (has_uniform_color_)
|
| - color_location_ = locations[index++];
|
| + switch (input_color_type_) {
|
| + case INPUT_COLOR_SOURCE_RGBA_TEXTURE:
|
| + sampler_location_ = locations[index++];
|
| + if (has_rgba_fragment_tex_transform_)
|
| + fragment_tex_transform_location_ = locations[index++];
|
| + break;
|
| + case INPUT_COLOR_SOURCE_UNIFORM:
|
| + color_location_ = locations[index++];
|
| + break;
|
| + }
|
| DCHECK_EQ(index, locations.size());
|
| }
|
|
|
| @@ -854,10 +865,15 @@ void FragmentShaderBase::FillLocations(ShaderLocations* locations) const {
|
| locations->color_matrix = color_matrix_location_;
|
| locations->color_offset = color_offset_location_;
|
| }
|
| - if (has_sampler_)
|
| - locations->sampler = sampler_location_;
|
| if (has_uniform_alpha_)
|
| locations->alpha = alpha_location_;
|
| + switch (input_color_type_) {
|
| + case INPUT_COLOR_SOURCE_RGBA_TEXTURE:
|
| + locations->sampler = sampler_location_;
|
| + break;
|
| + case INPUT_COLOR_SOURCE_UNIFORM:
|
| + break;
|
| + }
|
| }
|
|
|
| std::string FragmentShaderBase::SetBlendModeFunctions(
|
| @@ -1155,334 +1171,152 @@ std::string FragmentShaderBase::GetBlendFunctionBodyForRGB() const {
|
| return "result = vec4(1.0, 0.0, 0.0, 1.0);";
|
| }
|
|
|
| -std::string FragmentShaderRGBATexAlpha::GetShaderSource() const {
|
| - return SHADER0([]() {
|
| - precision mediump float;
|
| - varying TexCoordPrecision vec2 v_texCoord;
|
| - uniform SamplerType s_texture;
|
| - uniform float alpha;
|
| - void main() {
|
| - vec4 texColor = TextureLookup(s_texture, v_texCoord);
|
| - gl_FragColor = ApplyBlendMode(texColor * alpha, 0.0);
|
| - }
|
| - });
|
| -}
|
| -
|
| -std::string FragmentShaderRGBATexColorMatrixAlpha::GetShaderSource() const {
|
| - return SHADER0([]() {
|
| - precision mediump float;
|
| - varying TexCoordPrecision vec2 v_texCoord;
|
| - uniform SamplerType s_texture;
|
| - uniform float alpha;
|
| - uniform mat4 colorMatrix;
|
| - uniform vec4 colorOffset;
|
| - void main() {
|
| - vec4 texColor = TextureLookup(s_texture, v_texCoord);
|
| - float nonZeroAlpha = max(texColor.a, 0.00001);
|
| - texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha);
|
| - texColor = colorMatrix * texColor + colorOffset;
|
| - texColor.rgb *= texColor.a;
|
| - texColor = clamp(texColor, 0.0, 1.0);
|
| - gl_FragColor = ApplyBlendMode(texColor * alpha, 0.0);
|
| - }
|
| - });
|
| -}
|
| -
|
| -std::string FragmentShaderRGBATexVaryingAlpha::GetShaderSource() const {
|
| - return SHADER0([]() {
|
| - precision mediump float;
|
| - varying TexCoordPrecision vec2 v_texCoord;
|
| - varying float v_alpha;
|
| - uniform SamplerType s_texture;
|
| - void main() {
|
| - vec4 texColor = TextureLookup(s_texture, v_texCoord);
|
| - gl_FragColor = texColor * v_alpha;
|
| - }
|
| - });
|
| -}
|
| -
|
| -std::string FragmentShaderRGBATexPremultiplyAlpha::GetShaderSource() const {
|
| - return SHADER0([]() {
|
| - precision mediump float;
|
| - varying TexCoordPrecision vec2 v_texCoord;
|
| - varying float v_alpha;
|
| - uniform SamplerType s_texture;
|
| - void main() {
|
| - vec4 texColor = TextureLookup(s_texture, v_texCoord);
|
| - texColor.rgb *= texColor.a;
|
| - gl_FragColor = texColor * v_alpha;
|
| - }
|
| - });
|
| -}
|
| -
|
| -std::string FragmentShaderTexBackgroundVaryingAlpha::GetShaderSource() const {
|
| - return SHADER0([]() {
|
| - precision mediump float;
|
| - varying TexCoordPrecision vec2 v_texCoord;
|
| - varying float v_alpha;
|
| - uniform vec4 background_color;
|
| - uniform SamplerType s_texture;
|
| - void main() {
|
| - vec4 texColor = TextureLookup(s_texture, v_texCoord);
|
| - texColor += background_color * (1.0 - texColor.a);
|
| - gl_FragColor = texColor * v_alpha;
|
| - }
|
| - });
|
| -}
|
| -
|
| -std::string FragmentShaderTexBackgroundPremultiplyAlpha::GetShaderSource()
|
| - const {
|
| - return SHADER0([]() {
|
| - precision mediump float;
|
| - varying TexCoordPrecision vec2 v_texCoord;
|
| - varying float v_alpha;
|
| - uniform vec4 background_color;
|
| - uniform SamplerType s_texture;
|
| - void main() {
|
| - vec4 texColor = TextureLookup(s_texture, v_texCoord);
|
| - texColor.rgb *= texColor.a;
|
| - texColor += background_color * (1.0 - texColor.a);
|
| - gl_FragColor = texColor * v_alpha;
|
| - }
|
| - });
|
| -}
|
| -
|
| -std::string FragmentShaderRGBATexOpaque::GetShaderSource() const {
|
| - return SHADER0([]() {
|
| - precision mediump float;
|
| - varying TexCoordPrecision vec2 v_texCoord;
|
| - uniform SamplerType s_texture;
|
| - void main() {
|
| - vec4 texColor = TextureLookup(s_texture, v_texCoord);
|
| - gl_FragColor = vec4(texColor.rgb, 1.0);
|
| - }
|
| - });
|
| -}
|
| -
|
| -std::string FragmentShaderRGBATex::GetShaderSource() const {
|
| - return SHADER0([]() {
|
| - precision mediump float;
|
| - varying TexCoordPrecision vec2 v_texCoord;
|
| - uniform SamplerType s_texture;
|
| - void main() { gl_FragColor = TextureLookup(s_texture, v_texCoord); }
|
| - });
|
| -}
|
| +std::string FragmentShaderBase::GetShaderSource() const {
|
| + std::string header = "precision mediump float;\n";
|
| + std::string source = "void main() {\n";
|
| +
|
| +#define HDR(x) \
|
| + do { \
|
| + header += x + std::string("\n"); \
|
| + } while (0)
|
| +#define SRC(x) \
|
| + do { \
|
| + source += std::string(" ") + x + std::string("\n"); \
|
| + } while (0)
|
| +
|
| + // Read the input into vec4 texColor.
|
| + switch (input_color_type_) {
|
| + case INPUT_COLOR_SOURCE_RGBA_TEXTURE:
|
| + if (ignore_sampler_type_)
|
| + HDR("uniform sampler2D s_texture;");
|
| + else
|
| + HDR("uniform SamplerType s_texture;");
|
| + HDR("varying TexCoordPrecision vec2 v_texCoord;");
|
| + if (has_rgba_fragment_tex_transform_) {
|
| + HDR("uniform TexCoordPrecision vec4 fragmentTexTransform;");
|
| + SRC("// Transformed texture lookup");
|
| + SRC("TexCoordPrecision vec2 texCoord =");
|
| + SRC(" clamp(v_texCoord, 0.0, 1.0) * fragmentTexTransform.zw +");
|
| + SRC(" fragmentTexTransform.xy;");
|
| + SRC("vec4 texColor = TextureLookup(s_texture, texCoord);");
|
| + DCHECK(!ignore_sampler_type_);
|
| + } else {
|
| + SRC("// Texture lookup");
|
| + if (ignore_sampler_type_)
|
| + SRC("vec4 texColor = texture2D(s_texture, v_texCoord);");
|
| + else
|
| + SRC("vec4 texColor = TextureLookup(s_texture, v_texCoord);");
|
| + }
|
| + break;
|
| + case INPUT_COLOR_SOURCE_UNIFORM:
|
| + DCHECK(!ignore_sampler_type_);
|
| + DCHECK(!has_rgba_fragment_tex_transform_);
|
| + HDR("uniform vec4 color;");
|
| + SRC("// Uniform color");
|
| + SRC("vec4 texColor = color;");
|
| + break;
|
| + }
|
| + // Apply the color matrix to texColor.
|
| + if (has_color_matrix_) {
|
| + HDR("uniform mat4 colorMatrix;");
|
| + HDR("uniform vec4 colorOffset;");
|
| + SRC("// Apply color matrix");
|
| + SRC("float nonZeroAlpha = max(texColor.a, 0.00001);");
|
| + SRC("texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha);");
|
| + SRC("texColor = colorMatrix * texColor + colorOffset;");
|
| + SRC("texColor.rgb *= texColor.a;");
|
| + SRC("texColor = clamp(texColor, 0.0, 1.0);");
|
| + }
|
|
|
| -std::string FragmentShaderRGBATexSwizzleAlpha::GetShaderSource() const {
|
| - return SHADER0([]() {
|
| - precision mediump float;
|
| - varying TexCoordPrecision vec2 v_texCoord;
|
| - uniform SamplerType s_texture;
|
| - uniform float alpha;
|
| - void main() {
|
| - vec4 texColor = TextureLookup(s_texture, v_texCoord);
|
| - gl_FragColor =
|
| - vec4(texColor.z, texColor.y, texColor.x, texColor.w) * alpha;
|
| - }
|
| - });
|
| -}
|
| + // Read the mask texture.
|
| + if (has_mask_sampler_) {
|
| + HDR("uniform SamplerType s_mask;");
|
| + HDR("uniform vec2 maskTexCoordScale;");
|
| + HDR("uniform vec2 maskTexCoordOffset;");
|
| + SRC("// Read the mask");
|
| + SRC("TexCoordPrecision vec2 maskTexCoord =");
|
| + SRC(" vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x,");
|
| + SRC(" maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y);");
|
| + SRC("vec4 maskColor = TextureLookup(s_mask, maskTexCoord);");
|
| + }
|
|
|
| -std::string FragmentShaderRGBATexSwizzleOpaque::GetShaderSource() const {
|
| - return SHADER0([]() {
|
| - precision mediump float;
|
| - varying TexCoordPrecision vec2 v_texCoord;
|
| - uniform SamplerType s_texture;
|
| - void main() {
|
| - vec4 texColor = TextureLookup(s_texture, v_texCoord);
|
| - gl_FragColor = vec4(texColor.z, texColor.y, texColor.x, 1.0);
|
| - }
|
| - });
|
| -}
|
| + // Compute AA.
|
| + if (has_aa_) {
|
| + HDR("varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances.");
|
| + SRC("// Compute AA");
|
| + SRC("vec4 d4 = min(edge_dist[0], edge_dist[1]);");
|
| + SRC("vec2 d2 = min(d4.xz, d4.yw);");
|
| + SRC("float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0);");
|
| + }
|
|
|
| -std::string FragmentShaderRGBATexAlphaAA::GetShaderSource() const {
|
| - return SHADER0([]() {
|
| - precision mediump float;
|
| - uniform SamplerType s_texture;
|
| - uniform float alpha;
|
| - varying TexCoordPrecision vec2 v_texCoord;
|
| - varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances.
|
| - void main() {
|
| - vec4 texColor = TextureLookup(s_texture, v_texCoord);
|
| - vec4 d4 = min(edge_dist[0], edge_dist[1]);
|
| - vec2 d2 = min(d4.xz, d4.yw);
|
| - float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0);
|
| - gl_FragColor = ApplyBlendMode(texColor * alpha * aa, 0.0);
|
| - }
|
| - });
|
| -}
|
| + // Premultiply by alpha.
|
| + if (has_premultiply_alpha_) {
|
| + SRC("// Premultiply alpha");
|
| + SRC("texColor.rgb *= texColor.a;");
|
| + }
|
|
|
| -std::string FragmentShaderRGBATexClampAlphaAA::GetShaderSource() const {
|
| - return SHADER0([]() {
|
| - precision mediump float;
|
| - uniform SamplerType s_texture;
|
| - uniform float alpha;
|
| - uniform TexCoordPrecision vec4 fragmentTexTransform;
|
| - varying TexCoordPrecision vec2 v_texCoord;
|
| - varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances.
|
| - void main() {
|
| - TexCoordPrecision vec2 texCoord =
|
| - clamp(v_texCoord, 0.0, 1.0) * fragmentTexTransform.zw +
|
| - fragmentTexTransform.xy;
|
| - vec4 texColor = TextureLookup(s_texture, texCoord);
|
| - vec4 d4 = min(edge_dist[0], edge_dist[1]);
|
| - vec2 d2 = min(d4.xz, d4.yw);
|
| - float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0);
|
| - gl_FragColor = texColor * alpha * aa;
|
| - }
|
| - });
|
| -}
|
| + // Apply background texture.
|
| + if (has_background_color_) {
|
| + HDR("uniform vec4 background_color;");
|
| + SRC("// Apply uniform background color blending");
|
| + SRC("texColor += background_color * (1.0 - texColor.a);");
|
| + }
|
|
|
| -std::string FragmentShaderRGBATexClampSwizzleAlphaAA::GetShaderSource() const {
|
| - return SHADER0([]() {
|
| - precision mediump float;
|
| - uniform SamplerType s_texture;
|
| - uniform float alpha;
|
| - uniform TexCoordPrecision vec4 fragmentTexTransform;
|
| - varying TexCoordPrecision vec2 v_texCoord;
|
| - varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances.
|
| - void main() {
|
| - TexCoordPrecision vec2 texCoord =
|
| - clamp(v_texCoord, 0.0, 1.0) * fragmentTexTransform.zw +
|
| - fragmentTexTransform.xy;
|
| - vec4 texColor = TextureLookup(s_texture, texCoord);
|
| - vec4 d4 = min(edge_dist[0], edge_dist[1]);
|
| - vec2 d2 = min(d4.xz, d4.yw);
|
| - float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0);
|
| - gl_FragColor =
|
| - vec4(texColor.z, texColor.y, texColor.x, texColor.w) * alpha * aa;
|
| - }
|
| - });
|
| -}
|
| + // Apply swizzle.
|
| + if (has_swizzle_) {
|
| + SRC("// Apply swizzle");
|
| + SRC("texColor = texColor.bgra;\n");
|
| + }
|
|
|
| -std::string FragmentShaderRGBATexAlphaMask::GetShaderSource() const {
|
| - return SHADER0([]() {
|
| - precision mediump float;
|
| - varying TexCoordPrecision vec2 v_texCoord;
|
| - uniform sampler2D s_texture;
|
| - uniform SamplerType s_mask;
|
| - uniform TexCoordPrecision vec2 maskTexCoordScale;
|
| - uniform TexCoordPrecision vec2 maskTexCoordOffset;
|
| - uniform float alpha;
|
| - void main() {
|
| - vec4 texColor = texture2D(s_texture, v_texCoord);
|
| - TexCoordPrecision vec2 maskTexCoord =
|
| - vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x,
|
| - maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y);
|
| - vec4 maskColor = TextureLookup(s_mask, maskTexCoord);
|
| - gl_FragColor = ApplyBlendMode(
|
| - texColor * alpha * maskColor.w, maskColor.w);
|
| - }
|
| - });
|
| -}
|
| + // Include header text for alpha.
|
| + if (has_uniform_alpha_) {
|
| + HDR("uniform float alpha;");
|
| + }
|
| + if (has_varying_alpha_) {
|
| + HDR("varying float v_alpha;");
|
| + }
|
|
|
| -std::string FragmentShaderRGBATexAlphaMaskAA::GetShaderSource() const {
|
| - return SHADER0([]() {
|
| - precision mediump float;
|
| - uniform sampler2D s_texture;
|
| - uniform SamplerType s_mask;
|
| - uniform TexCoordPrecision vec2 maskTexCoordScale;
|
| - uniform TexCoordPrecision vec2 maskTexCoordOffset;
|
| - uniform float alpha;
|
| - varying TexCoordPrecision vec2 v_texCoord;
|
| - varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances.
|
| - void main() {
|
| - vec4 texColor = texture2D(s_texture, v_texCoord);
|
| - TexCoordPrecision vec2 maskTexCoord =
|
| - vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x,
|
| - maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y);
|
| - vec4 maskColor = TextureLookup(s_mask, maskTexCoord);
|
| - vec4 d4 = min(edge_dist[0], edge_dist[1]);
|
| - vec2 d2 = min(d4.xz, d4.yw);
|
| - float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0);
|
| - gl_FragColor = ApplyBlendMode(
|
| - texColor * alpha * maskColor.w * aa, maskColor.w);
|
| - }
|
| - });
|
| -}
|
| + // Apply uniform alpha, aa, varying alpha, and the mask.
|
| + if (has_varying_alpha_ || has_aa_ || has_uniform_alpha_ ||
|
| + has_mask_sampler_) {
|
| + SRC("// Apply alpha from uniform, varying, aa, and mask.");
|
| + std::string line = " texColor = texColor";
|
| + if (has_varying_alpha_)
|
| + line += " * v_alpha";
|
| + if (has_uniform_alpha_)
|
| + line += " * alpha";
|
| + if (has_aa_)
|
| + line += " * aa";
|
| + if (has_mask_sampler_)
|
| + line += " * maskColor.a";
|
| + line += ";\n";
|
| + source += line;
|
| + }
|
|
|
| -std::string FragmentShaderRGBATexAlphaMaskColorMatrixAA::GetShaderSource()
|
| - const {
|
| - return SHADER0([]() {
|
| - precision mediump float;
|
| - uniform sampler2D s_texture;
|
| - uniform SamplerType s_mask;
|
| - uniform vec2 maskTexCoordScale;
|
| - uniform vec2 maskTexCoordOffset;
|
| - uniform mat4 colorMatrix;
|
| - uniform vec4 colorOffset;
|
| - uniform float alpha;
|
| - varying TexCoordPrecision vec2 v_texCoord;
|
| - varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances.
|
| - void main() {
|
| - vec4 texColor = texture2D(s_texture, v_texCoord);
|
| - float nonZeroAlpha = max(texColor.a, 0.00001);
|
| - texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha);
|
| - texColor = colorMatrix * texColor + colorOffset;
|
| - texColor.rgb *= texColor.a;
|
| - texColor = clamp(texColor, 0.0, 1.0);
|
| - TexCoordPrecision vec2 maskTexCoord =
|
| - vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x,
|
| - maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y);
|
| - vec4 maskColor = TextureLookup(s_mask, maskTexCoord);
|
| - vec4 d4 = min(edge_dist[0], edge_dist[1]);
|
| - vec2 d2 = min(d4.xz, d4.yw);
|
| - float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0);
|
| - gl_FragColor = ApplyBlendMode(
|
| - texColor * alpha * maskColor.w * aa, maskColor.w);
|
| - }
|
| - });
|
| -}
|
| + // Write the fragment color.
|
| + SRC("// Write the fragment color");
|
| + switch (frag_color_mode_) {
|
| + case FRAG_COLOR_MODE_DEFAULT:
|
| + DCHECK_EQ(blend_mode_, BLEND_MODE_NONE);
|
| + SRC("gl_FragColor = texColor;");
|
| + break;
|
| + case FRAG_COLOR_MODE_OPAQUE:
|
| + DCHECK_EQ(blend_mode_, BLEND_MODE_NONE);
|
| + SRC("gl_FragColor = vec4(texColor.rgb, 1.0);");
|
| + break;
|
| + case FRAG_COLOR_MODE_APPLY_BLEND_MODE:
|
| + if (has_mask_sampler_)
|
| + SRC("gl_FragColor = ApplyBlendMode(texColor, maskColor.w);");
|
| + else
|
| + SRC("gl_FragColor = ApplyBlendMode(texColor, 0.0);");
|
| + break;
|
| + }
|
| + source += "}\n";
|
|
|
| -std::string FragmentShaderRGBATexAlphaColorMatrixAA::GetShaderSource() const {
|
| - return SHADER0([]() {
|
| - precision mediump float;
|
| - uniform SamplerType s_texture;
|
| - uniform float alpha;
|
| - uniform mat4 colorMatrix;
|
| - uniform vec4 colorOffset;
|
| - varying TexCoordPrecision vec2 v_texCoord;
|
| - varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances.
|
| - void main() {
|
| - vec4 texColor = TextureLookup(s_texture, v_texCoord);
|
| - float nonZeroAlpha = max(texColor.a, 0.00001);
|
| - texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha);
|
| - texColor = colorMatrix * texColor + colorOffset;
|
| - texColor.rgb *= texColor.a;
|
| - texColor = clamp(texColor, 0.0, 1.0);
|
| - vec4 d4 = min(edge_dist[0], edge_dist[1]);
|
| - vec2 d2 = min(d4.xz, d4.yw);
|
| - float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0);
|
| - gl_FragColor = ApplyBlendMode(texColor * alpha * aa, 0.0);
|
| - }
|
| - });
|
| -}
|
| +#undef HDR
|
| +#undef SRC
|
|
|
| -std::string FragmentShaderRGBATexAlphaMaskColorMatrix::GetShaderSource() const {
|
| - return SHADER0([]() {
|
| - precision mediump float;
|
| - varying TexCoordPrecision vec2 v_texCoord;
|
| - uniform sampler2D s_texture;
|
| - uniform SamplerType s_mask;
|
| - uniform vec2 maskTexCoordScale;
|
| - uniform vec2 maskTexCoordOffset;
|
| - uniform mat4 colorMatrix;
|
| - uniform vec4 colorOffset;
|
| - uniform float alpha;
|
| - void main() {
|
| - vec4 texColor = texture2D(s_texture, v_texCoord);
|
| - float nonZeroAlpha = max(texColor.a, 0.00001);
|
| - texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha);
|
| - texColor = colorMatrix * texColor + colorOffset;
|
| - texColor.rgb *= texColor.a;
|
| - texColor = clamp(texColor, 0.0, 1.0);
|
| - TexCoordPrecision vec2 maskTexCoord =
|
| - vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x,
|
| - maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y);
|
| - vec4 maskColor = TextureLookup(s_mask, maskTexCoord);
|
| - gl_FragColor = ApplyBlendMode(
|
| - texColor * alpha * maskColor.w, maskColor.w);
|
| - }
|
| - });
|
| + return header + source;
|
| }
|
|
|
| FragmentShaderYUVVideo::FragmentShaderYUVVideo()
|
| @@ -1647,26 +1481,4 @@ std::string FragmentShaderYUVVideo::GetShaderSource() const {
|
| return head + functions;
|
| }
|
|
|
| -std::string FragmentShaderColor::GetShaderSource() const {
|
| - return SHADER0([]() {
|
| - precision mediump float;
|
| - uniform vec4 color;
|
| - void main() { gl_FragColor = color; }
|
| - });
|
| -}
|
| -
|
| -std::string FragmentShaderColorAA::GetShaderSource() const {
|
| - return SHADER0([]() {
|
| - precision mediump float;
|
| - uniform vec4 color;
|
| - varying vec4 edge_dist[2]; // 8 edge distances.
|
| - void main() {
|
| - vec4 d4 = min(edge_dist[0], edge_dist[1]);
|
| - vec2 d2 = min(d4.xz, d4.yw);
|
| - float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0);
|
| - gl_FragColor = color * aa;
|
| - }
|
| - });
|
| -}
|
| -
|
| } // namespace cc
|
|
|