在此期间,我正在尝试学习webgl和glsl的工作方式。
在网络搜索中,我发现Three.js提供了一系列非常有用的示例来了解webgl的工作方式。
我举一个例子,我在理解代码的物理含义时遇到了麻烦。
下面是所涉及的代码部分以及与其中一部分的链接。
https://github.com/mrdoob/three.js/blob/master/examples/webgl_gpgpu_water.html
<script id="heightmapFragmentShader" type="x-shader/x-fragment">
#include <common>
uniform vec2 mousePos;
uniform float mouseSize;
uniform float viscosityConstant;
#define deltaTime ( 1.0 / 60.0 )
#define GRAVITY_CONSTANT ( resolution.x * deltaTime * 3.0 )
void main() {
vec2 cellSize = 1.0 / resolution.xy;
vec2 uv = gl_FragCoord.xy * cellSize;
// heightmapValue.x == height
// heightmapValue.y == velocity
// heightmapValue.z, heightmapValue.w not used
vec4 heightmapValue = texture2D( heightmap, uv );
// Get neighbours
vec4 north = texture2D( heightmap, uv + vec2( 0.0, cellSize.y ) );
vec4 south = texture2D( heightmap, uv + vec2( 0.0, - cellSize.y ) );
vec4 east = texture2D( heightmap, uv + vec2( cellSize.x, 0.0 ) );
vec4 west = texture2D( heightmap, uv + vec2( - cellSize.x, 0.0 ) );
float sump = north.x + south.x + east.x + west.x - 4.0 * heightmapValue.x;
float accel = sump * GRAVITY_CONSTANT;
// Dynamics
heightmapValue.y += accel;
heightmapValue.x += heightmapValue.y * deltaTime;
// Viscosity
heightmapValue.x += sump * viscosityConstant;
// Mouse influence
float mousePhase = clamp( length( ( uv - vec2( 0.5 ) ) * BOUNDS - vec2( mousePos.x, - mousePos.y ) ) * PI / mouseSize, 0.0, PI );
heightmapValue.x += cos( mousePhase ) + 1.0;
gl_FragColor = heightmapValue;
}
</script>
我认识到heightmapValue.x变量表示所考虑的顶点的高度,并且每次由一系列项的总和构成其值。
称为 坑 ,是邻居的高度与顶点本身的高度之差和 波浪 鼠标的影响(转换为正弦曲线趋势,因此永远不会产生负面影响),我们拥有:
问题:
1.为什么将重力常数乘以3(常数定义)?
2.为什么加上粘度项而不是减去它?
也许我错过了一些东西,但我不明白是什么。