- Home /
2nd Directional light
I'm trying to get my shader to take 2 lights into account when calculating the final output. I've got 2 passes and the second uses ForwardAdd but no 2nd light is being applied. Is there something wrong with my shader code that would cause this?
Here's the shader:
Shader "Infinite Runner/Diffuse Curve Specular"
{
Properties
{
_Color ("Color", Color) = (1.0, 1.0, 1.0, 1.0)
_Shininess ("Shininess", Range(0,1)) = 0.5
_MainTex("Main Texture", 2D) = "white"{}
}
SubShader
{
Pass
{
Tags { "LightMode" = "ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "DiffuseSpecularCurved.cginc"
ENDCG
}
Pass
{
Tags { "LightMode" = "ForwardAdd" }
Blend One One
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "DiffuseSpecularCurved.cginc"
ENDCG
}
}
FallBack "Diffuse"
}
Here's the .cginc
#if !defined(SpecIncluded)
#define SpecIncluded
#include "UnityPBSLighting.cginc"
uniform float4 _Color;
uniform float _Shininess;
uniform sampler2D _MainTex;
uniform float _Curvature;
struct fragmentInput
{
float4 pos : SV_POSITION;
float4 posWorld : TEXCOORD0;
float3 normalDir : TEXCOORD1;
float2 uv : TEXCOORD3;
};
fragmentInput vert(appdata_full v)
{
fragmentInput o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = v.texcoord;
o.posWorld = mul(unity_ObjectToWorld, v.vertex);
o.normalDir = mul(float4(v.normal, 0.0), unity_WorldToObject).xyz;
// Apply the curve
// Transform the vertex coordinates from model space into world space
// Now adjust the coordinates to be relative to the camera position
o.posWorld.xyz -= _WorldSpaceCameraPos.xyz;
// Reduce the y coordinate (i.e. lower the "height") of each vertex based
// on the square of the distance from the camera in the z axis, multiplied
// by the chosen curvature factor
//_Curvature=0.001;(
o.posWorld = float4( 0.0f, ((o.posWorld.z * o.posWorld.z) + (o.posWorld.x * o.posWorld.x)) * - _Curvature, 0.0f, 0.0f );
// Now apply the offset back to the vertices in model space
o.posWorld += mul(unity_WorldToObject, o.posWorld);
return o;
}
float4 frag(fragmentInput i) : SV_TARGET
{
i.normalDir = normalize(i.normalDir);
float4 diffuse = tex2D(_MainTex, i.uv);
float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
float3 lightDirection = _WorldSpaceLightPos0;
diffuse *= dot(lightDirection, i.normalDir);
float3 specularReflection = normalize(lightDirection + viewDirection);
float4 lc = _LightColor0;
float specular = pow(DotClamped( specularReflection, i.normalDir), _Shininess * 150);
return diffuse * lc + specular;
}
#endif
Comment
Your answer
Follow this Question
Related Questions
Odd Portional Screen Flickering 0 Answers
Shadow sprite rotation regardless of the light source 0 Answers
Finding object scale within a shader 1 Answer
Light Falloff Post Process Effect? 0 Answers
Unity Advanced Shader Help 0 Answers