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