Важное различие между OpenGL и Vulkan здесь заключается в том, что нормализованные координаты устройства (NDC) имеют различный диапазон для z (глубина). В OpenGL это -1 к 1, а в Vulkan это 0 к 1.
Однако, в OpenGL, когда глубина сохраняется в текстуре глубины и вы читаете из нее, значение дополнительно нормализуется до 0 к 1. Это похоже на случай в вашем примере, так как первая строка вашей функции отображается обратно от -1 до 1.
В Vulkan ваша глубина всегда находится в диапазоне от 0 до 1, поэтому вышеуказанная функция работает и в Vulkan. Вы можете немного упростить это:
float linearize_depth(float d,float zNear,float zFar)
{
return zNear * zFar / (zFar + d * (zNear - zFar));
}