- Home /
outline shader problems
I'm having trouble to queue my Outline.
I can't get it to be allways drawn on front of everything. Can you please help me? all the stuff I'm doing doesn't seem to have any effect to my outline object.
Script I'm using (present on several objects. also on the outline object. to set the queue):
/*
SetRenderQueue.cs
Sets the RenderQueue of an object's materials on Awake. This will instance
the materials, so the script won't interfere with other renderers that
reference the same materials.
*/
using System.Collections.Generic;
using UnityEngine;
[AddComponentMenu("Rendering/SetRenderQueue")]
public class SetRenderQueue : MonoBehaviour
{
[SerializeField]
protected int[] m_queues = new int[] { 3000 };
protected void Awake() {
Renderer[] rr = GetComponents<Renderer>();
List<Material> materials = new List<Material>();
foreach (Renderer r in rr) {
materials.AddRange(r.materials);
}
Terrain t = GetComponent<Terrain>();
if (t) materials.Add(t.materialTemplate);
for (int i = 0; i < materials.Count && i < m_queues.Length; ++i) {
materials[i].renderQueue = m_queues[i];
}
enabled = false;
}
}
Shader I'm using:
Shader "Outlined/Silhouette Only" {
Properties {
_OutlineColor ("Outline Color", Color) = (0,0,0,1)
_Outline ("Outline width", Range (0.0, 0.03)) = .005
}
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" }
Pass {
Name "BASE"
Cull Back
Blend Zero One
// uncomment this to hide inner details:
//Offset -8, -8
SetTexture [_OutlineColor] {
ConstantColor (0,0,0,0)
Combine constant
}
}
// note that a vertex shader is specified here but its using the one above
Pass {
Name "OUTLINE"
Tags { "LightMode" = "Always" "Queue" = "Overlay"}
Cull Front
// 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
}
}
Fallback "Diffuse"
}
wow, 3 days and everything I get is a 10 character comment.
"Z-Testing" I dont' know what that is, why are you asking a question in my question? is that question for me? what does it mean?
Sorry, was in a bit of a hurry. Was wondering if you had tried Z-Testing.
http://docs.unity3d.com/$$anonymous$$anual/SL-CullAndDepth.html (3rd one down)
You can use Z-Testing in the shaderlab before CG/inside a pass to change how the object is drawn. I think 'greater' draws it in front of everything else.
I played with the shader a bit, tested ZTest and some Blend stuff also swichted passes arround. I'm pretty sure this all has to do something with how to fix it, but I can't find the right combinations. I don't know much about shader writing. I wrote some stuff, and this one looks very strange compared to what I've learned yet.
This was my Goto
https://en.wikibooks.org/wiki/Cg_Program$$anonymous$$g/Unity
Answer by tanoshimi · Apr 15, 2016 at 05:33 PM
Try modifying the start of your subshader to be...
SubShader {
Tags {
"Queue"="Overlay+1"
}
ZWrite Off
ZTest Always
...