Waterflow
Visualize water in terrain
|
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 }