Created
July 16, 2018 14:56
-
-
Save andybak/2cf3965eedaf296437ff9c2c7ca7ca8a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Shader "Custom/Latsko"{ | |
Properties { | |
_Color ("Diffuse Material Color", Color) = (1,1,1,1) | |
} | |
SubShader { | |
Pass { | |
Tags { "LightMode" = "ForwardBase" } // pass for | |
// 4 vertex lights, ambient light & first pixel light | |
CGPROGRAM | |
#pragma multi_compile_fwdbase | |
#pragma vertex vert | |
#pragma fragment frag | |
#include "UnityCG.cginc" | |
uniform float4 _LightColor0; | |
// color of light source (from "Lighting.cginc") | |
// User-specified properties | |
uniform float4 _Color; | |
struct vertexInput { | |
float4 vertex : POSITION; | |
float3 normal : NORMAL; | |
float3 color : COLOR; | |
}; | |
struct vertexOutput { | |
float4 pos : SV_POSITION; | |
float4 posWorld : TEXCOORD0; | |
float3 vertexLighting : TEXCOORD2; | |
}; | |
vertexOutput vert(vertexInput input) | |
{ | |
vertexOutput output; | |
float4x4 modelMatrix = unity_ObjectToWorld; | |
float4x4 modelMatrixInverse = unity_WorldToObject; | |
output.posWorld = mul(modelMatrix, input.vertex); | |
output.pos = UnityObjectToClipPos(input.vertex); | |
// Diffuse reflection by four "vertex lights" | |
output.vertexLighting = float3(0.0, 0.0, 0.0); | |
#ifdef VERTEXLIGHT_ON | |
for (int index = 0; index < 4; index++) | |
{ | |
float4 lightPosition = float4(unity_4LightPosX0[index], | |
unity_4LightPosY0[index], | |
unity_4LightPosZ0[index], 1.0); | |
float3 vertexToLightSource = lightPosition.xyz - output.posWorld.xyz; | |
float squaredDistance = dot(vertexToLightSource, vertexToLightSource); | |
float attenuation = 1.0 / (1.0 + unity_4LightAtten0[index] * squaredDistance); | |
float3 diffuseReflection = attenuation * unity_LightColor[index].rgb * _Color.rgb * input.color; | |
output.vertexLighting = output.vertexLighting + diffuseReflection; | |
} | |
#endif | |
return output; | |
} | |
float4 frag(vertexOutput input) : COLOR | |
{ | |
float attenuation; | |
if (0.0 == _WorldSpaceLightPos0.w) // directional light? | |
{ | |
attenuation = 1.0; // no attenuation | |
} | |
else // point or spot light | |
{ | |
float3 vertexToLightSource = _WorldSpaceLightPos0.xyz - input.posWorld.xyz; | |
float distance = length(vertexToLightSource); | |
attenuation = 1.0 / distance; // linear attenuation | |
} | |
float3 ambientLighting = UNITY_LIGHTMODEL_AMBIENT.rgb * _Color.rgb; | |
float3 diffuseReflection = attenuation * _LightColor0.rgb * _Color.rgb; | |
return float4(input.vertexLighting + ambientLighting + diffuseReflection, 1.0); | |
} | |
ENDCG | |
} | |
Pass { | |
Tags { "LightMode" = "ForwardAdd" } | |
// pass for additional light sources | |
Blend One One // additive blending | |
CGPROGRAM | |
#pragma vertex vert | |
#pragma fragment frag | |
#include "UnityCG.cginc" | |
uniform float4 _LightColor0; // color of light source (from "Lighting.cginc") | |
// User-specified properties | |
uniform float4 _Color; | |
struct vertexInput { | |
float4 vertex : POSITION; | |
float3 normal : NORMAL; | |
}; | |
struct vertexOutput { | |
float4 pos : SV_POSITION; | |
float4 posWorld : TEXCOORD0; | |
}; | |
vertexOutput vert(vertexInput input) | |
{ | |
vertexOutput output; | |
float4x4 modelMatrix = unity_ObjectToWorld; | |
float4x4 modelMatrixInverse = unity_WorldToObject; | |
output.posWorld = mul(modelMatrix, input.vertex); | |
output.pos = UnityObjectToClipPos(input.vertex); | |
return output; | |
} | |
float4 frag(vertexOutput input) : COLOR | |
{ | |
float attenuation; | |
if (0.0 == _WorldSpaceLightPos0.w) // directional light? | |
{ | |
attenuation = 1.0; // no attenuation | |
} | |
else // point or spot light | |
{ | |
float3 vertexToLightSource = _WorldSpaceLightPos0.xyz - input.posWorld.xyz; | |
float distance = length(vertexToLightSource); | |
attenuation = 1.0 / distance; // linear attenuation | |
} | |
float3 diffuseReflection = attenuation * _LightColor0.rgb * _Color.rgb; | |
return float4(diffuseReflection, 1.0); | |
// no ambient lighting in this pass | |
} | |
ENDCG | |
} | |
} | |
Fallback "Specular" | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment