提交 8d3cae2f 编写于 作者: Y yomboprime

Changed water reset feedback to sample 1 point

上级 125e2d5a
...@@ -127,7 +127,7 @@ ...@@ -127,7 +127,7 @@
</script> </script>
<!-- This is a 'compute shader' to calculate the current volume of water --> <!-- This is a 'compute shader' to calculate the current volume of water at the center -->
<!-- It is used with a variable of size 1x1 --> <!-- It is used with a variable of size 1x1 -->
<script id="sumFragmentShader" type="x-shader/x-fragment"> <script id="sumFragmentShader" type="x-shader/x-fragment">
...@@ -136,19 +136,31 @@ ...@@ -136,19 +136,31 @@
// Integer to float conversion from https://stackoverflow.com/questions/17981163/webgl-read-pixels-from-floating-point-render-target // Integer to float conversion from https://stackoverflow.com/questions/17981163/webgl-read-pixels-from-floating-point-render-target
float shift_right( float v, float amt ) { float shift_right( float v, float amt ) {
v = floor( v ) + 0.5; v = floor( v ) + 0.5;
return floor( v / exp2( amt ) ); return floor( v / exp2( amt ) );
} }
float shift_left( float v, float amt ) { float shift_left( float v, float amt ) {
return floor( v * exp2( amt ) + 0.5 ); return floor( v * exp2( amt ) + 0.5 );
} }
float mask_last( float v, float bits ) { float mask_last( float v, float bits ) {
return mod( v, shift_left( 1.0, bits ) ); return mod( v, shift_left( 1.0, bits ) );
} }
float extract_bits( float num, float from, float to ) { float extract_bits( float num, float from, float to ) {
from = floor( from + 0.5 ); to = floor( to + 0.5 ); from = floor( from + 0.5 ); to = floor( to + 0.5 );
return mask_last( shift_right( num, from ), to - from ); return mask_last( shift_right( num, from ), to - from );
} }
vec4 encode_float( float val ) { vec4 encode_float( float val ) {
if ( val == 0.0 ) return vec4( 0, 0, 0, 0 ); if ( val == 0.0 ) return vec4( 0, 0, 0, 0 );
float sign = val > 0.0 ? 0.0 : 1.0; float sign = val > 0.0 ? 0.0 : 1.0;
...@@ -168,26 +180,9 @@ ...@@ -168,26 +180,9 @@
void main() { void main() {
vec2 cellSize = 1.0 / resolution.xy; float waterLevel = texture2D( texture, vec2( 0.5, 0.5 ) ).x;
float volume = 0.0;
const int rx = int( resolution.x );
const int ry = int( resolution.y );
// Sum of water height over all water cells
for ( int j = 0; j < ry; j++ ) {
for ( int i = 0; i < rx; i++ ) {
vec2 uv = vec2( i, j ) * cellSize;
vec4 textureValue = texture2D( texture, uv );
volume += textureValue.x;
}
}
gl_FragColor = encode_float( volume ); gl_FragColor = encode_float( waterLevel );
} }
...@@ -559,7 +554,7 @@ ...@@ -559,7 +554,7 @@
function readWaterLevel() { function readWaterLevel() {
// Returns current average water level // Returns current water level at the center
var currentRenderTarget = gpuCompute.getCurrentRenderTarget( heightmapVariable ); var currentRenderTarget = gpuCompute.getCurrentRenderTarget( heightmapVariable );
...@@ -572,7 +567,7 @@ ...@@ -572,7 +567,7 @@
var pixels = new Float32Array( readVolumeImage.buffer ); var pixels = new Float32Array( readVolumeImage.buffer );
return pixels[ 0 ] / NUM_TEXELS; return pixels[ 0 ];
} }
...@@ -667,18 +662,24 @@ ...@@ -667,18 +662,24 @@
numFrames = 0; numFrames = 0;
heightCompensation = readWaterLevel(); heightCompensation = - readWaterLevel();
} }
// Apply gradually height compensation to reset water level // Apply gradually height compensation to reset water level
if ( heightCompensation !== 0 ) { if ( heightCompensation !== 0 ) {
var decremHeight = Math.min( 1, Math.abs( heightCompensation ) ) * Math.sign( heightCompensation ); var decremHeight = Math.min( 0.2, Math.abs( heightCompensation ) ) * Math.sign( heightCompensation );
heightCompensation -= decremHeight; heightCompensation -= decremHeight;
heightmapVariable.material.uniforms.heightCompensation.value = - decremHeight * Math.sign( heightCompensation ); heightmapVariable.material.uniforms.heightCompensation.value = decremHeight;
} }
else {
heightmapVariable.material.uniforms.heightCompensation.value = 0;
}
// Do the gpu computation // Do the gpu computation
gpuCompute.compute(); gpuCompute.compute();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册