Problem with an Outline shader's depth
I'm trying to write a custom outline shader. I went off of an example that gave me a perfectly fine outline, but the outline is designed to always be in front of everything except the mesh it's outlining. I wanted to change this to make the outline basically sit just behind the object itself so that it can be occluded properly. I did this by adding the following property to my shader:
_ClipSpaceZ("Clip Space Z", Float) = 10.0
//...later, in CGPROGRAM block:
float _ClipSpaceZ;
//in the vertex shader:
o.vertex = mul(UNITY_SHADER_MVP, v.vertex);
o.vertex.z = _ClipSpaceZ;// * o.vertex.w
I set the value of this property in a custom script. The user defines a bounding sphere that encloses the mesh being outlined, and every frame a position on that sphere is chosen opposite the camera's position (i.e. behind the mesh from the camera's point of view). The clip-space Z coordinate of that position is then passed to the shader.
private void Update()
{
Vector3 boundingSpherePos = outlineMeshTr.position;
Vector3 camToSphere = (boundingSpherePos - camTr.position).normalized;
Vector3 worldOutlineCenter = boundingSpherePos + (camToSphere * BoundingSphereRadius);
Vector3 clipOutlineCenter = (CamObj.projectionMatrix * CamObj.worldToCameraMatrix).MultiplyPoint(worldOutlineCenter);
outlineMeshRenderer.material.SetFloat("_ClipSpaceZ", clipOutlineCenter.z);
}
However, this doesn't work properly; the black outline is basically always in front of the mesh. What am I doing wrong here?
Bump; I still haven't found a way around this problem. Is there some extra step I'm missing in correctly computing the clip-space Z component of "worldOutlineCenter"?
Your answer
Follow this Question
Related Questions
How do I get the exact values of the near and far planes in clip space, both in a shader and in C#? 0 Answers
i want to modify toon outline shader. 0 Answers
Intersection Shader intersects with Intersection Shader! 0 Answers
Increase thickness of outlines 0 Answers
Per-object outline effect in LWRP 0 Answers