diff options
| author | yum <yum.food.vr@gmail.com> | 2025-02-18 16:35:22 -0800 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2025-02-18 16:35:22 -0800 |
| commit | 547c6064f6a8ab2749f496ce7ea2856e8cc1bcda (patch) | |
| tree | 080e30ef69f9e4daa476e529c9f015bd2cf77fa8 /matcaps.cginc | |
| parent | 3087ea990dfea49c32a8a9d9f6ac9c1790817efc (diff) | |
Add matcaps and rim lighting
* Add min brightness
* MainTex and BumpMap can be independently tiled
* Fix outlines
* Remove lightDirTS (unused)
* Normalize i.normal in pixel shader
* Elide unused AO when locked
* Wrap lines at 80 columns
Diffstat (limited to 'matcaps.cginc')
| -rw-r--r-- | matcaps.cginc | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/matcaps.cginc b/matcaps.cginc new file mode 100644 index 0000000..555dcc7 --- /dev/null +++ b/matcaps.cginc @@ -0,0 +1,87 @@ +#ifndef __MATCAPS_INC +#define __MATCAPS_INC + +#include "features.cginc" +#include "globals.cginc" +#include "interpolators.cginc" +#include "yum_pbr.cginc" + +#if defined(_MATCAP0) || defined(_RIM_LIGHTING0) +float2 getMatcapUV(v2f i, inout YumPbr pbr) { + const float3 cam_normal = normalize(mul(UNITY_MATRIX_V, float4(pbr.normal, 0))); + const float3 cam_view_dir = normalize(mul(UNITY_MATRIX_V, float4(-i.eyeVec.xyz, 0))); + const float3 cam_refl = -reflect(cam_view_dir, cam_normal); + float m = 2.0 * sqrt( + cam_refl.x * cam_refl.x + + cam_refl.y * cam_refl.y + + (cam_refl.z + 1) * (cam_refl.z + 1)); + return cam_refl.xy / m + 0.5; +} + +void applyMatcap(inout YumPbr pbr, float3 sample, uint mode, float mask) +{ + [forcecase] + switch(mode) { + case MATCAP_MODE_REPLACE: + pbr.albedo.rgb = lerp(pbr.albedo.rgb, sample, mask); + break; + case MATCAP_MODE_ADD: + pbr.albedo.rgb += lerp(0, sample, mask); + break; + case MATCAP_MODE_MULTIPLY: + pbr.albedo.rgb *= lerp(1, sample, mask); + break; + case MATCAP_MODE_SUBTRACT: + pbr.albedo.rgb -= lerp(0, sample, mask); + break; + case MATCAP_MODE_ADD_PRODUCT: + pbr.albedo.rgb += lerp(0, sample * pbr.albedo.rgb, mask); + break; + default: + break; + } +} +#endif + +void applyMatcapsAndRimLighting(v2f i, inout YumPbr pbr) { +#if defined(_MATCAP0) || defined(_RIM_LIGHTING0) || defined(_RIM_LIGHTING1) + float2 muv = getMatcapUV(i, pbr); +#endif +#if defined(_MATCAP0) + float3 m0 = _Matcap0.Sample(linear_repeat_s, muv); + m0 = lerp(m0, 1 - m0, _Matcap0_Invert); + m0 *= _Matcap0_Strength; +#if defined(_MATCAP0_MASK) + float m0_mask = _Matcap0_Mask.Sample(linear_repeat_s, i.uv01.xy); +#else + float m0_mask = 1; +#endif + applyMatcap(pbr, m0, _Matcap0_Mode, m0_mask); +#endif +#if defined(_RIM_LIGHTING0) || defined(_RIM_LIGHTING1) + float rl_radius = length(muv - 0.5); +#endif +#if defined(_RIM_LIGHTING0) + float rl0_dist = exp2(-_Rim_Lighting0_Power * abs(rl_radius - _Rim_Lighting0_Center)); + float3 rl0 = _Rim_Lighting0_Color * _Rim_Lighting0_Brightness * rl0_dist; +#if defined(_RIM_LIGHTING0_MASK) + float rl0_mask = _Rim_Lighting0_Mask.Sample(linear_repeat_s, i.uv01.xy); +#else + float rl0_mask = 1; +#endif + applyMatcap(pbr, rl0, _Rim_Lighting0_Mode, rl0_mask); +#endif +#if defined(_RIM_LIGHTING1) + float rl1_dist = exp2(-_Rim_Lighting1_Power * abs(rl_radius - _Rim_Lighting1_Center)); + float3 rl1 = _Rim_Lighting1_Color * _Rim_Lighting1_Brightness * rl1_dist; +#if defined(_RIM_LIGHTING1_MASK) + float rl1_mask = _Rim_Lighting1_Mask.Sample(linear_repeat_s, i.uv01.xy); +#else + float rl1_mask = 1; +#endif + applyMatcap(pbr, rl1, _Rim_Lighting1_Mode, rl1_mask); +#endif +} + +#endif + |
