normal based water reflection
This commit is contained in:
parent
cc23401dd8
commit
e70b55ff58
2 changed files with 18 additions and 15 deletions
|
@ -84,7 +84,7 @@ Material:
|
||||||
- _SunAngle: 0
|
- _SunAngle: 0
|
||||||
- _SunCutoff: 0.06
|
- _SunCutoff: 0.06
|
||||||
- _SunRadius: 0.06
|
- _SunRadius: 0.06
|
||||||
- _Temp: 0.594
|
- _Temp: 0.826
|
||||||
- _UVSec: 0
|
- _UVSec: 0
|
||||||
- _ZWrite: 1
|
- _ZWrite: 1
|
||||||
m_Colors:
|
m_Colors:
|
||||||
|
@ -93,3 +93,4 @@ Material:
|
||||||
- _HorizonCol: {r: 0.43, g: 0.27, b: 0.49, a: 1}
|
- _HorizonCol: {r: 0.43, g: 0.27, b: 0.49, a: 1}
|
||||||
- _SkyCol: {r: 0.22, g: 0.23, b: 0.58, a: 1}
|
- _SkyCol: {r: 0.22, g: 0.23, b: 0.58, a: 1}
|
||||||
- _SunCol: {r: 1, g: 0.65, b: 0.05, a: 1}
|
- _SunCol: {r: 1, g: 0.65, b: 0.05, a: 1}
|
||||||
|
- _WaterCol: {r: 0, g: 0, b: 0, a: 1}
|
||||||
|
|
|
@ -21,10 +21,11 @@
|
||||||
_StarSizeRandom ("Star size randomness", Range(0, 1)) = 0.5
|
_StarSizeRandom ("Star size randomness", Range(0, 1)) = 0.5
|
||||||
_StarTint ("Star tint", Range(0, 1)) = 0.4
|
_StarTint ("Star tint", Range(0, 1)) = 0.4
|
||||||
[Header(Water)]
|
[Header(Water)]
|
||||||
|
_WaterCol ("Water color", Color) = (0.03, 0.08, 0.12, 1.0)
|
||||||
_WaterSurface ("Surface Normal", 2D) = "white" {}
|
_WaterSurface ("Surface Normal", 2D) = "white" {}
|
||||||
|
_Temp ("Wave scale", Range(0, 1)) = 0
|
||||||
[Header(Debug)]
|
[Header(Debug)]
|
||||||
_Grid ("Grid visibility", Range(0, 1)) = 0
|
_Grid ("Grid visibility", Range(0, 1)) = 0
|
||||||
_Temp ("Test", Range(0, 1)) = 0
|
|
||||||
|
|
||||||
}
|
}
|
||||||
SubShader
|
SubShader
|
||||||
|
@ -53,12 +54,11 @@
|
||||||
struct v2f
|
struct v2f
|
||||||
{
|
{
|
||||||
float4 vertex : SV_POSITION;
|
float4 vertex : SV_POSITION;
|
||||||
float3 camPos : TEXCOORD1;
|
float3 cam_pos : TEXCOORD0;
|
||||||
float3 hitPos : TEXCOORD2;
|
float3 hit_pos : TEXCOORD1;
|
||||||
};
|
};
|
||||||
|
|
||||||
sampler2D _MainTex;
|
sampler2D _MainTex;
|
||||||
sampler2D _WaterSurface;
|
|
||||||
fixed4 _SkyCol;
|
fixed4 _SkyCol;
|
||||||
fixed4 _HorizonCol;
|
fixed4 _HorizonCol;
|
||||||
|
|
||||||
|
@ -74,6 +74,9 @@
|
||||||
float _SunAngle;
|
float _SunAngle;
|
||||||
float _SunRadius;
|
float _SunRadius;
|
||||||
float _SunCutoff;
|
float _SunCutoff;
|
||||||
|
|
||||||
|
sampler2D _WaterSurface;
|
||||||
|
fixed4 _WaterCol;
|
||||||
float _Temp;
|
float _Temp;
|
||||||
|
|
||||||
float _Grid;
|
float _Grid;
|
||||||
|
@ -82,30 +85,29 @@
|
||||||
{
|
{
|
||||||
v2f o;
|
v2f o;
|
||||||
o.vertex = UnityObjectToClipPos(v.vertex);
|
o.vertex = UnityObjectToClipPos(v.vertex);
|
||||||
o.camPos = _WorldSpaceCameraPos;
|
o.cam_pos = _WorldSpaceCameraPos;
|
||||||
o.hitPos = mul(unity_ObjectToWorld, v.vertex);
|
o.hit_pos = mul(unity_ObjectToWorld, v.vertex);
|
||||||
return o;
|
return o;
|
||||||
}
|
}
|
||||||
|
|
||||||
fixed4 frag (v2f i) : SV_Target
|
fixed4 frag (v2f i) : SV_Target
|
||||||
{
|
{
|
||||||
fixed4 water_mod = 1.0;
|
float water_mod = 0.0;
|
||||||
|
|
||||||
float3 real_dir = normalize(i.hitPos - i.camPos);
|
float3 real_dir = normalize(i.hit_pos - i.cam_pos);
|
||||||
float3 dir = real_dir;
|
float3 dir = real_dir;
|
||||||
float real_y = asin(dir.y);
|
float real_y = asin(dir.y);
|
||||||
if (real_y < 0.0) { // distort to look like water reflection
|
if (real_y < 0.0) { // distort to look like water reflection
|
||||||
float3 camera_local_pos = i.camPos + mul(unity_WorldToObject, float4(0, 0, 0, 1));
|
float3 camera_local_pos = i.cam_pos + mul(unity_WorldToObject, float4(0, 0, 0, 1));
|
||||||
float3 surface_pos = float3 (
|
float3 surface_pos = float3 (
|
||||||
camera_local_pos.x - camera_local_pos.y / (real_dir.y / real_dir.x),
|
camera_local_pos.x - camera_local_pos.y / (real_dir.y / real_dir.x),
|
||||||
0.0,
|
0.0,
|
||||||
camera_local_pos.z - camera_local_pos.y / (real_dir.y / real_dir.z)
|
camera_local_pos.z - camera_local_pos.y / (real_dir.y / real_dir.z)
|
||||||
);
|
);
|
||||||
float3 water_normal = normalize ((tex2D(_WaterSurface, surface_pos.xz * 0.05) - 0.5).zxy );
|
float3 water_normal = normalize((tex2D(_WaterSurface, surface_pos.xz * _Temp) - 0.5).zxy);
|
||||||
water_normal = lerp(UP, water_normal, _Temp);
|
|
||||||
dir = reflect(dir, water_normal);
|
|
||||||
|
|
||||||
// water_mod = fixed4(0.4, 0.7, 0.8, 1.0);
|
dir = reflect(dir, water_normal);
|
||||||
|
water_mod = dot(dir, water_normal);
|
||||||
}
|
}
|
||||||
float y = abs(real_y);
|
float y = abs(real_y);
|
||||||
dir.y = abs(dir.y);
|
dir.y = abs(dir.y);
|
||||||
|
@ -162,7 +164,7 @@
|
||||||
|
|
||||||
col = lerp(col, _SunCol, sun_amount);
|
col = lerp(col, _SunCol, sun_amount);
|
||||||
|
|
||||||
col *= water_mod;
|
col = lerp(col, _WaterCol, water_mod);
|
||||||
|
|
||||||
// debug, this should not be visible
|
// debug, this should not be visible
|
||||||
if (dir.y < 0) {
|
if (dir.y < 0) {
|
||||||
|
|
Loading…
Reference in a new issue