- Home /
Player Silhouette Shader ignore certain objects
Hi there everyone!
Recently I found a problem in my game where as it's in isometric view, if you standed behind an object, the camera couldn't see the player, so I researched a bit and ended up with a shader that would show the player's silhouette when any geometry would be obstructing the view on him.
Everything is working really nice, the only problem is that I have some objects that are a children of the player mesh that are getting in the way of that shader, so as they ARE part of the player's transform (but not of the mesh), I would like these objects to not "obstruct" the view.
Here's a few images:
Front player view (no problems):
Perspective player view, the jetpack, that is a children of the player's transform mesh, obstructs the view and shows a part of the player's silhouette:
This is the code for the shader I'm using (I must say I have no idea on shader programming, so any help or advice would be useful!):
Shader "Outlined/Silhouetted Diffuse" {
Properties {
_Color ("Main Color", Color) = (.5,.5,.5,1)
_OutlineColor ("Outline Color", Color) = (0,0,0,1)
_Outline ("Outline width", Range (0.0, 0.03)) = .005
_MainTex ("Base (RGB)", 2D) = "white" { }
}
CGINCLUDE
#include "UnityCG.cginc"
struct appdata {
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f {
float4 pos : POSITION;
float4 color : COLOR;
};
uniform float _Outline;
uniform float4 _OutlineColor;
v2f vert(appdata v) {
// just make a copy of incoming vertex data but scaled according to normal direction
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
float3 norm = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal);
float2 offset = TransformViewToProjection(norm.xy);
o.pos.xy += offset * o.pos.z * _Outline;
o.color = _OutlineColor;
return o;
}
ENDCG
SubShader {
Tags { "Queue" = "Transparent" }
// note that a vertex shader is specified here but its using the one above
Pass {
Name "OUTLINE"
Tags { "LightMode" = "Always" }
Cull Off
ZWrite Off
ZTest Always
ColorMask RGB // alpha not used
// you can choose what kind of blending mode you want for the outline
Blend SrcAlpha OneMinusSrcAlpha // Normal
//Blend One One // Additive
//Blend One OneMinusDstColor // Soft Additive
//Blend DstColor Zero // Multiplicative
//Blend DstColor SrcColor // 2x Multiplicative
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
half4 frag(v2f i) :COLOR {
return i.color;
}
ENDCG
}
Pass {
Name "BASE"
ZWrite On
ZTest LEqual
Blend SrcAlpha OneMinusSrcAlpha
Material {
Diffuse [_Color]
Ambient [_Color]
}
Lighting On
SetTexture [_MainTex] {
ConstantColor [_Color]
Combine texture * constant
}
SetTexture [_MainTex] {
Combine previous * primary DOUBLE
}
}
}
SubShader {
Tags { "Queue" = "Transparent" }
Pass {
Name "OUTLINE"
Tags { "LightMode" = "Always" }
Cull Front
ZWrite Off
ZTest Always
ColorMask RGB
// you can choose what kind of blending mode you want for the outline
Blend SrcAlpha OneMinusSrcAlpha // Normal
//Blend One One // Additive
//Blend One OneMinusDstColor // Soft Additive
//Blend DstColor Zero // Multiplicative
//Blend DstColor SrcColor // 2x Multiplicative
CGPROGRAM
#pragma vertex vert
#pragma exclude_renderers gles xbox360 ps3
ENDCG
SetTexture [_MainTex] { combine primary }
}
Pass {
Name "BASE"
ZWrite On
ZTest LEqual
Blend SrcAlpha OneMinusSrcAlpha
Material {
Diffuse [_Color]
Ambient [_Color]
}
Lighting On
SetTexture [_MainTex] {
ConstantColor [_Color]
Combine texture * constant
}
SetTexture [_MainTex] {
Combine previous * primary DOUBLE
}
}
}
Fallback "Diffuse"
}
And so, what I tried is to search if shaders could ignore layers or gameobject tags, but that's a Unity only runtime feature, so what I have also tried is to make the player camera ignore a layer where I then put in the objects I want to NOT draw the player's silhouette. But they end up by not rendering (of course, they're not in the culling mask..) so that's everything.
Again, any help, advice or explanation would be really helpful!
Thanks for everything beforehand ^^
Your answer
Follow this Question
Related Questions
Is it possible to pass SubShader tag as a parameter? 2 Answers
Silhouette Toon Shader 0 Answers
How do I make it so that I can attack more than 1 enemy? 1 Answer
Model Outline/Silhouette Shader 1 Answer
Ignore Player Input 4 Answers