KSP-Conformal-Decals/Assets/ConformalDecals/Shaders/DecalBack.shader
Andrew Cassidy cb98e78a3f New LightingKSP to solve some issues with Deferred
Deferred moves the ambient calculation to the lighting pass for very good reasons, but Unity shaders still try to do it in the base pass. Easy solution is make the GI function a no-op in deferred mode.
2024-07-30 22:40:23 -07:00

91 lines
2.5 KiB
GLSL

Shader "ConformalDecals/Decal Back"
{
Properties
{
[Header(Texture Maps)]
_MainTex("Main Tex (RGB spec(A))", 2D) = "gray" {}
_BumpMap("Normal Map", 2D) = "bump" {}
_Color ("Color", Color) = (1,1,1,1)
_RowOffset("Row Offset", Range (0, 1)) = 0.5
[Header(Specularity)]
_SpecColor ("_SpecColor", Color) = (0.5, 0.5, 0.5, 1)
_Shininess ("Shininess", Range (0.03, 10)) = 0.4
[Header(Effects)]
[PerRendererData]_Opacity("_Opacity", Range(0,1) ) = 1
[PerRendererData]_RimFalloff("_RimFalloff", Range(0.01,5) ) = 0.1
[PerRendererData]_RimColor("_RimColor", Color) = (0,0,0,0)
[PerRendererData]_UnderwaterFogFactor ("Underwater Fog Factor", Range(0,1)) = 0
}
SubShader
{
Tags { "RenderType"="Opaque" }
ZWrite On
ZTest LEqual
CGPROGRAM
#include "LightingKSP.cginc"
#pragma surface surf BlinnPhongKSP vertex:vert
#pragma target 3.0
sampler2D _MainTex;
sampler2D _BumpMap;
half _RowOffset;
half _Shininess;
float _Opacity;
float _RimFalloff;
float4 _RimColor;
struct Input
{
float2 uv_MainTex;
float2 uv_BumpMap;
float3 viewDir;
float3 worldPos;
};
void vert (inout appdata_full v) {
}
void surf (Input IN, inout SurfaceOutput o)
{
float2 uv_BumpMap = IN.uv_BumpMap;
float2 uv_MainTex = 0;
// 45° rotation
uv_MainTex.x = IN.uv_MainTex.x - IN.uv_MainTex.y;
uv_MainTex.y = IN.uv_MainTex.x + IN.uv_MainTex.y;
// stagger every other row
uv_MainTex.y *= 2;
int row = floor(uv_MainTex.y);
uv_MainTex.x += row * _RowOffset;
float4 color = _Color * tex2D(_MainTex,(uv_MainTex));
float3 normal = UnpackNormal(tex2D(_BumpMap, uv_BumpMap));
half rim = 1.0 - saturate(dot (normalize(IN.viewDir), normal));
float3 emission = (_RimColor.rgb * pow(rim, _RimFalloff)) * _RimColor.a;
float4 fog = UnderwaterFog(IN.worldPos, color);
o.Albedo = fog.rgb;
o.Emission = emission;
o.Gloss = color.a;
o.Specular = _Shininess;
o.Normal = normal;
o.Emission *= _Opacity * fog.a;
o.Alpha = _Opacity * fog.a;
}
ENDCG
}
Fallback "Standard"
}