- Home /
Errors calculating clip-space Z position on the CPU side
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 outline is basically always in front of the mesh. How can I correctly calculate and use the clip-space Z position of worldOutlineCenter
?
Your answer
Follow this Question
Related Questions
Vertical Perspective / Horizontal Orthographic 1 Answer
how to change progection matrix for some objects 0 Answers
Previous Model*View*Projection Matrix 0 Answers
How to make an Off-axis / Off-center camera ? 2 Answers
WorldToViewportPoint problem 0 Answers