- Home /
Question by
chirpywiz711 · Dec 29, 2018 at 11:56 PM ·
shaderswaterfogvertex shader
Water Shader Reflection & Transparency Distance
I have a vertex shader and I would like to add a reflection, but only within a certain distance (like a fog, but only shown on the reflection) like this:
I would also like it if you could only see so far into the water(again, like a fog, but contained inside the mesh) like this: This is my code
// Per pixel bumped refraction.
// Uses a normal map to distort the image behind, and
// an additional texture to tint the color.
Shader "Chirpy/Water" {
Properties{
_BumpAmt("Distortion", range(0,128)) = 10
_Albedo("Tint Color", color) = (1,1,1,1)
_MainTex("Texture (RGB)", 2D) = "white" {}
_BumpMap("Normalmap", 2D) = "bump" {}
}
Category{
// We must be transparent, so other objects are drawn before this one.
Tags { "Queue" = "Transparent" "RenderType" = "Opaque" }
SubShader {
// This pass grabs the screen behind the object into a texture.
// We can access the result in the next pass as _GrabTexture
GrabPass {
Name "BASE"
Tags { "LightMode" = "Always" }
}
// Main pass: Take the texture grabbed above and use the bumpmap to perturb it
// on to the screen
Pass {
Name "BASE"
Tags { "LightMode" = "Always" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata_t {
float4 vertex : POSITION;
float2 texcoord: TEXCOORD0;
};
struct v2f {
float4 vertex : SV_POSITION;
float4 uvgrab : TEXCOORD0;
float2 uvbump : TEXCOORD1;
float2 uvmain : TEXCOORD2;
UNITY_FOG_COORDS(3)
};
float _BumpAmt;
float4 _Albedo;
float4 _BumpMap_ST;
float4 _MainTex_ST;
v2f vert(appdata_t v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uvgrab = ComputeGrabScreenPos(o.vertex);
o.uvbump = TRANSFORM_TEX(v.texcoord, _BumpMap);
o.uvmain = TRANSFORM_TEX(v.texcoord, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
sampler2D _GrabTexture;
float4 _GrabTexture_TexelSize;
sampler2D _BumpMap;
sampler2D _MainTex;
half4 frag(v2f i) : SV_Target
{
#if UNITY_SINGLE_PASS_STEREO
i.uvgrab.xy = TransformStereoScreenSpaceTex(i.uvgrab.xy, i.uvgrab.w);
#endif
// calculate perturbed coordinates
half2 bump = UnpackNormal(tex2D(_BumpMap, i.uvbump)).rg; // we could optimize this by just reading the x & y without reconstructing the Z
float2 offset = bump * _BumpAmt * _GrabTexture_TexelSize.xy;
#ifdef UNITY_Z_0_FAR_FROM_CLIPSPACE //to handle recent standard asset package on older version of unity (before 5.5)
i.uvgrab.xy = offset * UNITY_Z_0_FAR_FROM_CLIPSPACE(i.uvgrab.z) + i.uvgrab.xy;
#else
i.uvgrab.xy = offset * i.uvgrab.z + i.uvgrab.xy;
#endif
half4 col = tex2Dproj(_GrabTexture, UNITY_PROJ_COORD(i.uvgrab));
half4 tint = tex2D(_MainTex, i.uvmain)*_Albedo;
col *= tint;
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
// ------------------------------------------------------------------
// Fallback for older cards and Unity non-Pro
SubShader {
Blend DstColor Zero
Pass {
Name "BASE"
SetTexture[_MainTex] { combine texture }
}
}
}
}
waterfog.png
(26.8 kB)
waterrefl.png
(25.2 kB)
Comment
Your answer
Follow this Question
Related Questions
Shader Graph Water Vertex Manipulation, 0 Answers
[SOLVED] Turning Fog On in Shader Turns Object Pink! 0 Answers
'vert': output parameter 'o' not completely initialized 2 Answers
Single pass rendering + Custom fragment shader with lightmaps & reflection probes? 0 Answers
Can you specify both Surface and Vertex/Fragment shaders? 3 Answers