泡沫需程序化生成:在片元着色器中基于局部曲率与衰减深度叠加高频噪声;折射需联动深度和视角角,按Beer-Lambert衰减颜色并动态调整偏移量;二者共用重算的微表面法线与线性深度;移动端须简化噪声采样、禁用SSR、多项式近似指数运算。

泡沫贴图怎么用噪声生成并控制密度
泡沫不是静态纹理,得靠程序化生成——核心是用 PerlinNoise 或 SimplexNoise 在水面高度场(如顶点偏移后的 Z 值)的局部极值区域叠加白色/半透灰斑。关键不是“贴图”,而是实时采样:在 fragment shader 中,对水面法线或曲率做阈值判断,再叠一层高频噪声。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 先算顶点位移后的局部曲率:
abs(dFdx(height) + dFdy(height)),值大处大概率是浪尖; - 用这个曲率乘以一个衰减系数(比如
pow(1.0 - depth, 2.0)),避免深水区也出泡沫; - 再叠加
fract(sin(dot(uv * 13.7, vec2(12.9898, 78.233))) * 43758.5453)这类 cheap noise,控制泡沫颗粒感; - 别直接用
texture2D(foamTex, uv)——预烘焙贴图无法响应风速、波长变化,会穿帮。
水体深浅如何影响折射强度和颜色衰减
折射不是简单加个 texture2D(sceneTex, refractUV) 就完事。真实水体中,浅水区折射弱、透光强、带青绿色;深水区折射强、光线被吸收,蓝调变浓、细节模糊。这需要两个变量联动:深度值(depth)和视线入射角(dot(viewDir, normal))。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 用摄像机到水面的线性深度(非
gl_FragCoord.z)计算实际水深,推荐从 G-buffer 单独输出waterDepth通道; - 折射偏移量不能恒定:浅水(
depth )时偏移 <code>0.005,深水(depth > 2.0)时放大到0.03,中间用 smoothstep 插值; - 颜色衰减走 Beer-Lambert 模型简化版:
vec3 attenuation = exp(-depth * vec3(0.1, 0.2, 0.6)),蓝通道衰减最快; - 注意:如果用屏幕空间折射(SSR),深水区 SSR 会因 raymarch 失败而黑边——必须 fallback 到 cubemap 或环境光近似。
泡沫和折射怎么共用同一套深度与法线数据
泡沫位置和折射扭曲都依赖水面几何特征,但直接复用顶点着色器传来的 normal 和 worldPos 会出错:顶点法线太粗糙,且没考虑微表面扰动。必须统一在 fragment shader 里重算带噪声的法线。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 在片元中用中心差分法重算法线:
vec3 normal = normalize(cross(dFdx(pos), dFdy(pos))),其中pos是带噪声扰动后的世界坐标; - 泡沫密度采样和折射 UV 偏移都基于这个重算法线,确保二者空间对齐;
- 深度值统一用
linearDepth = linearizeDepth(texture2D(depthTex, uv).r),别混用 NDC 深度和视口深度; - 若用 tessellation 细分曲面,记得把细分后的
tessPosition输出到 G-buffer,否则折射和泡沫都会浮在粗网格上。
移动端和 PC 端性能差异怎么平衡
泡沫噪声采样 + 折射 raymarch + 法线重算,在 Mali-G78 或 Adreno 660 上很容易掉帧。PC 可以跑 full SSR + 多层噪声,移动端必须砍。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 移动端关掉动态法线重算,改用顶点位移导数近似:
normal = normalize(vec3(-dFdx(height), 1.0, -dFdy(height))); - 泡沫只采一次 noise(去掉 fract+sin,换
texelFetch(noiseTex, ivec2(uv * 64.0), 0)查表); - 折射不用 SSR,改用 pre-filtered scene color + 深度偏移查表(
texture2D(refractLUT, vec2(depth, abs(dot(viewDir, normal))))); - 所有
exp()、pow()替换为clamp(x * x * x, 0.0, 1.0)类多项式近似,避免 GPU 指令 stall。
真正难的是让泡沫边缘不生硬、折射过渡不跳变——这两者都卡在噪声频率和深度插值的耦合精度上,调参时得盯着 0.1 米水深范围反复测。


















