Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(30)

Side by Side Diff: cc/output/shader.cc

Issue 18432002: Blend TextureLayer background-color at draw time. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/output/shader.h" 5 #include "cc/output/shader.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after
661 float nonZeroAlpha = max(texColor.a, 0.00001); 661 float nonZeroAlpha = max(texColor.a, 0.00001);
662 texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha); 662 texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha);
663 texColor = colorMatrix * texColor + colorOffset; 663 texColor = colorMatrix * texColor + colorOffset;
664 texColor.rgb *= texColor.a; 664 texColor.rgb *= texColor.a;
665 texColor = clamp(texColor, 0.0, 1.0); 665 texColor = clamp(texColor, 0.0, 1.0);
666 gl_FragColor = texColor * alpha; 666 gl_FragColor = texColor * alpha;
667 } 667 }
668 ); // NOLINT(whitespace/parens) 668 ); // NOLINT(whitespace/parens)
669 } 669 }
670 670
671 std::string FragmentShaderRGBATexVaryingAlpha::GetShaderString( 671 FragmentTexBackgroundBinding::FragmentTexBackgroundBinding()
672 : background_color_location_(-1),
673 sampler_location_(-1) {
674 }
675
676 void FragmentTexBackgroundBinding::Init(WebGraphicsContext3D* context,
677 unsigned program,
678 bool using_bind_uniform,
679 int* base_uniform_index) {
680 static const char* shader_uniforms[] = {
681 "s_texture",
682 "background_color",
683 };
684 int locations[2];
685
686 GetProgramUniformLocations(context,
687 program,
688 shader_uniforms,
689 arraysize(shader_uniforms),
690 arraysize(locations),
691 locations,
692 using_bind_uniform,
693 base_uniform_index);
694
695 sampler_location_ = locations[0];
696 DCHECK_NE(sampler_location_, -1);
697
698 background_color_location_ = locations[1];
699 DCHECK_NE(background_color_location_, -1);
700 }
701
702 std::string FragmentShaderTexture::GetShaderString(
672 TexCoordPrecision precision) const { 703 TexCoordPrecision precision) const {
673 return FRAGMENT_SHADER( 704 return FRAGMENT_SHADER(
674 precision mediump float; 705 precision mediump float;
675 varying TexCoordPrecision vec2 v_texCoord; 706 varying TexCoordPrecision vec2 v_texCoord;
676 varying float v_alpha; 707 varying float v_alpha;
677 uniform sampler2D s_texture; 708 uniform sampler2D s_texture;
709 uniform vec4 background_color;
678 void main() { 710 void main() {
679 vec4 texColor = texture2D(s_texture, v_texCoord); 711 vec4 texColor = texture2D(s_texture, v_texCoord);
712 texColor += background_color * (1.0 - texColor.a);
piman 2013/07/02 01:26:30 drive-by: so, this extra cost is done on every pix
alokp 2013/07/02 22:03:54 I was hoping to not have to keep the existing shad
680 gl_FragColor = texColor * v_alpha; 713 gl_FragColor = texColor * v_alpha;
enne (OOO) 2013/07/02 01:27:22 How does v_alpha interact with texColor.a? If the
alokp 2013/07/02 22:03:54 This order is correct for this specific use case.
enne (OOO) 2013/07/02 23:08:29 I think it's still correct. I guess if I think ab
681 } 714 }
682 ); // NOLINT(whitespace/parens) 715 ); // NOLINT(whitespace/parens)
683 } 716 }
684 717
685 std::string FragmentShaderRGBATexPremultiplyAlpha::GetShaderString( 718 std::string FragmentShaderNonPremulTexture::GetShaderString(
686 TexCoordPrecision precision) const { 719 TexCoordPrecision precision) const {
687 return FRAGMENT_SHADER( 720 return FRAGMENT_SHADER(
688 precision mediump float; 721 precision mediump float;
689 varying TexCoordPrecision vec2 v_texCoord; 722 varying TexCoordPrecision vec2 v_texCoord;
690 varying float v_alpha; 723 varying float v_alpha;
691 uniform sampler2D s_texture; 724 uniform sampler2D s_texture;
725 uniform vec4 background_color;
692 void main() { 726 void main() {
693 vec4 texColor = texture2D(s_texture, v_texCoord); 727 vec4 texColor = texture2D(s_texture, v_texCoord);
694 texColor.rgb *= texColor.a; 728 texColor.rgb *= texColor.a;
729 texColor += background_color * (1.0 - texColor.a);
695 gl_FragColor = texColor * v_alpha; 730 gl_FragColor = texColor * v_alpha;
696 } 731 }
697 ); // NOLINT(whitespace/parens) 732 ); // NOLINT(whitespace/parens)
698 } 733 }
699 734
700 std::string FragmentShaderRGBATexRectVaryingAlpha::GetShaderString( 735 std::string FragmentShaderRGBATexRectVaryingAlpha::GetShaderString(
701 TexCoordPrecision precision) const { 736 TexCoordPrecision precision) const {
702 return "#extension GL_ARB_texture_rectangle : require\n" + 737 return "#extension GL_ARB_texture_rectangle : require\n" +
703 FRAGMENT_SHADER( 738 FRAGMENT_SHADER(
704 precision mediump float; 739 precision mediump float;
(...skipping 855 matching lines...) Expand 10 before | Expand all | Expand 10 after
1560 vec2 texCoord = 1595 vec2 texCoord =
1561 clamp(v_texCoord, 0.0, 1.0) * texTransform.zw + texTransform.xy; 1596 clamp(v_texCoord, 0.0, 1.0) * texTransform.zw + texTransform.xy;
1562 vec2 coord = mod(floor(texCoord * frequency * 2.0), 2.0); 1597 vec2 coord = mod(floor(texCoord * frequency * 2.0), 2.0);
1563 float picker = abs(coord.x - coord.y); 1598 float picker = abs(coord.x - coord.y);
1564 gl_FragColor = mix(color1, color2, picker) * alpha; 1599 gl_FragColor = mix(color1, color2, picker) * alpha;
1565 } 1600 }
1566 ); // NOLINT(whitespace/parens) 1601 ); // NOLINT(whitespace/parens)
1567 } 1602 }
1568 1603
1569 } // namespace cc 1604 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698