OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
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 "SkDither.h" | 8 #include "SkDither.h" |
9 #include "SkPerlinNoiseShader.h" | 9 #include "SkPerlinNoiseShader.h" |
10 #include "SkFlattenableBuffers.h" | 10 #include "SkFlattenableBuffers.h" |
(...skipping 734 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
745 const GrDrawEffect&, | 745 const GrDrawEffect&, |
746 EffectKey key, | 746 EffectKey key, |
747 const char* outputColor, | 747 const char* outputColor, |
748 const char* inputColor, | 748 const char* inputColor, |
749 const TextureSamplerArray&) { | 749 const TextureSamplerArray&) { |
750 sk_ignore_unused_variable(inputColor); | 750 sk_ignore_unused_variable(inputColor); |
751 | 751 |
752 SkString vCoords; | 752 SkString vCoords; |
753 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &vCoords); | 753 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &vCoords); |
754 | 754 |
755 fSeedUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, | 755 fSeedUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, |
756 kFloat_GrSLType, "seed"); | 756 kFloat_GrSLType, "seed"); |
757 const char* seedUni = builder->getUniformCStr(fSeedUni); | 757 const char* seedUni = builder->getUniformCStr(fSeedUni); |
758 fInvMatrixUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, | 758 fInvMatrixUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, |
759 kMat33f_GrSLType, "invMatrix"); | 759 kMat33f_GrSLType, "invMatrix"); |
760 const char* invMatrixUni = builder->getUniformCStr(fInvMatrixUni); | 760 const char* invMatrixUni = builder->getUniformCStr(fInvMatrixUni); |
761 fBaseFrequencyUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderT
ype, | 761 fBaseFrequencyUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibil
ity, |
762 kVec2f_GrSLType, "baseFrequency"); | 762 kVec2f_GrSLType, "baseFrequency"); |
763 const char* baseFrequencyUni = builder->getUniformCStr(fBaseFrequencyUni); | 763 const char* baseFrequencyUni = builder->getUniformCStr(fBaseFrequencyUni); |
764 fAlphaUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, | 764 fAlphaUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, |
765 kFloat_GrSLType, "alpha"); | 765 kFloat_GrSLType, "alpha"); |
766 const char* alphaUni = builder->getUniformCStr(fAlphaUni); | 766 const char* alphaUni = builder->getUniformCStr(fAlphaUni); |
767 | 767 |
768 // Add vec3 modulo 289 function | 768 // Add vec3 modulo 289 function |
769 static const GrGLShaderVar gVec3Args[] = { | 769 static const GrGLShaderVar gVec3Args[] = { |
770 GrGLShaderVar("x", kVec3f_GrSLType) | 770 GrGLShaderVar("x", kVec3f_GrSLType) |
771 }; | 771 }; |
772 | 772 |
773 SkString mod289_3_funcName; | 773 SkString mod289_3_funcName; |
774 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, kVec3f_GrSLTy
pe, | 774 builder->fsEmitFunction(kVec3f_GrSLType, |
775 "mod289", SK_ARRAY_COUNT(gVec3Args), gVec3Args, | 775 "mod289", SK_ARRAY_COUNT(gVec3Args), gVec3Args, |
776 "const vec2 C = vec2(1.0 / 289.0, 289.0);\n" | 776 "const vec2 C = vec2(1.0 / 289.0, 289.0);\n" |
777 "return x - floor(x * C.xxx) * C.yyy;", &mod289_3_func
Name); | 777 "return x - floor(x * C.xxx) * C.yyy;", &mod289_3_fu
ncName); |
778 | 778 |
779 // Add vec4 modulo 289 function | 779 // Add vec4 modulo 289 function |
780 static const GrGLShaderVar gVec4Args[] = { | 780 static const GrGLShaderVar gVec4Args[] = { |
781 GrGLShaderVar("x", kVec4f_GrSLType) | 781 GrGLShaderVar("x", kVec4f_GrSLType) |
782 }; | 782 }; |
783 | 783 |
784 SkString mod289_4_funcName; | 784 SkString mod289_4_funcName; |
785 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, kVec4f_GrSLTy
pe, | 785 builder->fsEmitFunction(kVec4f_GrSLType, |
786 "mod289", SK_ARRAY_COUNT(gVec4Args), gVec4Args, | 786 "mod289", SK_ARRAY_COUNT(gVec4Args), gVec4Args, |
787 "const vec2 C = vec2(1.0 / 289.0, 289.0);\n" | 787 "const vec2 C = vec2(1.0 / 289.0, 289.0);\n" |
788 "return x - floor(x * C.xxxx) * C.yyyy;", &mod289_4_fu
ncName); | 788 "return x - floor(x * C.xxxx) * C.yyyy;", &mod289_4_
funcName); |
789 | 789 |
790 // Add vec4 permute function | 790 // Add vec4 permute function |
791 SkString permuteCode; | 791 SkString permuteCode; |
792 permuteCode.appendf("const vec2 C = vec2(34.0, 1.0);\n" | 792 permuteCode.appendf("const vec2 C = vec2(34.0, 1.0);\n" |
793 "return %s(((x * C.xxxx) + C.yyyy) * x);", mod289_4_func
Name.c_str()); | 793 "return %s(((x * C.xxxx) + C.yyyy) * x);", mod289_4_func
Name.c_str()); |
794 SkString permuteFuncName; | 794 SkString permuteFuncName; |
795 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, kVec4f_GrSLTy
pe, | 795 builder->fsEmitFunction(kVec4f_GrSLType, |
796 "permute", SK_ARRAY_COUNT(gVec4Args), gVec4Args, | 796 "permute", SK_ARRAY_COUNT(gVec4Args), gVec4Args, |
797 permuteCode.c_str(), &permuteFuncName); | 797 permuteCode.c_str(), &permuteFuncName); |
798 | 798 |
799 // Add vec4 taylorInvSqrt function | 799 // Add vec4 taylorInvSqrt function |
800 SkString taylorInvSqrtFuncName; | 800 SkString taylorInvSqrtFuncName; |
801 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, kVec4f_GrSLTy
pe, | 801 builder->fsEmitFunction(kVec4f_GrSLType, |
802 "taylorInvSqrt", SK_ARRAY_COUNT(gVec4Args), gVec4Args, | 802 "taylorInvSqrt", SK_ARRAY_COUNT(gVec4Args), gVec4Arg
s, |
803 "const vec2 C = vec2(-0.85373472095314, 1.792842914001
59);\n" | 803 "const vec2 C = vec2(-0.85373472095314, 1.7928429140
0159);\n" |
804 "return x * C.xxxx + C.yyyy;", &taylorInvSqrtFuncName)
; | 804 "return x * C.xxxx + C.yyyy;", &taylorInvSqrtFuncNam
e); |
805 | 805 |
806 // Add vec3 noise function | 806 // Add vec3 noise function |
807 static const GrGLShaderVar gNoiseVec3Args[] = { | 807 static const GrGLShaderVar gNoiseVec3Args[] = { |
808 GrGLShaderVar("v", kVec3f_GrSLType) | 808 GrGLShaderVar("v", kVec3f_GrSLType) |
809 }; | 809 }; |
810 | 810 |
811 SkString noiseCode; | 811 SkString noiseCode; |
812 noiseCode.append( | 812 noiseCode.append( |
813 "const vec2 C = vec2(1.0/6.0, 1.0/3.0);\n" | 813 "const vec2 C = vec2(1.0/6.0, 1.0/3.0);\n" |
814 "const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n" | 814 "const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n" |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
879 "p2 *= norm.z;\n" | 879 "p2 *= norm.z;\n" |
880 "p3 *= norm.w;\n" | 880 "p3 *= norm.w;\n" |
881 | 881 |
882 // Mix final noise value | 882 // Mix final noise value |
883 "vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3))
, 0.0);\n" | 883 "vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3))
, 0.0);\n" |
884 "m = m * m;\n" | 884 "m = m * m;\n" |
885 "return 42.0 * dot(m*m, vec4(dot(p0,x0), dot(p1,x1), dot(p2,x2), dot(p3,
x3)));", | 885 "return 42.0 * dot(m*m, vec4(dot(p0,x0), dot(p1,x1), dot(p2,x2), dot(p3,
x3)));", |
886 taylorInvSqrtFuncName.c_str()); | 886 taylorInvSqrtFuncName.c_str()); |
887 | 887 |
888 SkString noiseFuncName; | 888 SkString noiseFuncName; |
889 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, kFloat_GrSLTy
pe, | 889 builder->fsEmitFunction(kFloat_GrSLType, |
890 "snoise", SK_ARRAY_COUNT(gNoiseVec3Args), gNoiseVec3Ar
gs, | 890 "snoise", SK_ARRAY_COUNT(gNoiseVec3Args), gNoiseVec3
Args, |
891 noiseCode.c_str(), &noiseFuncName); | 891 noiseCode.c_str(), &noiseFuncName); |
892 | 892 |
893 const char* noiseVecIni = "noiseVecIni"; | 893 const char* noiseVecIni = "noiseVecIni"; |
894 const char* factors = "factors"; | 894 const char* factors = "factors"; |
895 const char* sum = "sum"; | 895 const char* sum = "sum"; |
896 const char* xOffsets = "xOffsets"; | 896 const char* xOffsets = "xOffsets"; |
897 const char* yOffsets = "yOffsets"; | 897 const char* yOffsets = "yOffsets"; |
898 const char* channel = "channel"; | 898 const char* channel = "channel"; |
899 | 899 |
900 // Fill with some prime numbers | 900 // Fill with some prime numbers |
901 builder->fsCodeAppendf("\t\tconst vec4 %s = vec4(13.0, 53.0, 101.0, 151.0);\
n", xOffsets); | 901 builder->fsCodeAppendf("\t\tconst vec4 %s = vec4(13.0, 53.0, 101.0, 151.0);\
n", xOffsets); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
961 const GrDrawEffect&, | 961 const GrDrawEffect&, |
962 EffectKey key, | 962 EffectKey key, |
963 const char* outputColor, | 963 const char* outputColor, |
964 const char* inputColor, | 964 const char* inputColor, |
965 const TextureSamplerArray& samplers) { | 965 const TextureSamplerArray& samplers) { |
966 sk_ignore_unused_variable(inputColor); | 966 sk_ignore_unused_variable(inputColor); |
967 | 967 |
968 SkString vCoords; | 968 SkString vCoords; |
969 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &vCoords); | 969 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &vCoords); |
970 | 970 |
971 fInvMatrixUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, | 971 fInvMatrixUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, |
972 kMat33f_GrSLType, "invMatrix"); | 972 kMat33f_GrSLType, "invMatrix"); |
973 const char* invMatrixUni = builder->getUniformCStr(fInvMatrixUni); | 973 const char* invMatrixUni = builder->getUniformCStr(fInvMatrixUni); |
974 fBaseFrequencyUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderT
ype, | 974 fBaseFrequencyUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibil
ity, |
975 kVec2f_GrSLType, "baseFrequency"); | 975 kVec2f_GrSLType, "baseFrequency"); |
976 const char* baseFrequencyUni = builder->getUniformCStr(fBaseFrequencyUni); | 976 const char* baseFrequencyUni = builder->getUniformCStr(fBaseFrequencyUni); |
977 fAlphaUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, | 977 fAlphaUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, |
978 kFloat_GrSLType, "alpha"); | 978 kFloat_GrSLType, "alpha"); |
979 const char* alphaUni = builder->getUniformCStr(fAlphaUni); | 979 const char* alphaUni = builder->getUniformCStr(fAlphaUni); |
980 | 980 |
981 const char* stitchDataUni = NULL; | 981 const char* stitchDataUni = NULL; |
982 if (fStitchTiles) { | 982 if (fStitchTiles) { |
983 fStitchDataUni = builder->addUniform(GrGLShaderBuilder::kFragment_Shader
Type, | 983 fStitchDataUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibi
lity, |
984 kVec2f_GrSLType, "stitchData"); | 984 kVec2f_GrSLType, "stitchData"); |
985 stitchDataUni = builder->getUniformCStr(fStitchDataUni); | 985 stitchDataUni = builder->getUniformCStr(fStitchDataUni); |
986 } | 986 } |
987 | 987 |
988 // There are 4 lines, so the center of each line is 1/8, 3/8, 5/8 and 7/8 | 988 // There are 4 lines, so the center of each line is 1/8, 3/8, 5/8 and 7/8 |
989 const char* chanCoordR = "0.125"; | 989 const char* chanCoordR = "0.125"; |
990 const char* chanCoordG = "0.375"; | 990 const char* chanCoordG = "0.375"; |
991 const char* chanCoordB = "0.625"; | 991 const char* chanCoordB = "0.625"; |
992 const char* chanCoordA = "0.875"; | 992 const char* chanCoordA = "0.875"; |
993 const char* chanCoord = "chanCoord"; | 993 const char* chanCoord = "chanCoord"; |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1130 noiseCode.appendf(dotLattice, lattice, lattice, inc8bit, fractVal); | 1130 noiseCode.appendf(dotLattice, lattice, lattice, inc8bit, fractVal); |
1131 } | 1131 } |
1132 | 1132 |
1133 // Compute 'b' as a linear interpolation of 'u' and 'v' | 1133 // Compute 'b' as a linear interpolation of 'u' and 'v' |
1134 noiseCode.appendf("\n\t%s.y = mix(%s.x, %s.y, %s.x);", ab, uv, uv, noiseSmoo
th); | 1134 noiseCode.appendf("\n\t%s.y = mix(%s.x, %s.y, %s.x);", ab, uv, uv, noiseSmoo
th); |
1135 // Compute the noise as a linear interpolation of 'a' and 'b' | 1135 // Compute the noise as a linear interpolation of 'a' and 'b' |
1136 noiseCode.appendf("\n\treturn mix(%s.x, %s.y, %s.y);\n", ab, ab, noiseSmooth
); | 1136 noiseCode.appendf("\n\treturn mix(%s.x, %s.y, %s.y);\n", ab, ab, noiseSmooth
); |
1137 | 1137 |
1138 SkString noiseFuncName; | 1138 SkString noiseFuncName; |
1139 if (fStitchTiles) { | 1139 if (fStitchTiles) { |
1140 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, kFloat_Gr
SLType, | 1140 builder->fsEmitFunction(kFloat_GrSLType, |
1141 "perlinnoise", SK_ARRAY_COUNT(gPerlinNoiseStitchAr
gs), | 1141 "perlinnoise", SK_ARRAY_COUNT(gPerlinNoiseStitch
Args), |
1142 gPerlinNoiseStitchArgs, noiseCode.c_str(), &noiseF
uncName); | 1142 gPerlinNoiseStitchArgs, noiseCode.c_str(), &nois
eFuncName); |
1143 } else { | 1143 } else { |
1144 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, kFloat_Gr
SLType, | 1144 builder->fsEmitFunction(kFloat_GrSLType, |
1145 "perlinnoise", SK_ARRAY_COUNT(gPerlinNoiseArgs), | 1145 "perlinnoise", SK_ARRAY_COUNT(gPerlinNoiseArgs), |
1146 gPerlinNoiseArgs, noiseCode.c_str(), &noiseFuncNam
e); | 1146 gPerlinNoiseArgs, noiseCode.c_str(), &noiseFuncN
ame); |
1147 } | 1147 } |
1148 | 1148 |
1149 // There are rounding errors if the floor operation is not performed here | 1149 // There are rounding errors if the floor operation is not performed here |
1150 builder->fsCodeAppendf("\n\t\tvec2 %s = floor((%s * vec3(%s, 1.0)).xy) * %s;
", | 1150 builder->fsCodeAppendf("\n\t\tvec2 %s = floor((%s * vec3(%s, 1.0)).xy) * %s;
", |
1151 noiseVec, invMatrixUni, vCoords.c_str(), baseFrequenc
yUni); | 1151 noiseVec, invMatrixUni, vCoords.c_str(), baseFrequenc
yUni); |
1152 | 1152 |
1153 // Clear the color accumulator | 1153 // Clear the color accumulator |
1154 builder->fsCodeAppendf("\n\t\t%s = vec4(0.0);", outputColor); | 1154 builder->fsCodeAppendf("\n\t\t%s = vec4(0.0);", outputColor); |
1155 | 1155 |
1156 if (fStitchTiles) { | 1156 if (fStitchTiles) { |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1369 str->append(" seed: "); | 1369 str->append(" seed: "); |
1370 str->appendScalar(fSeed); | 1370 str->appendScalar(fSeed); |
1371 str->append(" stitch tiles: "); | 1371 str->append(" stitch tiles: "); |
1372 str->append(fStitchTiles ? "true " : "false "); | 1372 str->append(fStitchTiles ? "true " : "false "); |
1373 | 1373 |
1374 this->INHERITED::toString(str); | 1374 this->INHERITED::toString(str); |
1375 | 1375 |
1376 str->append(")"); | 1376 str->append(")"); |
1377 } | 1377 } |
1378 #endif | 1378 #endif |
OLD | NEW |