mirror of
https://github.com/DeMuenu/MoonlightVRC.git
synced 2025-12-13 11:33:54 +00:00
Moved light type calculation logic from BlendinShader.shader to a new include file, LightStrength.hlsl, for better modularity and maintainability. Updated the shader to use the new macro for light calculations, improving code clarity and reducing duplication.
172 lines
5.3 KiB
Plaintext
172 lines
5.3 KiB
Plaintext
Shader "DeMuenu/World/Hoppou/RevealStandart"
|
|
{
|
|
Properties
|
|
{
|
|
_MainTex ("Texture", 2D) = "white" {}
|
|
_MultTex ("Multiply Texture", 2D) = "white" {}
|
|
_MultiplicatorTex ("Multiply Texture Strength", Range(0,3)) = 0
|
|
_Color ("Color", Color) = (1,1,1,1)
|
|
|
|
_EmmisiveText ("Emmissive Texture", 2D) = "white" {}
|
|
_EmmissiveColor ("Emmissive Color", Color) = (1,1,1,1)
|
|
_EmmissiveStrength ("Emmissive Strength", Range(0,10)) = 0
|
|
|
|
|
|
//MoonsLight
|
|
_InverseSqareMultiplier ("Inverse Square Multiplier", Float) = 1
|
|
_LightCutoffDistance ("Light Cutoff Distance", Float) = 100
|
|
//MoonsLight END
|
|
|
|
|
|
|
|
}
|
|
SubShader
|
|
{
|
|
Tags { "RenderType"="Opaque" }
|
|
LOD 100
|
|
|
|
Pass
|
|
{
|
|
CGPROGRAM
|
|
#pragma vertex vert
|
|
#pragma fragment frag
|
|
|
|
#include "UnityCG.cginc"
|
|
#include "Includes/LightStrength.hlsl"
|
|
|
|
//MoonsLight Defines
|
|
#define MAX_LIGHTS 80 // >= maxPlayers in script
|
|
//MoonsLight Defines END
|
|
|
|
struct appdata
|
|
{
|
|
float4 vertex : POSITION;
|
|
float2 uv : TEXCOORD0;
|
|
float3 normal : NORMAL;
|
|
};
|
|
|
|
struct v2f
|
|
{
|
|
float2 uv : TEXCOORD0;
|
|
float2 uv2 : TEXCOORD1;
|
|
float2 uvEmmis : TEXCOORD4;
|
|
//UNITY_FOG_COORDS(1)
|
|
float4 vertex : SV_POSITION;
|
|
|
|
//MoonsLight
|
|
float3 worldPos : TEXCOORD2;
|
|
float3 worldNormal: TEXCOORD3;
|
|
|
|
//MoonsLight END
|
|
|
|
|
|
};
|
|
|
|
sampler2D _MainTex;
|
|
float4 _MainTex_ST;
|
|
sampler2D _MultTex;
|
|
float4 _MultTex_ST;
|
|
float _MultiplicatorTex;
|
|
float4 _Color;
|
|
|
|
|
|
sampler2D _EmmisiveText;
|
|
float4 _EmmisiveText_ST;
|
|
float4 _EmmissiveColor;
|
|
float _EmmissiveStrength;
|
|
|
|
|
|
//MoonsLight variables
|
|
float _InverseSqareMultiplier;
|
|
float _LightCutoffDistance;
|
|
|
|
float4 _LightPositions[MAX_LIGHTS]; // xyz = position
|
|
float4 _LightColors[MAX_LIGHTS]; // xyz = position
|
|
float4 _LightDirections[MAX_LIGHTS]; // xyz = direction, w = cos(halfAngle)
|
|
float _LightType[MAX_LIGHTS]; // 0 = sphere, 1 = cone
|
|
float _PlayerCount; // set via SetFloat
|
|
//MoonsLight variables END
|
|
|
|
|
|
v2f vert (appdata v)
|
|
{
|
|
v2f o;
|
|
o.vertex = UnityObjectToClipPos(v.vertex);
|
|
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
|
|
o.uv2 = TRANSFORM_TEX(v.uv, _MultTex);
|
|
o.uvEmmis = TRANSFORM_TEX(v.uv, _EmmisiveText);
|
|
|
|
|
|
//MoonsLight Vertex
|
|
float4 wp = mul(unity_ObjectToWorld, v.vertex);
|
|
o.worldPos = wp.xyz;
|
|
o.worldNormal = UnityObjectToWorldNormal(v.normal);
|
|
//MoonsLight Vertex END
|
|
|
|
return o;
|
|
}
|
|
|
|
fixed4 frag (v2f i) : SV_Target
|
|
{
|
|
// sample the texture
|
|
fixed4 col = tex2D(_MainTex, i.uv);
|
|
fixed4 mult = tex2D(_MultTex, i.uv2);
|
|
col = lerp(col, mult, _MultiplicatorTex);
|
|
fixed4 emmis = tex2D(_EmmisiveText, i.uvEmmis);
|
|
|
|
|
|
//MoonsLight
|
|
int count = (int)_PlayerCount;
|
|
|
|
float3 N = normalize(i.worldNormal); //for lambertian diffuse
|
|
// Example: compute distance to nearest player
|
|
float4 dmax = float4(0,0,0,1);
|
|
float dIntensity = 0;
|
|
[loop]
|
|
for (int LightCounter = 0; LightCounter < MAX_LIGHTS; LightCounter++)
|
|
{
|
|
if (LightCounter >= count) break;
|
|
float3 Lightposition = _LightPositions[LightCounter].xyz;
|
|
|
|
float distanceFromLight = length(i.worldPos - Lightposition);
|
|
if (distanceFromLight > _LightCutoffDistance) continue;
|
|
|
|
float sd = 0.0;
|
|
float contrib = 0.0;
|
|
|
|
|
|
float invSqMul = max(1e-4, _InverseSqareMultiplier);
|
|
|
|
|
|
//Lambertian diffuse
|
|
float3 L = normalize(Lightposition - i.worldPos); // Lightposition = light position
|
|
float NdotL = saturate(dot(N, L) * 0.5 + 0.5); // one-sided Lambert
|
|
if (NdotL <= 0) continue;
|
|
|
|
LightTypeCalculations(_LightColors, LightCounter, i, NdotL, dIntensity, _LightPositions[LightCounter].a, _LightPositions[LightCounter].xyz);
|
|
|
|
|
|
|
|
dmax = dmax + contrib * float4(LightColor, 1) * NdotL; // accumulate light contributions
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
//dmax.xyz = min(dmax * dIntensity, 1.0);
|
|
dmax.w = 1.0;
|
|
dmax = dmax;
|
|
|
|
|
|
//MoonsLight END
|
|
|
|
|
|
return col * _Color * dmax + emmis * _EmmissiveStrength * _EmmissiveColor;
|
|
}
|
|
ENDCG
|
|
}
|
|
}
|
|
|
|
FallBack "Diffuse"
|
|
} |