Let’s start off with the easy question.
Using the screen position is guaranteed to match up, but for post process effects (using Blit() or similar) the UVs of the quad / tri being drawn are often setup to match saving some math.
Now on to the rest of it.
Some basics. The depth value stored in the buffer buffer when rendering with a perspective projection matrix is a non-linear value between 0.0 and 1.0. Traditionally 1.0 is the far plane, and 0.0 is the near plane, but Unity uses a reversed Z so that’s reversed. That’s another conversation. However understand that a depth buffer value of 0.5 is not half way between the near and far plane, but actually quite close to the camera, even with a fairly distant far plane.
The _CameraDepthTexture stores the depth value exactly as it would be in the depth buffer as a 32 bit float texture. The SAMPLE_DEPTH_TEXTURE macro is just a simple tex2D call on most platforms, but you only ever want a single channel from the texture read, and sometimes special handling of floating point textures is required, so it’s a macro.
Converting this floating point value from that non-linear 1.0 to 0.0 range to a linear range is what the two most commonly seen functions do. LinearEyeDepth and Linear01Depth. The DECODE_EYEDEPTH macro just calls that first function.
LinearEyeDepth takes the depth buffer value and converts it into world scaled view space depth. The original depth texture 0.0 will become the far plane distance value, and 1.0 will be the near clip plane. So now with the value you get from the linear eye depth function, 1 is a surface that is 1 unit from the camera’s pivot along the camera’s z axis. A value of 100 is 100 units, 200 is 200 units, you get the idea.
Linear01Depth mostly just makes the non-linear 1.0 to 0.0 range be a linear 0.0 to 1.0, so 0.5 really is half way between the camera and far plane.
The _CameraDepthNormalsTexture is a different beast. This actually has nothing to do with the depth buffer at all. This is storing the linear view depth and view normals in a single RGBA32 texture. The normals are stored in view space using stereographic projection. Basically the x and y values are stretched a bit so it can represent values facing away from the camera with out needing a third component. This is because with perspective projections, you can sometimes see view space normals that aren’t facing along the camera’s forward axis. It also means that the normals are a slightly lower quality. The depth is even more curious. It is a view space linear depth with a range of 0.0 to 1.0 encoded as a 16 bit float stored in two channels of the RGBA32. This means 0.5 is half way between the camera and the far plane, just like Linear01Depth gets you when using the _CameraDepthTexture, but it means the quality of this depth is very, very poor.
That’s where DecodeDepthNormal and DecodeFloatRG come in. It takes that 8 bit per channel RGBA texture and extracts the 16 bit float depth and view space normal (with a reconstructed Z).
So, you might ask, “why are there two depth textures, especially if one is so bad?” Because a lot of post process effects can get away with not needing a high quality depth buffer. And, more importantly, for effects that need both the depth and normal, you’re getting both in a single, cheap, texture sample. This mattered a lot more several years ago than it does today, but can still be a decent performance increase if you’re doing a lot of depth or normal samples, like when doing SSAO, or edge detection.