Получилось извлечь линейную глубину изображения.
Как я понял поверхность дна должна отрисовываться в z-buffer, после чего шейдер воды должен считывать показания z буфера и на основе этого уже определять затемненность воды. Но как сделать чтобы шейдер воды не вносил изменения в z буффер? Вставил ZWrite OFF не работает...
Shader "Render Depth" {
SubShader {
Tags { "Queue"="Geometry+10" "IgnoreProjector"="True" "RenderType"="Transparent" }
Pass {
ZWrite Off
//Ztest always
LOD 500
Fog { Mode Off }
CGPROGRAM
// Upgrade NOTE: excluded shader from DX11 and Xbox360; has structs without semantics (struct v2f members worldPos)
#pragma exclude_renderers d3d11 xbox360
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f {
float4 pos : SV_POSITION;
float2 depth : TEXCOORD0;
};
v2f vert (appdata_base v) {
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
UNITY_TRANSFER_DEPTH(o.depth);
return o;
}
half4 frag(v2f i) : COLOR {
float d = i.depth.x/i.depth.y; //получаем глубину аналогично UNITY_OUTPUT_DEPTH(i.depth);
d=Linear01Depth(d); // Преобразуем в линейное значение
return half4(d,d,d,0.5); // Возвращаем цвет
}
ENDCG
}
}
}