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.
100 lines
3.2 KiB
GLSL
100 lines
3.2 KiB
GLSL
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"
|
|
} |