Waterflow
Visualize water in terrain
src/shaders/updateHeightShader.comp
Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 
00006 #version 430
00007 
00008 layout(local_size_x = 16, local_size_y = 16) in; 
00009 
00010 
00011 //Since in previous step, (advectWater) we used this as inbuffer and height1 as out. Now we are interested in the new data and want to save it to a out buffer. height0 cotains nothing of value anymore. use it as out data. DO NOT SWAP IN CPP.
00012 
00013 layout  (std430,binding = 4) writeonly buffer height0
00014 {
00015     float water0[];
00016     
00017 };
00018 
00019 layout (std430, binding = 5) readonly buffer height1
00020 {
00021     float water1[]; 
00022 };
00023 
00024 
00025 layout (std430,binding = 7) readonly buffer velocityXout
00026 {
00027     float vxout[];
00028     
00029 };
00030 
00031 
00032 layout (std430,binding = 9) readonly buffer velocityYout
00033 {   
00034     float vyout[];
00035     
00036 };
00037 
00038 layout (std430,binding = 10) readonly buffer Terrain 
00039 {   
00040     float terr[];
00041     
00042 };
00043 
00044 
00045 uniform ivec2 size; 
00046 uniform float dt; 
00047 
00048 void main(){
00049     //determine where to sample
00050     ivec2 storePos = ivec2(gl_GlobalInvocationID.xy);
00051     int i = storePos.x;
00052     int j = storePos.y;
00053     int offset = (i + j*size.x);
00054 
00055     //Change these to clamps.
00056     if(i < size.x && j < size.y) {
00057         int ipos = clamp(i+1,0,size.x-1);
00058         int jpos = clamp(j+1,0,size.y-1);
00059         int imin = clamp(i-1,0,size.x-1);
00060         int jmin = clamp(j-1,0,size.y-1);
00061         
00062         int offsetXPlus = ipos+j*size.x;
00063         int offsetXMinus = imin+j*size.x;
00064         int offsetYMinus = i+jmin*size.x;
00065         int offsetYPlus = i+jpos*size.x;
00066         
00067         int xOrigin = i - int((vxout[offsetXPlus]- vxout[offset])*dt);
00068         int yOrigin = j - int((vyout[offsetYPlus] - vyout[offset])*dt);
00069         
00070         float deltaHeight = -0.5f*water1[offset]*((vxout[offsetXPlus]- vxout[offset])+(vyout[offsetYPlus] - vyout[offset]));
00071         /* For terrain some sort of clamp for water availability should be used.
00072         deltaHeight = clamp(deltaHeight, -water1[offset]*1000.0f,water1[xOrigin+yOrigin*size.x]);
00073         */
00074         
00075         
00076         water0[offset] = water1[offset]+deltaHeight*dt;
00077             
00078     }
00079 }
 All Classes Files Functions Variables Enumerations