#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, так что это не имеет значения