summaryrefslogtreecommitdiffstats
path: root/Shaders/PBS_lighting.cginc
diff options
context:
space:
mode:
Diffstat (limited to 'Shaders/PBS_lighting.cginc')
-rw-r--r--Shaders/PBS_lighting.cginc322
1 files changed, 0 insertions, 322 deletions
diff --git a/Shaders/PBS_lighting.cginc b/Shaders/PBS_lighting.cginc
deleted file mode 100644
index 13bde82..0000000
--- a/Shaders/PBS_lighting.cginc
+++ /dev/null
@@ -1,322 +0,0 @@
-#ifndef PBS_LIGHTING
-#define PBS_LIGHTING
-
-#include "AutoLight.cginc"
-#include "UnityPBSLighting.cginc"
-
-struct appdata
-{
- float4 position : POSITION;
- float2 uv : TEXCOORD0;
- float3 normal : NORMAL;
-};
-
-struct v2f
-{
- float4 position : SV_POSITION;
- float4 uv : TEXCOORD0;
- float3 normal : TEXCOORD1;
- float3 worldPos : TEXCOORD2;
-
- #if defined(VERTEXLIGHT_ON)
- float3 vertexLightColor : TEXCOORD3;
- #endif
-};
-
-float BG_Enable;
-sampler2D BG_BaseColor;
-sampler2D BG_NormalMap;
-sampler2D BG_Metallic;
-sampler2D BG_Smoothness;
-sampler2D BG_Emission_Mask;
-float BG_Smoothness_Invert;
-float BG_NormalStrength;
-float3 BG_Emission_Color;
-float4 BG_BaseColor_ST;
-float4 BG_NormalMap_ST;
-float4 BG_Metallic_ST;
-float4 BG_Smoothness_ST;
-float4 BG_Emission_Mask_ST;
-
-float Enable_Custom_Cubemap;
-UNITY_DECLARE_TEXCUBE(Custom_Cubemap);
-
-void getVertexLightColor(inout v2f i)
-{
- #if defined(VERTEXLIGHT_ON)
- float3 light_pos = float3(unity_4LightPosX0.x, unity_4LightPosY0.x,
- unity_4LightPosZ0.x);
- float3 light_vec = light_pos - i.worldPos;
- float3 light_dir = normalize(light_vec);
- float ndotl = DotClamped(i.normal, light_dir);
- // Light fills an expanding sphere with surface area 4 * pi * r^2.
- // By conservation of energy, this means that at distance r, light intensity
- // is proportional to 1/(r^2).
- float attenuation = 1 / (1 + dot(light_vec, light_vec) * unity_4LightAtten0.x);
- i.vertexLightColor = unity_LightColor[0].rgb * ndotl * attenuation;
-
- i.vertexLightColor = Shade4PointLights(
- unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0,
- unity_LightColor[0].rgb,
- unity_LightColor[1].rgb,
- unity_LightColor[2].rgb,
- unity_LightColor[3].rgb,
- unity_4LightAtten0, i.worldPos, i.normal
- );
- #endif
-}
-
-v2f vert(appdata v)
-{
- v2f o;
- o.position = mul(UNITY_MATRIX_MVP, v.position);
- o.worldPos = mul(unity_ObjectToWorld, v.position);
- o.normal = UnityObjectToWorldNormal(v.normal);
- o.uv.xy = TRANSFORM_TEX(v.uv, BG_BaseColor);
- o.uv.zw = 1.0 - v.uv;
- getVertexLightColor(o);
- return o;
-}
-
-fixed sq_dist(fixed2 p0, fixed2 p1)
-{
- fixed2 delta = p1 - p0;
- return max(abs(delta.x), abs(delta.y));
-}
-
-float3 HUEtoRGB(in float H)
-{
- float R = abs(H * 6 - 3) - 1;
- float G = 2 - abs(H * 6 - 2);
- float B = 2 - abs(H * 6 - 4);
- return saturate(float3(R, G, B));
-}
-
-float3 HSVtoRGB(in float3 HSV)
-{
- float3 RGB = HUEtoRGB(HSV.x);
- return ((RGB - 1) * HSV.y + 1) * HSV.z;
-}
-
-fixed4 effect_squares (v2f i)
-{
- float2 uv = i.uv.zw;
- uv.y *= 2; // Text box has 2:1 aspect ratio
- const fixed time = _Time.y;
-
- #define PI 3.1415926535
- fixed theta = PI/4 + sin(time / 4) * 0.1;
- fixed2x2 rot =
- fixed2x2(cos(theta), -1 * sin(theta),
- sin(theta), cos(theta));
-
- #define NSQ_X 9.0
- #define NSQ_Y 5.0
-
- // Map uv from [0, 1] to [-.5, .5].
- fixed2 p = uv - 0.5;
- p *= fixed2(NSQ_X, NSQ_Y);
- p = mul(rot, p);
- p -= 0.5;
-
- // See how far we are from the nearest grid point
- fixed2 intra_pos = frac(p);
- fixed2 intra_center = fixed2(0.5, 0.5);
- fixed intra_dist = sq_dist(intra_pos, intra_center);
-
- fixed st0 = (sin(time) + 1) / 2;
- fixed st1 = (sin(time + PI/8) + 1) / 2;
- fixed st2 = (sin(time + PI/2) + 1) / 2;
- fixed st3 = (sin(time + PI/2 + PI/8) + 1) / 2;
-
- fixed2 center = fixed2(0, 0);
- center = mul(rot, center);
- center -= 0.5;
- fixed2 rot_lim = fixed2(NSQ_X, NSQ_Y);
- rot_lim = mul(rot, rot_lim);
- rot_lim -= 0.5;
-
- float v = 0;
- float x = 0;
-
- if (intra_dist > 0.5 * (0.5 + sin(time * 1.5) * 0.1)) {
- v = intra_dist;
- } else {
- v = 0;
- }
-
- fixed extra_dist = sq_dist(p, center);
- fixed check = max(rot_lim.x, rot_lim.y) / 2;
- if (extra_dist > check * st0) {
- v = 1.0 - v;
- }
- if (extra_dist > check * st1) {
- v = 1.0 - v;
- }
- if (extra_dist > check * st2) {
- v = 1.0 - v;
- }
- if (extra_dist > check * st3) {
- v = 1.0 - v;
- } else {
- x = 0.50;
- }
-
- fixed3 hsv;
- hsv[0] = (v * 0.2 * (1 - x * .8) + 0.55) - x;
- hsv[1] = 0.7;
- hsv[2] = 0.8;
-
- fixed3 col = HSVtoRGB(hsv);
-
- return fixed4(col, 1.0);
-}
-
-fixed4 margin_effect(v2f i)
-{
- return effect_squares(i);
-}
-
-UnityLight GetLight(v2f i)
-{
- UNITY_LIGHT_ATTENUATION(attenuation, 0, i.worldPos);
- float3 light_color = _LightColor0.rgb * attenuation;
-
- UnityLight light;
- light.color = light_color;
- #if defined(POINT) || defined(POINT_COOKIE) || defined(SPOT)
- light.dir = normalize(_WorldSpaceLightPos0.xyz - i.worldPos);
- #else
- light.dir = _WorldSpaceLightPos0.xyz;
- #endif
- light.ndotl = DotClamped(i.normal, light.dir);
-
- return light;
-}
-
-UnityIndirect GetIndirect(v2f i, float3 view_dir, float smoothness) {
- UnityIndirect indirect;
- indirect.diffuse = 0;
- indirect.specular = 0;
-
- #if defined(VERTEXLIGHT_ON)
- indirect.diffuse = i.vertexLightColor;
- #endif
-
- #if defined(FORWARD_BASE_PASS)
- indirect.diffuse += max(0, ShadeSH9(float4(i.normal, 1)));
- float3 reflect_dir = reflect(-view_dir, i.normal);
- // There's a nonlinear relationship between mipmap level and roughness.
- float roughness = 1 - smoothness;
- roughness *= 1.7 - .7 * roughness;
- float3 env_sample;
- if (Enable_Custom_Cubemap) {
- env_sample = UNITY_SAMPLE_TEXCUBE_LOD(
- Custom_Cubemap,
- reflect_dir,
- roughness * UNITY_SPECCUBE_LOD_STEPS);
- } else {
- env_sample = UNITY_SAMPLE_TEXCUBE_LOD(
- unity_SpecCube0,
- reflect_dir,
- roughness * UNITY_SPECCUBE_LOD_STEPS);
- }
- indirect.specular = env_sample;
- #endif
-
- return indirect;
-}
-
-void initNormal(inout v2f i)
-{
- if (BG_Enable) {
- i.normal = UnpackScaleNormal(
- tex2Dgrad(BG_NormalMap, i.uv.xy, ddx(i.uv.x), ddy(i.uv.y)),
- BG_NormalStrength);
- // Swap Y and Z
- i.normal = i.normal.xzy;
- }
- i.normal = normalize(i.normal);
-}
-
-fixed4 light(v2f i,
- sampler2D albedo_map,
- sampler2D normal_map,
- float normal_str,
- sampler2D metallic_map,
- sampler2D smoothness_map,
- float invert_smoothness,
- sampler2D emission_mask,
- float3 emission_color)
-{
- initNormal(i);
-
- float2 iddx = ddx(i.uv.x);
- float2 iddy = ddy(i.uv.y);
- fixed4 albedo = tex2Dgrad(albedo_map, i.uv, iddx, iddy);
-
- fixed3 normal = UnpackScaleNormal(
- tex2Dgrad(normal_map, i.uv.xy, iddx, iddy),
- normal_str);
- // Swap Y and Z
- normal = normal.xzy;
-
- float3 view_dir = normalize(_WorldSpaceCameraPos - i.worldPos);
-
- float metallic = tex2Dgrad(metallic_map, i.uv.xy, iddx, iddy);
-
- float3 specular_tint;
- float one_minus_reflectivity;
- albedo.rgb = DiffuseAndSpecularFromMetallic(
- albedo, metallic, specular_tint, one_minus_reflectivity);
-
- UnityIndirect indirect_light;
- indirect_light.diffuse = 0;
- indirect_light.specular = 0;
-
- float smoothness = tex2Dgrad(smoothness_map, i.uv.xy, iddx, iddy);
- if (invert_smoothness) {
- smoothness = 1 - smoothness;
- }
-
- fixed3 emission = tex2Dgrad(emission_mask, i.uv.xy, iddx, iddy) * emission_color;
-
- fixed3 pbr = UNITY_BRDF_PBS(albedo, specular_tint,
- one_minus_reflectivity, smoothness,
- i.normal, view_dir, GetLight(i), GetIndirect(i, view_dir, smoothness)).rgb;
- pbr.rgb += emission;
-
- return fixed4(pbr, albedo.a);
-}
-
-fixed4 frag(v2f i) : SV_Target
-{
- float2 uv = i.uv.zw;
- // Fix text orientation
- uv.y = 0.5 - uv.y;
- uv.x = 1.0 - uv.x;
- uv.y *= 2; // Text box has 2:1 aspect ratio
-
- // Derived from github.com/pema99/shader-knowledge (MIT license).
- if (unity_CameraProjection[2][0] != 0.0 ||
- unity_CameraProjection[2][1] != 0.0) {
- uv.x = 1.0 - uv.x;
- }
-
- if (BG_Enable) {
- return light(i,
- BG_BaseColor,
- BG_NormalMap,
- BG_NormalStrength,
- BG_Metallic,
- BG_Smoothness,
- BG_Smoothness_Invert,
- BG_Emission_Mask,
- BG_Emission_Color);
- } else {
- return fixed4(1, 1, 1, 0);
- }
-}
-
-#endif // PBS_LIGHTING
-