OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 The Android Open Source Project | 2 * Copyright 2012 The Android Open Source Project |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkLightingImageFilter.h" | 8 #include "SkLightingImageFilter.h" |
9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
(...skipping 1640 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1651 void GrGLLightingEffect::emitCode(EmitArgs& args) { | 1651 void GrGLLightingEffect::emitCode(EmitArgs& args) { |
1652 fImageIncrementUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment
_Visibility, | 1652 fImageIncrementUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment
_Visibility, |
1653 kVec2f_GrSLType, kDefault_GrSLPrec
ision, | 1653 kVec2f_GrSLType, kDefault_GrSLPrec
ision, |
1654 "ImageIncrement"); | 1654 "ImageIncrement"); |
1655 fSurfaceScaleUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_V
isibility, | 1655 fSurfaceScaleUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_V
isibility, |
1656 kFloat_GrSLType, kDefault_GrSLPrecisi
on, | 1656 kFloat_GrSLType, kDefault_GrSLPrecisi
on, |
1657 "SurfaceScale"); | 1657 "SurfaceScale"); |
1658 fLight->emitLightColorUniform(args.fBuilder); | 1658 fLight->emitLightColorUniform(args.fBuilder); |
1659 SkString lightFunc; | 1659 SkString lightFunc; |
1660 this->emitLightFunc(args.fBuilder, &lightFunc); | 1660 this->emitLightFunc(args.fBuilder, &lightFunc); |
1661 static const GrGLShaderVar gSobelArgs[] = { | 1661 static const GrGLSLShaderVar gSobelArgs[] = { |
1662 GrGLShaderVar("a", kFloat_GrSLType), | 1662 GrGLSLShaderVar("a", kFloat_GrSLType), |
1663 GrGLShaderVar("b", kFloat_GrSLType), | 1663 GrGLSLShaderVar("b", kFloat_GrSLType), |
1664 GrGLShaderVar("c", kFloat_GrSLType), | 1664 GrGLSLShaderVar("c", kFloat_GrSLType), |
1665 GrGLShaderVar("d", kFloat_GrSLType), | 1665 GrGLSLShaderVar("d", kFloat_GrSLType), |
1666 GrGLShaderVar("e", kFloat_GrSLType), | 1666 GrGLSLShaderVar("e", kFloat_GrSLType), |
1667 GrGLShaderVar("f", kFloat_GrSLType), | 1667 GrGLSLShaderVar("f", kFloat_GrSLType), |
1668 GrGLShaderVar("scale", kFloat_GrSLType), | 1668 GrGLSLShaderVar("scale", kFloat_GrSLType), |
1669 }; | 1669 }; |
1670 SkString sobelFuncName; | 1670 SkString sobelFuncName; |
1671 GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder(); | 1671 GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder(); |
1672 SkString coords2D = fsBuilder->ensureFSCoords2D(args.fCoords, 0); | 1672 SkString coords2D = fsBuilder->ensureFSCoords2D(args.fCoords, 0); |
1673 | 1673 |
1674 fsBuilder->emitFunction(kFloat_GrSLType, | 1674 fsBuilder->emitFunction(kFloat_GrSLType, |
1675 "sobel", | 1675 "sobel", |
1676 SK_ARRAY_COUNT(gSobelArgs), | 1676 SK_ARRAY_COUNT(gSobelArgs), |
1677 gSobelArgs, | 1677 gSobelArgs, |
1678 "\treturn (-a + b - 2.0 * c + 2.0 * d -e + f) * scal
e;\n", | 1678 "\treturn (-a + b - 2.0 * c + 2.0 * d -e + f) * scal
e;\n", |
1679 &sobelFuncName); | 1679 &sobelFuncName); |
1680 static const GrGLShaderVar gPointToNormalArgs[] = { | 1680 static const GrGLSLShaderVar gPointToNormalArgs[] = { |
1681 GrGLShaderVar("x", kFloat_GrSLType), | 1681 GrGLSLShaderVar("x", kFloat_GrSLType), |
1682 GrGLShaderVar("y", kFloat_GrSLType), | 1682 GrGLSLShaderVar("y", kFloat_GrSLType), |
1683 GrGLShaderVar("scale", kFloat_GrSLType), | 1683 GrGLSLShaderVar("scale", kFloat_GrSLType), |
1684 }; | 1684 }; |
1685 SkString pointToNormalName; | 1685 SkString pointToNormalName; |
1686 fsBuilder->emitFunction(kVec3f_GrSLType, | 1686 fsBuilder->emitFunction(kVec3f_GrSLType, |
1687 "pointToNormal", | 1687 "pointToNormal", |
1688 SK_ARRAY_COUNT(gPointToNormalArgs), | 1688 SK_ARRAY_COUNT(gPointToNormalArgs), |
1689 gPointToNormalArgs, | 1689 gPointToNormalArgs, |
1690 "\treturn normalize(vec3(-x * scale, -y * scale, 1))
;\n", | 1690 "\treturn normalize(vec3(-x * scale, -y * scale, 1))
;\n", |
1691 &pointToNormalName); | 1691 &pointToNormalName); |
1692 | 1692 |
1693 static const GrGLShaderVar gInteriorNormalArgs[] = { | 1693 static const GrGLSLShaderVar gInteriorNormalArgs[] = { |
1694 GrGLShaderVar("m", kFloat_GrSLType, 9), | 1694 GrGLSLShaderVar("m", kFloat_GrSLType, 9), |
1695 GrGLShaderVar("surfaceScale", kFloat_GrSLType), | 1695 GrGLSLShaderVar("surfaceScale", kFloat_GrSLType), |
1696 }; | 1696 }; |
1697 SkString normalBody = emitNormalFunc(fBoundaryMode, | 1697 SkString normalBody = emitNormalFunc(fBoundaryMode, |
1698 pointToNormalName.c_str(), | 1698 pointToNormalName.c_str(), |
1699 sobelFuncName.c_str()); | 1699 sobelFuncName.c_str()); |
1700 SkString normalName; | 1700 SkString normalName; |
1701 fsBuilder->emitFunction(kVec3f_GrSLType, | 1701 fsBuilder->emitFunction(kVec3f_GrSLType, |
1702 "normal", | 1702 "normal", |
1703 SK_ARRAY_COUNT(gInteriorNormalArgs), | 1703 SK_ARRAY_COUNT(gInteriorNormalArgs), |
1704 gInteriorNormalArgs, | 1704 gInteriorNormalArgs, |
1705 normalBody.c_str(), | 1705 normalBody.c_str(), |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1760 GrGLDiffuseLightingEffect::GrGLDiffuseLightingEffect(const GrProcessor& proc) | 1760 GrGLDiffuseLightingEffect::GrGLDiffuseLightingEffect(const GrProcessor& proc) |
1761 : INHERITED(proc) { | 1761 : INHERITED(proc) { |
1762 } | 1762 } |
1763 | 1763 |
1764 void GrGLDiffuseLightingEffect::emitLightFunc(GrGLFPBuilder* builder, SkString*
funcName) { | 1764 void GrGLDiffuseLightingEffect::emitLightFunc(GrGLFPBuilder* builder, SkString*
funcName) { |
1765 const char* kd; | 1765 const char* kd; |
1766 fKDUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 1766 fKDUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
1767 kFloat_GrSLType, kDefault_GrSLPrecision, | 1767 kFloat_GrSLType, kDefault_GrSLPrecision, |
1768 "KD", &kd); | 1768 "KD", &kd); |
1769 | 1769 |
1770 static const GrGLShaderVar gLightArgs[] = { | 1770 static const GrGLSLShaderVar gLightArgs[] = { |
1771 GrGLShaderVar("normal", kVec3f_GrSLType), | 1771 GrGLSLShaderVar("normal", kVec3f_GrSLType), |
1772 GrGLShaderVar("surfaceToLight", kVec3f_GrSLType), | 1772 GrGLSLShaderVar("surfaceToLight", kVec3f_GrSLType), |
1773 GrGLShaderVar("lightColor", kVec3f_GrSLType) | 1773 GrGLSLShaderVar("lightColor", kVec3f_GrSLType) |
1774 }; | 1774 }; |
1775 SkString lightBody; | 1775 SkString lightBody; |
1776 lightBody.appendf("\tfloat colorScale = %s * dot(normal, surfaceToLight);\n"
, kd); | 1776 lightBody.appendf("\tfloat colorScale = %s * dot(normal, surfaceToLight);\n"
, kd); |
1777 lightBody.appendf("\treturn vec4(lightColor * clamp(colorScale, 0.0, 1.0), 1
.0);\n"); | 1777 lightBody.appendf("\treturn vec4(lightColor * clamp(colorScale, 0.0, 1.0), 1
.0);\n"); |
1778 builder->getFragmentShaderBuilder()->emitFunction(kVec4f_GrSLType, | 1778 builder->getFragmentShaderBuilder()->emitFunction(kVec4f_GrSLType, |
1779 "light", | 1779 "light", |
1780 SK_ARRAY_COUNT(gLightArgs)
, | 1780 SK_ARRAY_COUNT(gLightArgs)
, |
1781 gLightArgs, | 1781 gLightArgs, |
1782 lightBody.c_str(), | 1782 lightBody.c_str(), |
1783 funcName); | 1783 funcName); |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1848 const char* shininess; | 1848 const char* shininess; |
1849 | 1849 |
1850 fKSUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 1850 fKSUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
1851 kFloat_GrSLType, kDefault_GrSLPrecision, "KS",
&ks); | 1851 kFloat_GrSLType, kDefault_GrSLPrecision, "KS",
&ks); |
1852 fShininessUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility
, | 1852 fShininessUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility
, |
1853 kFloat_GrSLType, | 1853 kFloat_GrSLType, |
1854 kDefault_GrSLPrecision, | 1854 kDefault_GrSLPrecision, |
1855 "Shininess", | 1855 "Shininess", |
1856 &shininess); | 1856 &shininess); |
1857 | 1857 |
1858 static const GrGLShaderVar gLightArgs[] = { | 1858 static const GrGLSLShaderVar gLightArgs[] = { |
1859 GrGLShaderVar("normal", kVec3f_GrSLType), | 1859 GrGLSLShaderVar("normal", kVec3f_GrSLType), |
1860 GrGLShaderVar("surfaceToLight", kVec3f_GrSLType), | 1860 GrGLSLShaderVar("surfaceToLight", kVec3f_GrSLType), |
1861 GrGLShaderVar("lightColor", kVec3f_GrSLType) | 1861 GrGLSLShaderVar("lightColor", kVec3f_GrSLType) |
1862 }; | 1862 }; |
1863 SkString lightBody; | 1863 SkString lightBody; |
1864 lightBody.appendf("\tvec3 halfDir = vec3(normalize(surfaceToLight + vec3(0,
0, 1)));\n"); | 1864 lightBody.appendf("\tvec3 halfDir = vec3(normalize(surfaceToLight + vec3(0,
0, 1)));\n"); |
1865 lightBody.appendf("\tfloat colorScale = %s * pow(dot(normal, halfDir), %s);\
n", ks, shininess); | 1865 lightBody.appendf("\tfloat colorScale = %s * pow(dot(normal, halfDir), %s);\
n", ks, shininess); |
1866 lightBody.appendf("\tvec3 color = lightColor * clamp(colorScale, 0.0, 1.0);\
n"); | 1866 lightBody.appendf("\tvec3 color = lightColor * clamp(colorScale, 0.0, 1.0);\
n"); |
1867 lightBody.appendf("\treturn vec4(color, max(max(color.r, color.g), color.b))
;\n"); | 1867 lightBody.appendf("\treturn vec4(color, max(max(color.r, color.g), color.b))
;\n"); |
1868 builder->getFragmentShaderBuilder()->emitFunction(kVec4f_GrSLType, | 1868 builder->getFragmentShaderBuilder()->emitFunction(kVec4f_GrSLType, |
1869 "light", | 1869 "light", |
1870 SK_ARRAY_COUNT(gLightArgs)
, | 1870 SK_ARRAY_COUNT(gLightArgs)
, |
1871 gLightArgs, | 1871 gLightArgs, |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1980 "CosInnerConeAngle", &cosInner); | 1980 "CosInnerConeAngle", &cosInner); |
1981 fCosOuterConeAngleUni = builder->addUniform(GrGLProgramBuilder::kFragment_Vi
sibility, | 1981 fCosOuterConeAngleUni = builder->addUniform(GrGLProgramBuilder::kFragment_Vi
sibility, |
1982 kFloat_GrSLType, kDefault_GrSLPr
ecision, | 1982 kFloat_GrSLType, kDefault_GrSLPr
ecision, |
1983 "CosOuterConeAngle", &cosOuter); | 1983 "CosOuterConeAngle", &cosOuter); |
1984 fConeScaleUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility
, | 1984 fConeScaleUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility
, |
1985 kFloat_GrSLType, kDefault_GrSLPrecision, | 1985 kFloat_GrSLType, kDefault_GrSLPrecision, |
1986 "ConeScale", &coneScale); | 1986 "ConeScale", &coneScale); |
1987 fSUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 1987 fSUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
1988 kVec3f_GrSLType, kDefault_GrSLPrecision, "S", &s
); | 1988 kVec3f_GrSLType, kDefault_GrSLPrecision, "S", &s
); |
1989 | 1989 |
1990 static const GrGLShaderVar gLightColorArgs[] = { | 1990 static const GrGLSLShaderVar gLightColorArgs[] = { |
1991 GrGLShaderVar("surfaceToLight", kVec3f_GrSLType) | 1991 GrGLSLShaderVar("surfaceToLight", kVec3f_GrSLType) |
1992 }; | 1992 }; |
1993 SkString lightColorBody; | 1993 SkString lightColorBody; |
1994 lightColorBody.appendf("\tfloat cosAngle = -dot(surfaceToLight, %s);\n", s); | 1994 lightColorBody.appendf("\tfloat cosAngle = -dot(surfaceToLight, %s);\n", s); |
1995 lightColorBody.appendf("\tif (cosAngle < %s) {\n", cosOuter); | 1995 lightColorBody.appendf("\tif (cosAngle < %s) {\n", cosOuter); |
1996 lightColorBody.appendf("\t\treturn vec3(0);\n"); | 1996 lightColorBody.appendf("\t\treturn vec3(0);\n"); |
1997 lightColorBody.appendf("\t}\n"); | 1997 lightColorBody.appendf("\t}\n"); |
1998 lightColorBody.appendf("\tfloat scale = pow(cosAngle, %s);\n", exponent); | 1998 lightColorBody.appendf("\tfloat scale = pow(cosAngle, %s);\n", exponent); |
1999 lightColorBody.appendf("\tif (cosAngle < %s) {\n", cosInner); | 1999 lightColorBody.appendf("\tif (cosAngle < %s) {\n", cosInner); |
2000 lightColorBody.appendf("\t\treturn %s * scale * (cosAngle - %s) * %s;\n", | 2000 lightColorBody.appendf("\t\treturn %s * scale * (cosAngle - %s) * %s;\n", |
2001 color, cosOuter, coneScale); | 2001 color, cosOuter, coneScale); |
2002 lightColorBody.appendf("\t}\n"); | 2002 lightColorBody.appendf("\t}\n"); |
2003 lightColorBody.appendf("\treturn %s;\n", color); | 2003 lightColorBody.appendf("\treturn %s;\n", color); |
2004 GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); | 2004 GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); |
2005 fsBuilder->emitFunction(kVec3f_GrSLType, | 2005 fsBuilder->emitFunction(kVec3f_GrSLType, |
2006 "lightColor", | 2006 "lightColor", |
2007 SK_ARRAY_COUNT(gLightColorArgs), | 2007 SK_ARRAY_COUNT(gLightColorArgs), |
2008 gLightColorArgs, | 2008 gLightColorArgs, |
2009 lightColorBody.c_str(), | 2009 lightColorBody.c_str(), |
2010 &fLightColorFunc); | 2010 &fLightColorFunc); |
2011 | 2011 |
2012 fsBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); | 2012 fsBuilder->codeAppendf("%s(%s)", fLightColorFunc.c_str(), surfaceToLight); |
2013 } | 2013 } |
2014 | 2014 |
2015 #endif | 2015 #endif |
2016 | 2016 |
2017 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) | 2017 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) |
2018 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) | 2018 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) |
2019 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) | 2019 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) |
2020 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 2020 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |