xref: /aosp_15_r20/cts/hostsidetests/sustainedperf/shadertoy_android/jni/shaders.cpp (revision b7c941bb3fa97aba169d73cee0bed2de8ac964bf)
1*b7c941bbSAndroid Build Coastguard Worker /*
2*b7c941bbSAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*b7c941bbSAndroid Build Coastguard Worker  *
4*b7c941bbSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*b7c941bbSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*b7c941bbSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*b7c941bbSAndroid Build Coastguard Worker  *
8*b7c941bbSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*b7c941bbSAndroid Build Coastguard Worker  *
10*b7c941bbSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*b7c941bbSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*b7c941bbSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*b7c941bbSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*b7c941bbSAndroid Build Coastguard Worker  * limitations under the License.
15*b7c941bbSAndroid Build Coastguard Worker  */
16*b7c941bbSAndroid Build Coastguard Worker 
17*b7c941bbSAndroid Build Coastguard Worker #include <string>
18*b7c941bbSAndroid Build Coastguard Worker 
19*b7c941bbSAndroid Build Coastguard Worker std::string g_shader = R"(
20*b7c941bbSAndroid Build Coastguard Worker 
21*b7c941bbSAndroid Build Coastguard Worker // various noise functions
22*b7c941bbSAndroid Build Coastguard Worker float Hash2d(vec2 uv)
23*b7c941bbSAndroid Build Coastguard Worker {
24*b7c941bbSAndroid Build Coastguard Worker     float f = uv.x + uv.y * 47.0;
25*b7c941bbSAndroid Build Coastguard Worker     return fract(cos(f*3.333)*100003.9);
26*b7c941bbSAndroid Build Coastguard Worker }
27*b7c941bbSAndroid Build Coastguard Worker float Hash3d(vec3 uv)
28*b7c941bbSAndroid Build Coastguard Worker {
29*b7c941bbSAndroid Build Coastguard Worker     float f = uv.x + uv.y * 37.0 + uv.z * 521.0;
30*b7c941bbSAndroid Build Coastguard Worker     return fract(cos(f*3.333)*100003.9);
31*b7c941bbSAndroid Build Coastguard Worker }
32*b7c941bbSAndroid Build Coastguard Worker float mixP(float f0, float f1, float a)
33*b7c941bbSAndroid Build Coastguard Worker {
34*b7c941bbSAndroid Build Coastguard Worker     return mix(f0, f1, a*a*(3.0-2.0*a));
35*b7c941bbSAndroid Build Coastguard Worker }
36*b7c941bbSAndroid Build Coastguard Worker const vec2 zeroOne = vec2(0.0, 1.0);
37*b7c941bbSAndroid Build Coastguard Worker float noise2d(vec2 uv)
38*b7c941bbSAndroid Build Coastguard Worker {
39*b7c941bbSAndroid Build Coastguard Worker     vec2 fr = fract(uv.xy);
40*b7c941bbSAndroid Build Coastguard Worker     vec2 fl = floor(uv.xy);
41*b7c941bbSAndroid Build Coastguard Worker     float h00 = Hash2d(fl);
42*b7c941bbSAndroid Build Coastguard Worker     float h10 = Hash2d(fl + zeroOne.yx);
43*b7c941bbSAndroid Build Coastguard Worker     float h01 = Hash2d(fl + zeroOne);
44*b7c941bbSAndroid Build Coastguard Worker     float h11 = Hash2d(fl + zeroOne.yy);
45*b7c941bbSAndroid Build Coastguard Worker     return mixP(mixP(h00, h10, fr.x), mixP(h01, h11, fr.x), fr.y);
46*b7c941bbSAndroid Build Coastguard Worker }
47*b7c941bbSAndroid Build Coastguard Worker float noise2dT(vec2 uv)
48*b7c941bbSAndroid Build Coastguard Worker {
49*b7c941bbSAndroid Build Coastguard Worker     vec2 fr = fract(uv);
50*b7c941bbSAndroid Build Coastguard Worker     vec2 smooth = fr*fr*(3.0-2.0*fr);
51*b7c941bbSAndroid Build Coastguard Worker     vec2 fl = floor(uv);
52*b7c941bbSAndroid Build Coastguard Worker     uv = smooth + fl;
53*b7c941bbSAndroid Build Coastguard Worker     return texture2D(iChannel0, (uv + 0.5)/iChannelResolution[0].xy).y; // use constant here instead?
54*b7c941bbSAndroid Build Coastguard Worker }
55*b7c941bbSAndroid Build Coastguard Worker float noise(vec3 uv)
56*b7c941bbSAndroid Build Coastguard Worker {
57*b7c941bbSAndroid Build Coastguard Worker     vec3 fr = fract(uv.xyz);
58*b7c941bbSAndroid Build Coastguard Worker     vec3 fl = floor(uv.xyz);
59*b7c941bbSAndroid Build Coastguard Worker     float h000 = Hash3d(fl);
60*b7c941bbSAndroid Build Coastguard Worker     float h100 = Hash3d(fl + zeroOne.yxx);
61*b7c941bbSAndroid Build Coastguard Worker     float h010 = Hash3d(fl + zeroOne.xyx);
62*b7c941bbSAndroid Build Coastguard Worker     float h110 = Hash3d(fl + zeroOne.yyx);
63*b7c941bbSAndroid Build Coastguard Worker     float h001 = Hash3d(fl + zeroOne.xxy);
64*b7c941bbSAndroid Build Coastguard Worker     float h101 = Hash3d(fl + zeroOne.yxy);
65*b7c941bbSAndroid Build Coastguard Worker     float h011 = Hash3d(fl + zeroOne.xyy);
66*b7c941bbSAndroid Build Coastguard Worker     float h111 = Hash3d(fl + zeroOne.yyy);
67*b7c941bbSAndroid Build Coastguard Worker     return mixP(
68*b7c941bbSAndroid Build Coastguard Worker         mixP(mixP(h000, h100, fr.x), mixP(h010, h110, fr.x), fr.y),
69*b7c941bbSAndroid Build Coastguard Worker         mixP(mixP(h001, h101, fr.x), mixP(h011, h111, fr.x), fr.y)
70*b7c941bbSAndroid Build Coastguard Worker         , fr.z);
71*b7c941bbSAndroid Build Coastguard Worker }
72*b7c941bbSAndroid Build Coastguard Worker 
73*b7c941bbSAndroid Build Coastguard Worker float PI=3.14159265;
74*b7c941bbSAndroid Build Coastguard Worker 
75*b7c941bbSAndroid Build Coastguard Worker vec3 saturate(vec3 a)
76*b7c941bbSAndroid Build Coastguard Worker {
77*b7c941bbSAndroid Build Coastguard Worker     return clamp(a, 0.0, 1.0);
78*b7c941bbSAndroid Build Coastguard Worker }
79*b7c941bbSAndroid Build Coastguard Worker vec2 saturate(vec2 a)
80*b7c941bbSAndroid Build Coastguard Worker {
81*b7c941bbSAndroid Build Coastguard Worker     return clamp(a, 0.0, 1.0);
82*b7c941bbSAndroid Build Coastguard Worker }
83*b7c941bbSAndroid Build Coastguard Worker float saturate(float a)
84*b7c941bbSAndroid Build Coastguard Worker {
85*b7c941bbSAndroid Build Coastguard Worker     return clamp(a, 0.0, 1.0);
86*b7c941bbSAndroid Build Coastguard Worker }
87*b7c941bbSAndroid Build Coastguard Worker 
88*b7c941bbSAndroid Build Coastguard Worker float Density(vec3 p)
89*b7c941bbSAndroid Build Coastguard Worker {
90*b7c941bbSAndroid Build Coastguard Worker     //float ws = 0.06125*0.125;
91*b7c941bbSAndroid Build Coastguard Worker     //vec3 warp = vec3(noise(p*ws), noise(p*ws + 111.11), noise(p*ws + 7111.11));
92*b7c941bbSAndroid Build Coastguard Worker     float final = noise(p*0.06125);// + sin(iGlobalTime)*0.5-1.95 + warp.x*4.0;
93*b7c941bbSAndroid Build Coastguard Worker     float other = noise(p*0.06125 + 1234.567);
94*b7c941bbSAndroid Build Coastguard Worker     other -= 0.5;
95*b7c941bbSAndroid Build Coastguard Worker     final -= 0.5;
96*b7c941bbSAndroid Build Coastguard Worker     final = 0.1/(abs(final*final*other));
97*b7c941bbSAndroid Build Coastguard Worker     final += 0.5;
98*b7c941bbSAndroid Build Coastguard Worker     return final*0.0001;
99*b7c941bbSAndroid Build Coastguard Worker }
100*b7c941bbSAndroid Build Coastguard Worker 
101*b7c941bbSAndroid Build Coastguard Worker void mainImage( out vec4 fragColor, in vec2 fragCoord )
102*b7c941bbSAndroid Build Coastguard Worker {
103*b7c941bbSAndroid Build Coastguard Worker     // ---------------- First, set up the camera rays for ray marching ----------------
104*b7c941bbSAndroid Build Coastguard Worker     vec2 uv = fragCoord.xy/iResolution.xy * 2.0 - 1.0;// - 0.5;
105*b7c941bbSAndroid Build Coastguard Worker 
106*b7c941bbSAndroid Build Coastguard Worker     // Camera up vector.
107*b7c941bbSAndroid Build Coastguard Worker     vec3 camUp=vec3(0,1,0); // vuv
108*b7c941bbSAndroid Build Coastguard Worker 
109*b7c941bbSAndroid Build Coastguard Worker     // Camera lookat.
110*b7c941bbSAndroid Build Coastguard Worker     vec3 camLookat=vec3(0,0.0,0);   // vrp
111*b7c941bbSAndroid Build Coastguard Worker 
112*b7c941bbSAndroid Build Coastguard Worker     float mx=iMouse.x/iResolution.x*PI*2.0 + iGlobalTime * 0.01;
113*b7c941bbSAndroid Build Coastguard Worker     float my=-iMouse.y/iResolution.y*10.0 + sin(iGlobalTime * 0.03)*0.2+0.2;//*PI/2.01;
114*b7c941bbSAndroid Build Coastguard Worker     vec3 camPos=vec3(cos(my)*cos(mx),sin(my),cos(my)*sin(mx))*(200.2);  // prp
115*b7c941bbSAndroid Build Coastguard Worker 
116*b7c941bbSAndroid Build Coastguard Worker     // Camera setup.
117*b7c941bbSAndroid Build Coastguard Worker     vec3 camVec=normalize(camLookat - camPos);//vpn
118*b7c941bbSAndroid Build Coastguard Worker     vec3 sideNorm=normalize(cross(camUp, camVec));  // u
119*b7c941bbSAndroid Build Coastguard Worker     vec3 upNorm=cross(camVec, sideNorm);//v
120*b7c941bbSAndroid Build Coastguard Worker     vec3 worldFacing=(camPos + camVec);//vcv
121*b7c941bbSAndroid Build Coastguard Worker     vec3 worldPix = worldFacing + uv.x * sideNorm * (iResolution.x/iResolution.y) + uv.y * upNorm;//scrCoord
122*b7c941bbSAndroid Build Coastguard Worker     vec3 relVec = normalize(worldPix - camPos);//scp
123*b7c941bbSAndroid Build Coastguard Worker 
124*b7c941bbSAndroid Build Coastguard Worker     // --------------------------------------------------------------------------------
125*b7c941bbSAndroid Build Coastguard Worker     float t = 0.0;
126*b7c941bbSAndroid Build Coastguard Worker     float inc = 0.02;
127*b7c941bbSAndroid Build Coastguard Worker     float maxDepth = 70.0;
128*b7c941bbSAndroid Build Coastguard Worker     vec3 pos = vec3(0,0,0);
129*b7c941bbSAndroid Build Coastguard Worker     float density = 0.0;
130*b7c941bbSAndroid Build Coastguard Worker     // ray marching time
131*b7c941bbSAndroid Build Coastguard Worker     for (int i = 0; i < 37; i++)    // This is the count of how many times the ray actually marches.
132*b7c941bbSAndroid Build Coastguard Worker     {
133*b7c941bbSAndroid Build Coastguard Worker         if ((t > maxDepth)) break;
134*b7c941bbSAndroid Build Coastguard Worker         pos = camPos + relVec * t;
135*b7c941bbSAndroid Build Coastguard Worker         float temp = Density(pos);
136*b7c941bbSAndroid Build Coastguard Worker         //temp *= saturate(t-1.0);
137*b7c941bbSAndroid Build Coastguard Worker 
138*b7c941bbSAndroid Build Coastguard Worker         inc = 1.9 + temp*0.05;  // add temp because this makes it look extra crazy!
139*b7c941bbSAndroid Build Coastguard Worker         density += temp * inc;
140*b7c941bbSAndroid Build Coastguard Worker         t += inc;
141*b7c941bbSAndroid Build Coastguard Worker     }
142*b7c941bbSAndroid Build Coastguard Worker 
143*b7c941bbSAndroid Build Coastguard Worker     // --------------------------------------------------------------------------------
144*b7c941bbSAndroid Build Coastguard Worker     // Now that we have done our ray marching, let's put some color on this.
145*b7c941bbSAndroid Build Coastguard Worker     vec3 finalColor = vec3(0.01,0.1,1.0)* density*0.2;
146*b7c941bbSAndroid Build Coastguard Worker 
147*b7c941bbSAndroid Build Coastguard Worker     // output the final color with sqrt for "gamma correction"
148*b7c941bbSAndroid Build Coastguard Worker     fragColor = vec4(sqrt(clamp(finalColor, 0.0, 1.0)),1.0);
149*b7c941bbSAndroid Build Coastguard Worker }
150*b7c941bbSAndroid Build Coastguard Worker 
151*b7c941bbSAndroid Build Coastguard Worker 
152*b7c941bbSAndroid Build Coastguard Worker )";
153