ici_recycle_vr/Assets/LiquidVolumePro/Resources/Shaders/LVLiquidPassSimple.cginc
Diaconescu Andrei-Alexandru 19674bfe5d Am adaugat ICI Recycle
2025-05-26 12:54:36 +03:00

80 lines
2.3 KiB
HLSL

#include "LVLiquidPassBase.cginc"
half4 raymarch(float4 vertex, float3 rd, float t0, float t1) {
float3 wpos = wsCameraPos + rd * t0;
float turbulence = (tex2D(_NoiseTex2D, vertex.xz).g - 0.5) * _Turbulence.x;
turbulence += sin(vertex.w) * _Turbulence.y;
turbulence *= 0.05 * _Size.y;
_LevelPos += turbulence;
// compute level of liquid (t2)
float2 delta = float2(1.0, length(rd.xz) / rd.y);
float h = wpos.y - _LevelPos;
float t2 = t0 + length(delta * h.xx);
// ray-march smoke
float tmin, tmax;
#if defined(LIQUID_VOLUME_SMOKE)
half4 sumSmoke = half4(0,0,0,0);
if (wpos.y > _LevelPos) {
tmin = t0;
tmax = rd.y<0 ? min(t2,t1) : t1;
float stepSize = (tmax - tmin) / (float)_SmokeRaySteps;
float4 dir = float4(rd * stepSize, 0);
float4 rpos = float4(wsCameraPos + rd * tmin, 0);
float4 disp = float4(0, _Time.x * _Turbulence.x * _Size.y * _SmokeSpeed, 0, 0);
BEGIN_LOOP(k,_SmokeRaySteps,5)
float py = (_LevelPos - rpos.y)/_Size.y;
half deep = exp(py * _SmokeAtten);
half4 lc = _SmokeColor;
lc.rgb *= lc.aaa;
lc *= deep;
sumSmoke += lc * (1.0-sumSmoke.a);
rpos += dir;
END_LOOP
}
#endif
// ray-march liquid
half4 sum = half4(0,0,0,0);
tmax = t1, tmin = t0;
if (wpos.y > _LevelPos) {
if (rd.y<0) {
tmin = t2;
tmax = t1;
if (t2<t1) sum += 0.1;
} else {
tmax = -99999.0;
}
} else if (rd.y>0 && t2<t1) sum += 0.1 * _FoamBottom;
if (tmax>tmin) {
float stepSize = (tmax-tmin) / (float)_LiquidRaySteps;
float4 dir = float4(rd * stepSize, 0);
float4 rpos = float4(_WorldSpaceCameraPos + rd * tmin, 0); // does not matter to move to level pos
rpos.y -= _LevelPos;
BEGIN_LOOP(k,_LiquidRaySteps,5)
half deep = exp((rpos.y/_Size.y) * _DeepAtten);
half4 lc = _Color1;
lc.a *= _Color1.a;
lc.rgb *= lc.aaa;
lc.rgb *= deep;
sum += lc * (1.0-sum.a);
rpos += dir;
END_LOOP
}
// Final blend
#if defined(LIQUID_VOLUME_SMOKE)
if (wpos.y>_LevelPos) {
sum = sum * saturate(1.0 - sumSmoke.a) + sumSmoke;
} else {
sum = sumSmoke * saturate(1.0 - sum.a) + sum;
}
#endif
return sum;
}