1*c8dee2aaSAndroid Build Coastguard Worker // Copyright 2024 Google LLC.
2*c8dee2aaSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
3*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fiddle/examples.h"
4*c8dee2aaSAndroid Build Coastguard Worker REG_FIDDLE(SkSL_LinearSRGB, 256, 128, false, 0) {
draw(SkCanvas * canvas)5*c8dee2aaSAndroid Build Coastguard Worker void draw(SkCanvas* canvas) {
6*c8dee2aaSAndroid Build Coastguard Worker // Make a simple lighting effect:
7*c8dee2aaSAndroid Build Coastguard Worker auto litEffect = SkRuntimeEffect::MakeForShader(SkString(R"(
8*c8dee2aaSAndroid Build Coastguard Worker layout(color) uniform vec3 surfaceColor;
9*c8dee2aaSAndroid Build Coastguard Worker uniform int doLinearLighting;
10*c8dee2aaSAndroid Build Coastguard Worker
11*c8dee2aaSAndroid Build Coastguard Worker vec3 normal_at(vec2 p) {
12*c8dee2aaSAndroid Build Coastguard Worker p = (p / 128) * 2 - 1;
13*c8dee2aaSAndroid Build Coastguard Worker float len2 = dot(p, p);
14*c8dee2aaSAndroid Build Coastguard Worker vec3 n = (len2 > 1) ? vec3(0, 0, 1) : vec3(p, sqrt(1 - len2));
15*c8dee2aaSAndroid Build Coastguard Worker return normalize(n);
16*c8dee2aaSAndroid Build Coastguard Worker }
17*c8dee2aaSAndroid Build Coastguard Worker
18*c8dee2aaSAndroid Build Coastguard Worker vec4 main(vec2 p) {
19*c8dee2aaSAndroid Build Coastguard Worker vec3 n = normal_at(p);
20*c8dee2aaSAndroid Build Coastguard Worker vec3 l = normalize(vec3(-1, -1, 0.5));
21*c8dee2aaSAndroid Build Coastguard Worker vec3 C = surfaceColor;
22*c8dee2aaSAndroid Build Coastguard Worker
23*c8dee2aaSAndroid Build Coastguard Worker if (doLinearLighting != 0) { C = toLinearSrgb(C); }
24*c8dee2aaSAndroid Build Coastguard Worker C *= saturate(dot(n, l));
25*c8dee2aaSAndroid Build Coastguard Worker if (doLinearLighting != 0) { C = fromLinearSrgb(C); }
26*c8dee2aaSAndroid Build Coastguard Worker
27*c8dee2aaSAndroid Build Coastguard Worker return C.rgb1;
28*c8dee2aaSAndroid Build Coastguard Worker })")).effect;
29*c8dee2aaSAndroid Build Coastguard Worker SkRuntimeShaderBuilder builder(litEffect);
30*c8dee2aaSAndroid Build Coastguard Worker builder.uniform("surfaceColor") = SkV3{0.8, 0.8, 0.8};
31*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint;
32*c8dee2aaSAndroid Build Coastguard Worker
33*c8dee2aaSAndroid Build Coastguard Worker // FIRST: Draw the lit sphere without converting to linear sRGB.
34*c8dee2aaSAndroid Build Coastguard Worker // This produces INCORRECT light falloff.
35*c8dee2aaSAndroid Build Coastguard Worker builder.uniform("doLinearLighting") = 0;
36*c8dee2aaSAndroid Build Coastguard Worker paint.setShader(builder.makeShader());
37*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect({0,0,128,128}, paint);
38*c8dee2aaSAndroid Build Coastguard Worker
39*c8dee2aaSAndroid Build Coastguard Worker // SECOND: Draw the lit sphere with math done in linear sRGB.
40*c8dee2aaSAndroid Build Coastguard Worker // This produces sharper falloff, which is CORRECT.
41*c8dee2aaSAndroid Build Coastguard Worker builder.uniform("doLinearLighting") = 1;
42*c8dee2aaSAndroid Build Coastguard Worker paint.setShader(builder.makeShader());
43*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(128, 0);
44*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect({0,0,128,128}, paint);
45*c8dee2aaSAndroid Build Coastguard Worker }
46*c8dee2aaSAndroid Build Coastguard Worker } // END FIDDLE
47