Is there an easy way to get the camera’s forward vector in a surface shader (the near clip plane’s normal)? Perhaps a built-in shader constant or input struct variable? I want something like the viewDir
variable from here:
but just the forward vector, not a ray per-pixel.
I’m trying to do some calculations off pixel distances projected onto the near clipping plane’s normal instead of the distance from the camera position.
I know it’s 5 years later on from the original question, but the solution mentioned in the comments above worked for me too.
I put this in my frag function and it works perfectly:
float3 viewDir = UNITY_MATRIX_IT_MV[2].xyz;
For those of you still attempting to use moosefetcher’s answer, I tried this in my vertex shader and it messed with my lighting for some reason.
In the end I used float3 forward = mul((float3x3)unity_CameraToWorld, float3(0,0,1));
which worked fine.
If you want to get an analogue of IsFacing
in the vertex shader use:
half3 normal = UnityObjectToWorldNormal(v.normal);
half3 worldVert = mul(unity_ObjectToWorld, v.vertex);
half3 viewDir = _WorldSpaceCameraPos - worldVert;
normal *= lerp(-1, 1, dot(normal, viewDir) > 0);