Last active
March 31, 2022 22:55
-
-
Save cortvi/36e039102ef4eb7eb6d11e0a21fd1225 to your computer and use it in GitHub Desktop.
Custom refractive liquid surface shader
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// Created by @cortvi | |
Shader "Custom/Refractive surface" | |
{ | |
Properties | |
{ | |
[Header (Color)] | |
_DarkColor ("Dark water color", Color) = (0,0,0,1) | |
[HDR] _LitColor ("Lit water color", Color) = (1,1,1,1) | |
_Glossiness ("Smoothness", Range (0.0, 1.0)) = 0.5 | |
[Header (Fresnel)] | |
_FPower ("Fresnel power", Range (0.001, 10.0)) = 5.0 | |
_FScale ("Fresnel scale", Range (0.0, 1.0)) = 1.0 | |
_FBias ("Fresnel bias", Range(0.0, 1.0)) = 0.0 | |
[Header (Dissortion)] | |
_DissortAmt ( "Dissortion amount", Range (0.0, 1.0) ) = 0.3 | |
[Normal] _BumpMap ( "Normal dissortion map", 2D ) = "bump" {} | |
_BumpScale ( "Normal strenght", Float ) = 1.0 | |
_SpeedX ( "Waves speed (X)", float ) = 0.5 | |
_SpeedY ( "Waves speed (Y)", float ) = 0.5 | |
} | |
CGINCLUDE | |
// Some helpers | |
#define DISSORTION_MAX 127 | |
#define SPEED_UV(c) _Time.c * float2(_SpeedX, _SpeedY) | |
#define TEX(name) tex2D(name, i.uv##name) | |
ENDCG | |
SubShader | |
{ | |
Tags{ "Queue"="Transparent+1" "RenderType"="Transparent" } | |
GrabPass { } | |
Zwrite Off | |
CGPROGRAM | |
#pragma surface surf Standard nolightmap noshadow | |
#pragma target 3.0 | |
struct Input | |
{ | |
float2 uv_BumpMap; | |
float4 screenPos; | |
float3 viewDir; | |
}; | |
uniform sampler2D _GrabTexture; | |
uniform float4 _GrabTexture_TexelSize; | |
uniform fixed4 _DarkColor; | |
uniform half4 _LitColor; | |
uniform float _Glossiness; | |
uniform float _FPower; | |
uniform float _FScale; | |
uniform float _FBias; | |
uniform float _DissortAmt; | |
uniform sampler2D _BumpMap; | |
uniform float _BumpScale; | |
uniform float _SpeedX; | |
uniform float _SpeedY; | |
void surf ( Input i, inout SurfaceOutputStandard s ) | |
{ | |
// Calculate normal bump | |
i.uv_BumpMap += SPEED_UV (xy); | |
float3 bump = UnpackScaleNormal (TEX(_BumpMap), _BumpScale); | |
// Calculate dissorted UVs | |
float2 dissort = bump * pow (_DissortAmt * DISSORTION_MAX + 1, 2.0); | |
i.screenPos.xy += (dissort * _GrabTexture_TexelSize.xy) * i.screenPos.z; | |
// I'm not really sure of this part :/ | |
#ifndef UNITY_UV_STARTS_AT_TOP | |
i.screenPos.y = 1 - i.screenPos.y; | |
#endif | |
// Calculate fresnel amount | |
float fresnel; | |
fresnel = 1.0 - dot (bump, i.viewDir); | |
fresnel = _FScale * pow (fresnel, _FPower); | |
fresnel = _FBias + (1.0 - _FBias) * saturate(fresnel); | |
// Compute final fragment color | |
half3 frag, emission; | |
frag = lerp (tex2Dproj (_GrabTexture, i.screenPos), _DarkColor, _DarkColor.a).rgb; | |
frag = lerp (frag, _LitColor, (_LitColor.a * fresnel)); | |
emission = _LitColor * (_LitColor.a * fresnel); | |
// Feed output | |
s.Albedo = frag; | |
s.Normal = bump; | |
s.Emission = emission; | |
s.Smoothness = _Glossiness; | |
} | |
ENDCG | |
} | |
FallBack "Standard" | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment