Не разбирайтесь в captureViews в учебнике по рассеянному излучению в learnopengl.com - PullRequest
1 голос
/ 09 июня 2019

Я изучаю IBL в https://learnopengl.com/PBR/IBL/Diffuse-irradiance.

Учебник преобразует равносторонний в кубическую карту, создав 6 представлений.

А просмотром является следующий код:

glm::mat4 captureViews[] = 
{
   glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3( 1.0f,  0.0f,  0.0f), glm::vec3(0.0f, -1.0f,  0.0f)),
   glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(-1.0f,  0.0f,  0.0f), glm::vec3(0.0f, -1.0f,  0.0f)),
   glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3( 0.0f,  1.0f,  0.0f), glm::vec3(0.0f,  0.0f,  1.0f)),
   glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3( 0.0f, -1.0f,  0.0f), glm::vec3(0.0f,  0.0f, -1.0f)),
   glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3( 0.0f,  0.0f,  1.0f), glm::vec3(0.0f, -1.0f,  0.0f)),
   glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3( 0.0f,  0.0f, -1.0f), glm::vec3(0.0f, -1.0f,  0.0f))
};

Я не понимаю третий параметр glm::lookAt.

Третий параметр

glm::lookAt - это вектор up. Я думаю captureViews должно быть:

// zero is    [0, 0, 0]
// right is   [1, 0, 0]
// left is    [-1, 0, 0]
// up is      [0, 1, 0]
// down is    [0, -1, 0]
// back is    [0, 0, 1]
// forward is [0, 0, -1]
glm::mat4 captureViews[] = 
{
   glm::lookAt(zero, right, up),
   glm::lookAt(zero, left, up),
   glm::lookAt(zero, up, back),
   glm::lookAt(zero, down, forward),
   glm::lookAt(zero, back, up),
   glm::lookAt(zero, forward, up)
};

Но я совершенно не прав. Я не понимаю магию в векторе up урока.

Кто-нибудь может мне это объяснить?

1 Ответ

1 голос
/ 09 июня 2019

При использовании текстуры кубической карты трехмерный вектор направления должен быть преобразован в двухмерную текстурную координату относительно одной стороны карты.

Соответствующей частью спецификации для этого преобразования является Спецификация профиля ядра API OpenGL 4.6, 8.13 Выбор текстуры карты куба , стр. 253:

При выборке текстуры кубической карты обрабатываются (s t r) текстурные координаты. как вектор направления (rx ry rz), исходящий из центра куба. Координата q игнорируется. Во время наложения текстуры интерполированный вектор направления для каждого фрагмента выбирает одно из двумерных изображений грани карты куба на основе направления координат наибольшей величины (направления большой оси). Если две или более координаты имеют одинаковую величину, реализация может определить правило для устранения этой ситуации. Правило должно быть детерминированным и зависеть только от (rx ry rz). Столбец цели в таблице 8.19 объясняет, как направление главной оси отображается на двумерное изображение конкретной цели карты куба. Используя sc, tc и ma, определенные по направлению большой оси, как указано в таблице 8.19, обновленный (s t) рассчитывается следующим образом:

s = 1/2 * (s_c / |m_a| + 1)
t = 1/2 * (t_c / |m_a| + 1)


Major Axis Direction|        Target             |sc |tc |ma |
--------------------+---------------------------+---+---+---+
       +rx          |TEXTURE_CUBE_MAP_POSITIVE_X|−rz|−ry| rx|
       −rx          |TEXTURE_CUBE_MAP_NEGATIVE_X| rz|−ry| rx|
       +ry          |TEXTURE_CUBE_MAP_POSITIVE_Y| rx| rz| ry|
       −ry          |TEXTURE_CUBE_MAP_NEGATIVE_Y| rx|−rz| ry|
       +rz          |TEXTURE_CUBE_MAP_POSITIVE_Z| rx|−ry| rz|
       −rz          |TEXTURE_CUBE_MAP_NEGATIVE_Z|−rx|−ry| rz|
--------------------+---------------------------+---+---+---+

sc соответствует координате u, а tc - координатному v. Таким образом, tc должно быть в направлении вектора обзора вверх


Посмотрите на первый ряд таблицы:

+rx | TEXTURE_CUBE_MAP_POSITIVE_X | −rz | −ry | rx

Это означает, что для стороны X + (правая сторона) карты куба направления, которые соответствуют тангенциальной и бинормальной:

sc = (0, 0, -1)
tc = (0, -1, 0)

Это идеально соответствует 1-й строке таблицы glm::mat4 captureViews[]:

glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(1.0f, 0.0f, 0.0f), glm::vec3(0.0f, -1.0f, 0.0f))

, поскольку основное направление задается линией визирования, то есть направлением от положения глаза к цели (los = target - eye) и т. Д. (1, 0, 0).
Вектор повышения (или ts) равен (0, -1, 0).
sc определяется как перекрестное произведение линии визирования и вектора вверх (0, 0, -1).

...