Линеаризовать глубину - PullRequest
0 голосов
/ 29 июня 2018

В OpenGL вы можете линеаризовать значение глубины следующим образом:

float linearize_depth(float d,float zNear,float zFar)
{
    float z_n = 2.0 * d - 1.0;
    return 2.0 * zNear * zFar / (zFar + zNear - z_n * (zFar - zNear));
}

(Источник: https://stackoverflow.com/a/6657284/10011415)

Тем не менее, Vulkan обрабатывает значения глубины несколько по-другому (https://matthewwellings.com/blog/the-new-vulkan-coordinate-system/). Я не совсем понимаю математику, стоящую за этим, какие изменения я должен внести в функцию линеаризации значения глубины с помощью Vulkan?

1 Ответ

0 голосов
/ 02 июля 2018

Важное различие между 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));
}
...