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