From 8ca3925e0436f0c59cc4b55e02e95598544514cc Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Sun, 24 May 2020 18:16:23 -0700 Subject: [PATCH] Move projection code into shared library --- Assets/Shaders/DecalFeatureBumped.shader | 58 ++++++++---------------- Assets/Shaders/DecalPaint.shader | 28 ++---------- Assets/Shaders/DecalsCommon.cginc | 14 +++++- 3 files changed, 35 insertions(+), 65 deletions(-) diff --git a/Assets/Shaders/DecalFeatureBumped.shader b/Assets/Shaders/DecalFeatureBumped.shader index 6feb818..279aff5 100644 --- a/Assets/Shaders/DecalFeatureBumped.shader +++ b/Assets/Shaders/DecalFeatureBumped.shader @@ -34,12 +34,6 @@ Shader "ConformalDecals/Feature/Bumped" #pragma multi_compile_fwdbase nolightmap nodirlightmap nodynlightmap - #include "UnityCG.cginc" - #include "Lighting.cginc" - #include "AutoLight.cginc" - #include "LightingKSP.cginc" - #include "DecalsCommon.cginc" - sampler2D _Decal; sampler2D _DecalBumpMap; @@ -49,22 +43,18 @@ Shader "ConformalDecals/Feature/Bumped" float _Cutoff; float _Opacity; float _RimFalloff; - float4 _RimColor; + float4 _RimColor; + + #include "UnityCG.cginc" + #include "Lighting.cginc" + #include "AutoLight.cginc" + #include "LightingKSP.cginc" + #include "DecalsCommon.cginc" void surf (DecalSurfaceInput IN, inout SurfaceOutput o) { - fixed4 uv_projected = UNITY_PROJ_COORD(IN.uv_decal); - - // since I cant easily affect the clamping mode in KSP, do it here - clip(uv_projected.xyz); - clip(1-uv_projected.xyz); - - // clip backsides - clip(dot(_DecalNormal, IN.normal)); - - float2 uv_decal = TRANSFORM_TEX(uv_projected, _Decal); - float4 color = tex2D(_Decal, uv_decal); - float3 normal = UnpackNormal(tex2D(_DecalBumpMap, uv_decal)); + float4 color = tex2D(_Decal, IN.uv_decal); + float3 normal = UnpackNormal(tex2D(_DecalBumpMap, IN.uv_decal)); // clip alpha clip(color.a - _Cutoff); @@ -93,37 +83,27 @@ Shader "ConformalDecals/Feature/Bumped" #pragma multi_compile_fwdadd nolightmap nodirlightmap nodynlightmap - #include "UnityCG.cginc" - #include "Lighting.cginc" - #include "AutoLight.cginc" - #include "LightingKSP.cginc" - #include "DecalsCommon.cginc" - sampler2D _Decal; sampler2D _DecalBumpMap; float4 _Decal_ST; float4 _DecalBumpMap_ST; - + float _Cutoff; float _Opacity; float _RimFalloff; - float4 _RimColor; + float4 _RimColor; + + #include "UnityCG.cginc" + #include "Lighting.cginc" + #include "AutoLight.cginc" + #include "LightingKSP.cginc" + #include "DecalsCommon.cginc" void surf (DecalSurfaceInput IN, inout SurfaceOutput o) { - fixed4 uv_projected = UNITY_PROJ_COORD(IN.uv_decal); - - // since I cant easily affect the clamping mode in KSP, do it here - clip(uv_projected.xyz); - clip(1-uv_projected.xyz); - - // clip backsides - clip(dot(_DecalNormal, IN.normal)); - - float2 uv_decal = TRANSFORM_TEX(uv_projected, _Decal); - float4 color = tex2D(_Decal, uv_decal); - float3 normal = UnpackNormal(tex2D(_DecalBumpMap, uv_decal)); + float4 color = tex2D(_Decal, IN.uv_decal); + float3 normal = UnpackNormal(tex2D(_DecalBumpMap, IN.uv_decal)); // clip alpha clip(color.a - _Cutoff); diff --git a/Assets/Shaders/DecalPaint.shader b/Assets/Shaders/DecalPaint.shader index dd1c66b..09189b9 100644 --- a/Assets/Shaders/DecalPaint.shader +++ b/Assets/Shaders/DecalPaint.shader @@ -61,22 +61,12 @@ Shader "ConformalDecals/Paint/Diffuse" void surf (DecalSurfaceInput IN, inout SurfaceOutput o) { - fixed4 uv_projected = UNITY_PROJ_COORD(IN.uv_decal); - - // since I cant easily affect the clamping mode in KSP, do it here - clip(uv_projected.xyz); - clip(1-uv_projected.xyz); - - // clip backsides - clip(dot(_DecalNormal, IN.normal)); - - float2 uv_decal = TRANSFORM_TEX(uv_projected, _Decal); - float4 color = tex2D(_Decal, uv_decal); + float4 color = tex2D(_Decal, IN.uv_decal); + float3 normal = UnpackNormal(tex2D(_BumpMap, IN.uv_base)); // clip alpha clip(color.a - _Cutoff); - float3 normal = UnpackNormal(tex2D(_BumpMap, IN.uv_base)); half rim = 1.0 - saturate(dot (normalize(IN.viewDir), normal)); float3 emission = (_RimColor.rgb * pow(rim, _RimFalloff)) * _RimColor.a; @@ -130,22 +120,12 @@ Shader "ConformalDecals/Paint/Diffuse" void surf (DecalSurfaceInput IN, inout SurfaceOutput o) { - fixed4 uv_projected = UNITY_PROJ_COORD(IN.uv_decal); - - // since I cant easily affect the clamping mode in KSP, do it here - clip(uv_projected.xyz); - clip(1-uv_projected.xyz); - - // clip backsides - clip(dot(_DecalNormal, IN.normal)); - - float2 uv_decal = TRANSFORM_TEX(uv_projected, _Decal); - float4 color = tex2D(_Decal, uv_decal); + float4 color = tex2D(_Decal, IN.uv_decal); + float3 normal = UnpackNormal(tex2D(_BumpMap, IN.uv_base)); // clip alpha clip(color.a - _Cutoff); - float3 normal = UnpackNormal(tex2D(_BumpMap, IN.uv_base)); half rim = 1.0 - saturate(dot (normalize(IN.viewDir), normal)); float3 emission = (_RimColor.rgb * pow(rim, _RimFalloff)) * _RimColor.a; diff --git a/Assets/Shaders/DecalsCommon.cginc b/Assets/Shaders/DecalsCommon.cginc index 524be8b..3697622 100644 --- a/Assets/Shaders/DecalsCommon.cginc +++ b/Assets/Shaders/DecalsCommon.cginc @@ -3,7 +3,7 @@ struct DecalSurfaceInput { - float4 uv_decal; + float2 uv_decal; #ifdef DECAL_BASE_NORMAL float2 uv_base; #endif //DECAL_BASE_NORMAL @@ -134,9 +134,19 @@ fixed4 frag_forward(v2f IN) : SV_Target float3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPosition)); float3 viewDir = _unity_tbn_0 * worldViewDir.x + _unity_tbn_1 * worldViewDir.y + _unity_tbn_2 * worldViewDir.z; + // perform decal projection + fixed4 uv_projected = UNITY_PROJ_COORD(IN.uv_decal); + + // clip texture outside of xyz bounds + clip(uv_projected.xyz); + clip(1-uv_projected.xyz); + + // clip backsides + clip(dot(_DecalNormal, IN.normal)); + // initialize surface input UNITY_INITIALIZE_OUTPUT(DecalSurfaceInput, i) - i.uv_decal = IN.uv_decal; + i.uv_decal = TRANSFORM_TEX(uv_projected, _Decal);; #ifdef DECAL_BASE_NORMAL i.uv_base = IN.uv_base; #endif