Почему разделение перспективы после применения обратного преобразования перспективы?

#graphics #glsl #transform #coordinate-transformation

Вопрос:

Если у нас есть точка в пространстве NDC, и мы хотим преобразовать ее для просмотра пространства с использованием обратной проекции перспективы, зачем нам нужно применять разделение перспективы в конце? Разве это не должно быть умножением перспективы, поскольку применение проекции прямой перспективы из поля зрения в пространство NDC имеет разделение перспективы?

Я нашел это здесь: http://www.cse.chalmers.se/edu/course/TDA362/tutorials/ssao.html

 float fragmentDepth = texture(depthTexture, texCoord).r;

// Normalized Device Coordinates (clip space)
vec4 ndc = vec4(texCoord.x * 2.0 - 1.0, texCoord.y * 2.0 - 1.0, 
            fragmentDepth * 2.0 - 1.0, 1.0);

// Transform to view space
vec3 vs_pos = homogenize(inverseProjectionMatrix * ndc);
 

где

 vec3 homogenize(vec4 v) { return vec3((1.0 / v.w) * v); }
 

Ответ №1:

Если вы хотите преобразовать однородную координату в декартову координату, вы должны преобразовать ее так, чтобы компонент w был равен 1:

 (x, y, z, w) -> (x', y', z', 1)
 

Поэтому вам нужно разделить 4 компонента координаты на w компонент координаты:

 (x, y, z, w) -> (x/w, y/w, z/w, w/w)
 

Когда вы преобразуете пространство клипа в нормализованное пространство устройства, это называется разделением перспективы.

Обратите внимание, что при преобразовании из нормализованного пространства устройства в пространство просмотра координата преобразуется матрицей обратной проекции, а не матрицей проекции. Вы также должны разделить на компонент w после обратной проекции.
В качестве альтернативы вы можете умножить нормализованную координату устройства (x’, y’, z’, 1) на значение, выбранное таким образом, чтобы компонент w был равен 1 после преобразования с матрицей обратной проекции. Однако нет никаких веских причин для того, чтобы прилагать усилия для поиска этой ценности до преобразования.

Комментарии:

1. Есть ли причина не разделять w компонент сам по себе и просто исправлять xyz ? Я видел код, подобный PosVS = p.xyz / p.w; тому, где p получается путем применения обратной проекции. Может быть, это потому w , что компонент не используется позже?

2. @Omid Декартова координата состоит только из 3 компонентов (x, y, z). Нет, для этого нет никаких причин. В любом случае равно w/w 1, так что это не имеет значения