Chromium Code Reviews| 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 476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 487 for (int i = 0; i < count; ++i) { | 487 for (int i = 0; i < count; ++i) { |
| 488 unsigned dither = DITHER_VALUE(x); | 488 unsigned dither = DITHER_VALUE(x); |
| 489 result[i] = SkDitherRGB32To565(shade(point, stitchData), dither); | 489 result[i] = SkDitherRGB32To565(shade(point, stitchData), dither); |
| 490 DITHER_INC_X(x); | 490 DITHER_INC_X(x); |
| 491 point.fX += SK_Scalar1; | 491 point.fX += SK_Scalar1; |
| 492 } | 492 } |
| 493 } | 493 } |
| 494 | 494 |
| 495 ///////////////////////////////////////////////////////////////////// | 495 ///////////////////////////////////////////////////////////////////// |
| 496 | 496 |
| 497 #if SK_SUPPORT_GPU && !defined(SK_BUILD_FOR_ANDROID) && !defined(SK_BUILD_FOR_WI N) | 497 #if SK_SUPPORT_GPU && !defined(SK_BUILD_FOR_ANDROID) |
| 498 // CPU noise is faster on Android, so the GPU implementation is only for desktop | 498 // CPU noise is faster on Android, so the GPU implementation is only for desktop |
| 499 | 499 |
| 500 #include "GrTBackendEffectFactory.h" | 500 #include "GrTBackendEffectFactory.h" |
| 501 | 501 |
| 502 class GrGLNoise : public GrGLEffect { | 502 class GrGLNoise : public GrGLEffect { |
| 503 public: | 503 public: |
| 504 GrGLNoise(const GrBackendEffectFactory& factory, | 504 GrGLNoise(const GrBackendEffectFactory& factory, |
| 505 const GrDrawEffect& drawEffect); | 505 const GrDrawEffect& drawEffect); |
| 506 virtual ~GrGLNoise() {} | 506 virtual ~GrGLNoise() {} |
| 507 | 507 |
| (...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 979 kFloat_GrSLType, "alpha"); | 979 kFloat_GrSLType, "alpha"); |
| 980 const char* alphaUni = builder->getUniformCStr(fAlphaUni); | 980 const char* alphaUni = builder->getUniformCStr(fAlphaUni); |
| 981 | 981 |
| 982 const char* stitchDataUni = NULL; | 982 const char* stitchDataUni = NULL; |
| 983 if (fStitchTiles) { | 983 if (fStitchTiles) { |
| 984 fStitchDataUni = builder->addUniform(GrGLShaderBuilder::kFragment_Shader Type, | 984 fStitchDataUni = builder->addUniform(GrGLShaderBuilder::kFragment_Shader Type, |
| 985 kVec4f_GrSLType, "stitchData"); | 985 kVec4f_GrSLType, "stitchData"); |
| 986 stitchDataUni = builder->getUniformCStr(fStitchDataUni); | 986 stitchDataUni = builder->getUniformCStr(fStitchDataUni); |
| 987 } | 987 } |
| 988 | 988 |
| 989 const char* chanCoords = "chanCoords"; | 989 // There are 4 lines, so the center of each line is 1/8, 3/8, 5/8 and 7/8 |
| 990 const char* chanCoordR = "0.125"; | |
| 991 const char* chanCoordG = "0.375"; | |
| 992 const char* chanCoordB = "0.625"; | |
| 993 const char* chanCoordA = "0.875"; | |
| 994 const char* chanCoord = "chanCoord"; | |
| 990 const char* stitchData = "stitchData"; | 995 const char* stitchData = "stitchData"; |
| 991 const char* ratio = "ratio"; | 996 const char* ratio = "ratio"; |
| 992 const char* noise = "noise"; | |
| 993 const char* noiseXY = "noiseXY"; | 997 const char* noiseXY = "noiseXY"; |
| 994 const char* noiseVec = "noiseVec"; | 998 const char* noiseVec = "noiseVec"; |
| 995 const char* noiseVecIni = "noiseVecIni"; | |
| 996 const char* noiseSmooth = "noiseSmooth"; | 999 const char* noiseSmooth = "noiseSmooth"; |
| 997 const char* fractVal = "fractVal"; | 1000 const char* fractVal = "fractVal"; |
| 998 const char* uv = "uv"; | 1001 const char* uv = "uv"; |
| 999 const char* ab = "ab"; | 1002 const char* ab = "ab"; |
| 1000 const char* latticeIdx = "latticeIdx"; | 1003 const char* latticeIdx = "latticeIdx"; |
| 1001 const char* lattice = "lattice"; | 1004 const char* lattice = "lattice"; |
| 1002 const char* perlinNoise = "4096.0"; | 1005 const char* perlinNoise = "4096.0"; |
| 1003 const char* inc8bit = "0.00390625"; // 1.0 / 256.0 | 1006 const char* inc8bit = "0.00390625"; // 1.0 / 256.0 |
| 1004 // This is the math to convert the two 16bit integer packed into rgba 8 bit input into a | 1007 // This is the math to convert the two 16bit integer packed into rgba 8 bit input into a |
| 1005 // [-1,1] vector and perform a dot product between that vector and the provi ded vector. | 1008 // [-1,1] vector and perform a dot product between that vector and the provi ded vector. |
| 1006 const char* dotLattice = "dot(((%s.ga + %s.rb * vec2(%s)) * vec2(2.0) - vec 2(1.0)), %s);"; | 1009 const char* dotLattice = "dot(((%s.ga + %s.rb * vec2(%s)) * vec2(2.0) - vec 2(1.0)), %s);"; |
| 1007 | 1010 |
| 1008 // There are 4 lines, so the center of each line is 1/8, 3/8, 5/8 and 7/8 | 1011 // Add noise function |
| 1009 builder->fsCodeAppendf("\t\tconst vec4 %s = vec4(0.125, 0.375, 0.625, 0.875) ;", chanCoords); | 1012 static const GrGLShaderVar perlinnoise_Args[] = { |
|
bsalomon
2013/06/10 13:39:25
We already have two conventions for static const g
| |
| 1013 GrGLShaderVar(chanCoord, kFloat_GrSLType), | |
| 1014 GrGLShaderVar(noiseVec, kVec2f_GrSLType) | |
| 1015 }; | |
| 1010 | 1016 |
| 1011 // There are rounding errors if the floor operation is not performed here | 1017 static const GrGLShaderVar perlinnoise_stitch_Args[] = { |
| 1012 builder->fsCodeAppendf("\t\tvec2 %s = floor((%s*vec3(%s, 1.0)).xy) * %s;", | 1018 GrGLShaderVar(chanCoord, kFloat_GrSLType), |
| 1013 noiseVecIni, invMatrixUni, vCoords, baseFrequencyUni) ; | 1019 GrGLShaderVar(noiseVec, kVec2f_GrSLType), |
| 1020 GrGLShaderVar(stitchData, kVec4f_GrSLType) | |
| 1021 }; | |
| 1014 | 1022 |
| 1015 // Loop over the 4 channels | 1023 SkString noise_code; |
|
bsalomon
2013/06/10 13:39:25
localVarsAreLikeThis.
| |
| 1016 builder->fsCodeAppend("\t\tfor (int channel = 3; channel >= 0; --channel) {" ); | |
| 1017 | 1024 |
| 1018 if (fStitchTiles) { | 1025 noise_code.appendf( |
| 1019 // Set up TurbulenceInitial stitch values. | 1026 "\tvec4 %s = vec4(floor(%s) + vec2(%s), fract(%s));", |
| 1020 builder->fsCodeAppendf("\t\tvec4 %s = %s;", stitchData, stitchDataUni); | 1027 noiseXY, noiseVec, perlinNoise, noiseVec); |
| 1021 } | |
| 1022 | |
| 1023 builder->fsCodeAppendf("\t\t%s[channel] = 0.0;", outputColor); | |
| 1024 | |
| 1025 builder->fsCodeAppendf("\t\tfloat %s = 1.0;", ratio); | |
| 1026 builder->fsCodeAppendf("\t\tvec2 %s = %s;", noiseVec, noiseVecIni); | |
| 1027 | |
| 1028 // Loop over all octaves | |
| 1029 builder->fsCodeAppendf("\t\tfor (int octave = 0; octave < %d; ++octave) {", fNumOctaves); | |
| 1030 | |
| 1031 builder->fsCodeAppendf("\t\tvec4 %s = vec4(floor(%s) + vec2(%s), fract(%s)); ", | |
| 1032 noiseXY, noiseVec, perlinNoise, noiseVec); | |
| 1033 | 1028 |
| 1034 // smooth curve : t * t * (3 - 2 * t) | 1029 // smooth curve : t * t * (3 - 2 * t) |
| 1035 builder->fsCodeAppendf("\t\tvec2 %s = %s.zw * %s.zw * (vec2(3.0) - vec2(2.0) * %s.zw);", | 1030 noise_code.appendf("\n\tvec2 %s = %s.zw * %s.zw * (vec2(3.0) - vec2(2.0) * % s.zw);", |
| 1036 noiseSmooth, noiseXY, noiseXY, noiseXY); | 1031 noiseSmooth, noiseXY, noiseXY, noiseXY); |
| 1037 | 1032 |
| 1038 // Adjust frequencies if we're stitching tiles | 1033 // Adjust frequencies if we're stitching tiles |
| 1039 if (fStitchTiles) { | 1034 if (fStitchTiles) { |
| 1040 builder->fsCodeAppendf("\t\tif(%s.x >= %s.y) { %s.x -= %s.x; }", | 1035 noise_code.appendf("\n\tif(%s.x >= %s.y) { %s.x -= %s.x; }", |
| 1041 noiseXY, stitchData, noiseXY, stitchData); | 1036 noiseXY, stitchData, noiseXY, stitchData); |
| 1042 builder->fsCodeAppendf("\t\tif(%s.x >= (%s.y - 1.0)) { %s.x -= (%s.x - 1 .0); }", | 1037 noise_code.appendf("\n\tif(%s.x >= (%s.y - 1.0)) { %s.x -= (%s.x - 1.0); }", |
| 1043 noiseXY, stitchData, noiseXY, stitchData); | 1038 noiseXY, stitchData, noiseXY, stitchData); |
| 1044 builder->fsCodeAppendf("\t\tif(%s.y >= %s.w) { %s.y -= %s.z; }", | 1039 noise_code.appendf("\n\tif(%s.y >= %s.w) { %s.y -= %s.z; }", |
| 1045 noiseXY, stitchData, noiseXY, stitchData); | 1040 noiseXY, stitchData, noiseXY, stitchData); |
| 1046 builder->fsCodeAppendf("\t\tif(%s.y >= (%s.w - 1.0)) { %s.y -= (%s.z - 1 .0); }", | 1041 noise_code.appendf("\n\tif(%s.y >= (%s.w - 1.0)) { %s.y -= (%s.z - 1.0); }", |
| 1047 noiseXY, stitchData, noiseXY, stitchData); | 1042 noiseXY, stitchData, noiseXY, stitchData); |
| 1048 } | 1043 } |
| 1049 | 1044 |
| 1050 // Get texture coordinates and normalize | 1045 // Get texture coordinates and normalize |
| 1051 builder->fsCodeAppendf("\t\t%s.xy = fract(floor(mod(%s.xy, 256.0)) / vec2(25 6.0));", | 1046 noise_code.appendf("\n\t%s.xy = fract(floor(mod(%s.xy, 256.0)) / vec2(256.0) );\n", |
| 1052 noiseXY, noiseXY); | 1047 noiseXY, noiseXY); |
| 1053 | 1048 |
| 1054 // Get permutation for x | 1049 // Get permutation for x |
| 1055 { | 1050 { |
| 1056 SkString xCoords(""); | 1051 SkString xCoords(""); |
| 1057 xCoords.appendf("vec2(%s.x, 0.5)", noiseXY); | 1052 xCoords.appendf("vec2(%s.x, 0.5)", noiseXY); |
| 1058 | 1053 |
| 1059 builder->fsCodeAppendf("\t\tvec2 %s;\t\t%s.x = ", latticeIdx, latticeIdx ); | 1054 noise_code.appendf("\n\tvec2 %s;\n\t%s.x = ", latticeIdx, latticeIdx); |
| 1060 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, | 1055 builder->appendTextureLookup(&noise_code, samplers[0], xCoords.c_str(), kVec2f_GrSLType); |
| 1061 samplers[0], xCoords.c_str(), kVec2f_GrSLTy pe); | 1056 noise_code.append(".r;"); |
| 1062 builder->fsCodeAppend(".r;\n"); | |
| 1063 } | 1057 } |
| 1064 | 1058 |
| 1065 // Get permutation for x + 1 | 1059 // Get permutation for x + 1 |
| 1066 { | 1060 { |
| 1067 SkString xCoords(""); | 1061 SkString xCoords(""); |
| 1068 xCoords.appendf("vec2(fract(%s.x + %s), 0.5)", noiseXY, inc8bit); | 1062 xCoords.appendf("vec2(fract(%s.x + %s), 0.5)", noiseXY, inc8bit); |
| 1069 | 1063 |
| 1070 builder->fsCodeAppendf("\t\t%s.y = ", latticeIdx); | 1064 noise_code.appendf("\n\t%s.y = ", latticeIdx); |
| 1071 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, | 1065 builder->appendTextureLookup(&noise_code, samplers[0], xCoords.c_str(), kVec2f_GrSLType); |
| 1072 samplers[0], xCoords.c_str(), kVec2f_GrSLTy pe); | 1066 noise_code.append(".r;"); |
| 1073 builder->fsCodeAppend(".r;\n"); | |
| 1074 } | 1067 } |
| 1075 | 1068 |
| 1076 // Get (x,y) coordinates with the permutated x | 1069 // Get (x,y) coordinates with the permutated x |
| 1077 builder->fsCodeAppendf("\t\t%s = fract(%s + %s.yy);", latticeIdx, latticeIdx , noiseXY); | 1070 noise_code.appendf("\n\t%s = fract(%s + %s.yy);", latticeIdx, latticeIdx, no iseXY); |
| 1078 | 1071 |
| 1079 builder->fsCodeAppendf("\t\tvec2 %s = %s.zw;", fractVal, noiseXY); | 1072 noise_code.appendf("\n\tvec2 %s = %s.zw;", fractVal, noiseXY); |
| 1080 | 1073 |
| 1081 builder->fsCodeAppendf("\t\tvec2 %s;", uv); | 1074 noise_code.appendf("\n\n\tvec2 %s;", uv); |
| 1082 // Compute u, at offset (0,0) | 1075 // Compute u, at offset (0,0) |
| 1083 { | 1076 { |
| 1084 SkString latticeCoords(""); | 1077 SkString latticeCoords(""); |
| 1085 latticeCoords.appendf("vec2(%s.x, %s[channel])", latticeIdx, chanCoords) ; | 1078 latticeCoords.appendf("vec2(%s.x, %s)", latticeIdx, chanCoord); |
| 1086 builder->fsCodeAppendf("vec4 %s = ", lattice); | 1079 noise_code.appendf("\n\tvec4 %s = ", lattice); |
| 1087 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, | 1080 builder->appendTextureLookup(&noise_code, samplers[1], latticeCoords.c_s tr(), |
| 1088 samplers[1], latticeCoords.c_str(), kVec2f_ GrSLType); | 1081 kVec2f_GrSLType); |
| 1089 builder->fsCodeAppendf(".bgra;\n\t\t%s.x = ", uv); | 1082 noise_code.appendf(".bgra;\n\t%s.x = ", uv); |
| 1090 builder->fsCodeAppendf(dotLattice, lattice, lattice, inc8bit, fractVal); | 1083 noise_code.appendf(dotLattice, lattice, lattice, inc8bit, fractVal); |
| 1091 } | 1084 } |
| 1092 | 1085 |
| 1093 builder->fsCodeAppendf("\t\t%s.x -= 1.0;", fractVal); | 1086 noise_code.appendf("\n\t%s.x -= 1.0;", fractVal); |
| 1094 // Compute v, at offset (-1,0) | 1087 // Compute v, at offset (-1,0) |
| 1095 { | 1088 { |
| 1096 SkString latticeCoords(""); | 1089 SkString latticeCoords(""); |
| 1097 latticeCoords.appendf("vec2(%s.y, %s[channel])", latticeIdx, chanCoords) ; | 1090 latticeCoords.appendf("vec2(%s.y, %s)", latticeIdx, chanCoord); |
| 1098 builder->fsCodeAppend("lattice = "); | 1091 noise_code.append("lattice = "); |
| 1099 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, | 1092 builder->appendTextureLookup(&noise_code, samplers[1], latticeCoords.c_s tr(), |
| 1100 samplers[1], latticeCoords.c_str(), kVec2f_ GrSLType); | 1093 kVec2f_GrSLType); |
| 1101 builder->fsCodeAppendf(".bgra;\n\t\t%s.y = ", uv); | 1094 noise_code.appendf(".bgra;\n\t%s.y = ", uv); |
| 1102 builder->fsCodeAppendf(dotLattice, lattice, lattice, inc8bit, fractVal); | 1095 noise_code.appendf(dotLattice, lattice, lattice, inc8bit, fractVal); |
| 1103 } | 1096 } |
| 1104 | 1097 |
| 1105 // Compute 'a' as a linear interpolation of 'u' and 'v' | 1098 // Compute 'a' as a linear interpolation of 'u' and 'v' |
| 1106 builder->fsCodeAppendf("\t\tvec2 %s;", ab); | 1099 noise_code.appendf("\n\tvec2 %s;", ab); |
| 1107 builder->fsCodeAppendf("\t\t%s.x = mix(%s.x, %s.y, %s.x);", ab, uv, uv, nois eSmooth); | 1100 noise_code.appendf("\n\t%s.x = mix(%s.x, %s.y, %s.x);", ab, uv, uv, noiseSmo oth); |
| 1108 | 1101 |
| 1109 builder->fsCodeAppendf("\t\t%s.y -= 1.0;", fractVal); | 1102 noise_code.appendf("\n\t%s.y -= 1.0;", fractVal); |
| 1110 // Compute v, at offset (-1,-1) | 1103 // Compute v, at offset (-1,-1) |
| 1111 { | 1104 { |
| 1112 SkString latticeCoords(""); | 1105 SkString latticeCoords(""); |
| 1113 latticeCoords.appendf("vec2(fract(%s.y + %s), %s[channel])", | 1106 latticeCoords.appendf("vec2(fract(%s.y + %s), %s)", latticeIdx, inc8bit, chanCoord); |
| 1114 latticeIdx, inc8bit, chanCoords); | 1107 noise_code.append("lattice = "); |
| 1115 builder->fsCodeAppend("lattice = "); | 1108 builder->appendTextureLookup(&noise_code, samplers[1], latticeCoords.c_s tr(), |
| 1116 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, | 1109 kVec2f_GrSLType); |
| 1117 samplers[1], latticeCoords.c_str(), kVec2f_ GrSLType); | 1110 noise_code.appendf(".bgra;\n\t%s.y = ", uv); |
| 1118 builder->fsCodeAppendf(".bgra;\n\t\t%s.y = ", uv); | 1111 noise_code.appendf(dotLattice, lattice, lattice, inc8bit, fractVal); |
| 1119 builder->fsCodeAppendf(dotLattice, lattice, lattice, inc8bit, fractVal); | |
| 1120 } | 1112 } |
| 1121 | 1113 |
| 1122 builder->fsCodeAppendf("\t\t%s.x += 1.0;", fractVal); | 1114 noise_code.appendf("\n\t%s.x += 1.0;", fractVal); |
| 1123 // Compute u, at offset (0,-1) | 1115 // Compute u, at offset (0,-1) |
| 1124 { | 1116 { |
| 1125 SkString latticeCoords(""); | 1117 SkString latticeCoords(""); |
| 1126 latticeCoords.appendf("vec2(fract(%s.x + %s), %s[channel])", | 1118 latticeCoords.appendf("vec2(fract(%s.x + %s), %s)", latticeIdx, inc8bit, chanCoord); |
| 1127 latticeIdx, inc8bit, chanCoords); | 1119 noise_code.append("lattice = "); |
| 1128 builder->fsCodeAppend("lattice = "); | 1120 builder->appendTextureLookup(&noise_code, samplers[1], latticeCoords.c_s tr(), |
| 1129 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType, | 1121 kVec2f_GrSLType); |
| 1130 samplers[1], latticeCoords.c_str(), kVec2f_ GrSLType); | 1122 noise_code.appendf(".bgra;\n\t%s.x = ", uv); |
| 1131 builder->fsCodeAppendf(".bgra;\n\t\t%s.x = ", uv); | 1123 noise_code.appendf(dotLattice, lattice, lattice, inc8bit, fractVal); |
| 1132 builder->fsCodeAppendf(dotLattice, lattice, lattice, inc8bit, fractVal); | |
| 1133 } | 1124 } |
| 1134 | 1125 |
| 1135 // Compute 'b' as a linear interpolation of 'u' and 'v' | 1126 // Compute 'b' as a linear interpolation of 'u' and 'v' |
| 1136 builder->fsCodeAppendf("\t\t%s.y = mix(%s.x, %s.y, %s.x);", ab, uv, uv, nois eSmooth); | 1127 noise_code.appendf("\n\t%s.y = mix(%s.x, %s.y, %s.x);", ab, uv, uv, noiseSmo oth); |
| 1137 // Compute the noise as a linear interpolation of 'a' and 'b' | 1128 // Compute the noise as a linear interpolation of 'a' and 'b' |
| 1138 builder->fsCodeAppendf("\t\tfloat %s = mix(%s.x, %s.y, %s.y);", noise, ab, a b, noiseSmooth); | 1129 noise_code.appendf("\n\treturn mix(%s.x, %s.y, %s.y);\n", ab, ab, noiseSmoot h); |
| 1139 | 1130 |
| 1140 builder->fsCodeAppendf("\t\t%s[channel] += ", outputColor); | 1131 SkString noise_funcName; |
| 1141 builder->fsCodeAppendf((fType == SkPerlinNoiseShader::kFractalNoise_Type) ? | 1132 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, kFloat_GrSLTy pe, "perlinnoise", |
|
bsalomon
2013/06/10 13:39:25
Would this be easier to read if the there was just
| |
| 1142 "%s / %s;" : "abs(%s) / %s;", noise, ratio); | 1133 fStitchTiles ? SK_ARRAY_COUNT(perlinnoise_stitch_Args) : |
| 1134 SK_ARRAY_COUNT(perlinnoise_Args), | |
| 1135 fStitchTiles ? perlinnoise_stitch_Args : perlinnoise_A rgs, | |
| 1136 noise_code.c_str(), &noise_funcName); | |
| 1143 | 1137 |
| 1144 builder->fsCodeAppendf("\t\t%s *= vec2(2.0);", noiseVec); | 1138 // There are rounding errors if the floor operation is not performed here |
| 1145 builder->fsCodeAppendf("\t\t%s *= 2.0;", ratio); | 1139 builder->fsCodeAppendf("\n\t\tvec2 %s = floor((%s * vec3(%s, 1.0)).xy) * %s; ", |
| 1140 noiseVec, invMatrixUni, vCoords, baseFrequencyUni); | |
| 1141 | |
| 1142 // Clear the color accumulator | |
| 1143 builder->fsCodeAppendf("\n\t\t%s = vec4(0.0);", outputColor); | |
| 1146 | 1144 |
| 1147 if (fStitchTiles) { | 1145 if (fStitchTiles) { |
| 1148 builder->fsCodeAppendf("\t\t%s.xz *= vec2(2.0);", stitchData); | 1146 // Set up TurbulenceInitial stitch values. |
| 1149 builder->fsCodeAppendf("\t\t%s.yw = %s.xz + vec2(%s);", stitchData, stit chData, perlinNoise); | 1147 builder->fsCodeAppendf("\n\t\tvec4 %s = %s;", stitchData, stitchDataUni) ; |
| 1150 } | 1148 } |
| 1151 builder->fsCodeAppend("\t\t}"); // end of the for loop on octaves | |
| 1152 | 1149 |
| 1153 builder->fsCodeAppend("\t\t}"); // end of the for loop on channels | 1150 builder->fsCodeAppendf("\n\t\tfloat %s = 1.0;", ratio); |
| 1151 | |
| 1152 // Loop over all octaves | |
| 1153 builder->fsCodeAppendf("\n\t\tfor (int octave = 0; octave < %d; ++octave) {" , fNumOctaves); | |
| 1154 | |
| 1155 builder->fsCodeAppendf("\n\t\t\t%s += ", outputColor); | |
| 1156 if (fType != SkPerlinNoiseShader::kFractalNoise_Type) { | |
| 1157 builder->fsCodeAppend("abs("); | |
| 1158 } | |
| 1159 if (fStitchTiles) { | |
| 1160 builder->fsCodeAppendf( | |
| 1161 "vec4(\n\t\t\t\t%s(%s, %s, %s),\n\t\t\t\t%s(%s, %s, %s)," | |
| 1162 "\n\t\t\t\t%s(%s, %s, %s),\n\t\t\t\t%s(%s, %s, %s))", | |
| 1163 noise_funcName.c_str(), chanCoordR, noiseVec, stitchData, | |
| 1164 noise_funcName.c_str(), chanCoordG, noiseVec, stitchData, | |
| 1165 noise_funcName.c_str(), chanCoordB, noiseVec, stitchData, | |
| 1166 noise_funcName.c_str(), chanCoordA, noiseVec, stitchData); | |
| 1167 } else { | |
| 1168 builder->fsCodeAppendf( | |
| 1169 "vec4(\n\t\t\t\t%s(%s, %s),\n\t\t\t\t%s(%s, %s)," | |
| 1170 "\n\t\t\t\t%s(%s, %s),\n\t\t\t\t%s(%s, %s))", | |
| 1171 noise_funcName.c_str(), chanCoordR, noiseVec, | |
| 1172 noise_funcName.c_str(), chanCoordG, noiseVec, | |
| 1173 noise_funcName.c_str(), chanCoordB, noiseVec, | |
| 1174 noise_funcName.c_str(), chanCoordA, noiseVec); | |
| 1175 } | |
| 1176 if (fType != SkPerlinNoiseShader::kFractalNoise_Type) { | |
| 1177 builder->fsCodeAppendf(")"); // end of "abs(" | |
| 1178 } | |
| 1179 builder->fsCodeAppendf(" * %s;", ratio); | |
| 1180 | |
| 1181 builder->fsCodeAppendf("\n\t\t\t%s *= vec2(2.0);", noiseVec); | |
| 1182 builder->fsCodeAppendf("\n\t\t\t%s *= 0.5;", ratio); | |
| 1183 | |
| 1184 if (fStitchTiles) { | |
| 1185 builder->fsCodeAppendf("\n\t\t\t%s.xz *= vec2(2.0);", stitchData); | |
| 1186 builder->fsCodeAppendf("\n\t\t\t%s.yw = %s.xz + vec2(%s);", stitchData, stitchData, perlinNoise); | |
| 1187 } | |
| 1188 builder->fsCodeAppend("\n\t\t}"); // end of the for loop on octaves | |
| 1154 | 1189 |
| 1155 if (fType == SkPerlinNoiseShader::kFractalNoise_Type) { | 1190 if (fType == SkPerlinNoiseShader::kFractalNoise_Type) { |
| 1156 // The value of turbulenceFunctionResult comes from ((turbulenceFunction Result) + 1) / 2 | 1191 // The value of turbulenceFunctionResult comes from ((turbulenceFunction Result) + 1) / 2 |
| 1157 // by fractalNoise and (turbulenceFunctionResult) by turbulence. | 1192 // by fractalNoise and (turbulenceFunctionResult) by turbulence. |
| 1158 builder->fsCodeAppendf("\t\t%s = %s * vec4(0.5) + vec4(0.5);", outputCol or, outputColor); | 1193 builder->fsCodeAppendf("\n\t\t%s = %s * vec4(0.5) + vec4(0.5);", outputC olor, outputColor); |
| 1159 } | 1194 } |
| 1160 | 1195 |
| 1161 builder->fsCodeAppendf("\t\t%s.a *= %s;", outputColor, alphaUni); | 1196 builder->fsCodeAppendf("\n\t\t%s.a *= %s;", outputColor, alphaUni); |
| 1162 | 1197 |
| 1163 // Clamp values | 1198 // Clamp values |
| 1164 builder->fsCodeAppendf("\t\t%s = clamp(%s, 0.0, 1.0);", outputColor, outputC olor); | 1199 builder->fsCodeAppendf("\n\t\t%s = clamp(%s, 0.0, 1.0);", outputColor, outpu tColor); |
| 1165 | 1200 |
| 1166 // Pre-multiply the result | 1201 // Pre-multiply the result |
| 1167 builder->fsCodeAppendf("\t\t%s = vec4(%s.rgb * %s.aaa, %s.a);\n", | 1202 builder->fsCodeAppendf("\n\t\t%s = vec4(%s.rgb * %s.aaa, %s.a);\n", |
| 1168 outputColor, outputColor, outputColor, outputColor); | 1203 outputColor, outputColor, outputColor, outputColor); |
| 1169 } | 1204 } |
| 1170 | 1205 |
| 1171 GrGLNoise::GrGLNoise(const GrBackendEffectFactory& factory, const GrDrawEffect& drawEffect) | 1206 GrGLNoise::GrGLNoise(const GrBackendEffectFactory& factory, const GrDrawEffect& drawEffect) |
| 1172 : INHERITED (factory) | 1207 : INHERITED (factory) |
| 1173 , fType(drawEffect.castEffect<GrPerlinNoiseEffect>().type()) | 1208 , fType(drawEffect.castEffect<GrPerlinNoiseEffect>().type()) |
| 1174 , fStitchTiles(drawEffect.castEffect<GrPerlinNoiseEffect>().stitchTiles()) | 1209 , fStitchTiles(drawEffect.castEffect<GrPerlinNoiseEffect>().stitchTiles()) |
| 1175 , fNumOctaves(drawEffect.castEffect<GrPerlinNoiseEffect>().numOctaves()) | 1210 , fNumOctaves(drawEffect.castEffect<GrPerlinNoiseEffect>().numOctaves()) |
| 1176 , fEffectMatrix(drawEffect.castEffect<GrPerlinNoiseEffect>().coordsType()) { | 1211 , fEffectMatrix(drawEffect.castEffect<GrPerlinNoiseEffect>().coordsType()) { |
| 1177 } | 1212 } |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1288 GrUnlockAndUnrefCachedBitmapTexture(noiseTexture); | 1323 GrUnlockAndUnrefCachedBitmapTexture(noiseTexture); |
| 1289 } | 1324 } |
| 1290 #endif | 1325 #endif |
| 1291 | 1326 |
| 1292 return effect; | 1327 return effect; |
| 1293 } | 1328 } |
| 1294 | 1329 |
| 1295 #else | 1330 #else |
| 1296 | 1331 |
| 1297 GrEffectRef* SkPerlinNoiseShader::asNewEffect(GrContext*, const SkPaint&) const { | 1332 GrEffectRef* SkPerlinNoiseShader::asNewEffect(GrContext*, const SkPaint&) const { |
| 1298 #if !defined(SK_BUILD_FOR_ANDROID) && !defined(SK_BUILD_FOR_WIN) | 1333 #if !defined(SK_BUILD_FOR_ANDROID) |
| 1299 SkDEBUGFAIL("Should not call in GPU-less build"); | 1334 SkDEBUGFAIL("Should not call in GPU-less build"); |
| 1300 #endif | 1335 #endif |
| 1301 return NULL; | 1336 return NULL; |
| 1302 } | 1337 } |
| 1303 | 1338 |
| 1304 #endif | 1339 #endif |
| 1305 | 1340 |
| 1306 #ifdef SK_DEVELOPER | 1341 #ifdef SK_DEVELOPER |
| 1307 void SkPerlinNoiseShader::toString(SkString* str) const { | 1342 void SkPerlinNoiseShader::toString(SkString* str) const { |
| 1308 str->append("SkPerlinNoiseShader: ("); | 1343 str->append("SkPerlinNoiseShader: ("); |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 1328 str->append(" seed: "); | 1363 str->append(" seed: "); |
| 1329 str->appendScalar(fSeed); | 1364 str->appendScalar(fSeed); |
| 1330 str->append(" stitch tiles: "); | 1365 str->append(" stitch tiles: "); |
| 1331 str->append(fStitchTiles ? "true " : "false "); | 1366 str->append(fStitchTiles ? "true " : "false "); |
| 1332 | 1367 |
| 1333 this->INHERITED::toString(str); | 1368 this->INHERITED::toString(str); |
| 1334 | 1369 |
| 1335 str->append(")"); | 1370 str->append(")"); |
| 1336 } | 1371 } |
| 1337 #endif | 1372 #endif |
| OLD | NEW |