You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/Feel/MMTools/Tools/MMShaders/MMStochastic.shader

100 lines
3.2 KiB
Plaintext

2 months ago
Shader "MoreMountains/MMStochastic"
{
Properties
{
_MainTex("Albedo (RGB)", 2D) = "white" {}
_Color("Color", Color) = (1,1,1,1)
_BumpMap("BumpMap", 2D) = "bump" {}
_BumpScale("BumpScale", Float) = 1
_Smoothness("Smoothness", 2D) = "white" {}
[Toggle]_Stochastic("Stochastic", Float) = 0
}
SubShader
{
Tags
{
"RenderType" = "Opaque"
}
LOD 200
CGPROGRAM
#pragma exclude_renderers gles
#pragma surface surf Standard fullforwardshadows
#pragma target 3.0
fixed4 _Color;
sampler2D _MainTex;
sampler2D _BumpMap;
sampler2D _Smoothness;
uniform float _BumpScale;
uniform float _Stochastic;
struct Input
{
float2 uv_MainTex;
};
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_INSTANCING_BUFFER_END(Props)
float2 hash2D2D(float2 s)
{
return frac(
sin(fmod(float2(dot(s, float2(127.1, 311.7)), dot(s, float2(269.5, 183.3))), 3.14159)) * 43758.5453);
}
float4 tex2DStochastic(sampler2D tex, float2 UV)
{
float4x3 BW_vx;
float2 skewUV = mul(float2x2(1.0, 0.0, -0.57735027, 1.15470054), UV * 3.464);
float2 vxID = float2(floor(skewUV));
float3 barycentric = float3(frac(skewUV), 0);
barycentric.z = 1.0 - barycentric.x - barycentric.y;
BW_vx = ((barycentric.z > 0)
? float4x3(float3(vxID, 0), float3(vxID + float2(0, 1), 0), float3(vxID + float2(1, 0), 0),
barycentric.zyx)
: float4x3(float3(vxID + float2(1, 1), 0), float3(vxID + float2(1, 0), 0),
float3(vxID + float2(0, 1), 0),
float3(-barycentric.z, 1.0 - barycentric.y, 1.0 - barycentric.x)));
float2 dx = ddx(UV);
float2 dy = ddy(UV);
return mul(tex2D(tex, UV + hash2D2D(BW_vx[0].xy), dx, dy), BW_vx[3].x) +
mul(tex2D(tex, UV + hash2D2D(BW_vx[1].xy), dx, dy), BW_vx[3].y) +
mul(tex2D(tex, UV + hash2D2D(BW_vx[2].xy), dx, dy), BW_vx[3].z);
}
void surf(Input IN, inout SurfaceOutputStandard o)
{
float4 bumpSample;
float4 albedoSample = 1;
float4 smoothnessSample;
if (_Stochastic)
{
albedoSample = tex2DStochastic(_MainTex, IN.uv_MainTex);
bumpSample = tex2DStochastic(_BumpMap, IN.uv_MainTex);
smoothnessSample = tex2DStochastic(_Smoothness, IN.uv_MainTex);
}
else
{
albedoSample = tex2D(_MainTex, IN.uv_MainTex);
bumpSample = tex2D(_BumpMap, IN.uv_MainTex);
smoothnessSample = tex2D(_Smoothness, IN.uv_MainTex);
}
o.Alpha = albedoSample.a;
o.Albedo = albedoSample.rgb;
o.Normal = UnpackScaleNormal(bumpSample, _BumpScale);
o.Smoothness = smoothnessSample.r;
}
ENDCG
}
FallBack "Diffuse"
}