В затенении Гуро, что такое Т-образный переход и как его продемонстрировать с помощью OpenGL

Я заметил здесь, в части Затенения Гуро, там говорилось, что "Т-образные переходы с примыкающими полигонами иногда могут приводить к визуальным аномалиям. В общем, Т-образных переходов следует избегать".

Кажется, что Т-образный переход - это примерно три поверхности на рисунке ниже общих границ, и точка A может иметь различный вектор нормали, потому что он принадлежит разным поверхностям.

Но каков эффект, когда произошел T-переход, и как использовать OpenGL для его реализации? Я попытался установить разные нормали для каждой вершины каждого прямоугольника и осветил сцену, однако я не увидел ничего странного в точке соединения А.

Вот мой код:

glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_QUADS);
glNormal3f(0, 0,1);
glVertex3f(-5.0f, 5.0f, 0.0f);
glNormal3f(0, 1,1);
glVertex3f(5.0f, 5.0f, 0.0f);
glNormal3f(1, 1,1);
glVertex3f(5.0f, 0.0f, 0.0f);
glNormal3f(0, -1,1);
glVertex3f(-5.0f, 0.0f, 0.0f);
glEnd();

glColor3f(0.0f, 1.0f, 0.0f);
glBegin(GL_QUADS);
glNormal3f(1, 0,1);
glVertex3f(-5.0f, 0.0f, 0.0f);
glNormal3f(1, 2,1);
glVertex3f(0.0f, 0.0f, 0.0f);
glNormal3f(0, 0,1);
glVertex3f(0.0f, -5.0f, 0.0f);
glNormal3f(0, 1, 2);
glVertex3f(-5.0f, -5.0f, 0.0f);
glEnd();

glColor3f(0.0f, 0.0f, 1.0f);
glBegin(GL_QUADS);
glNormal3f(1, 1, 3);
glVertex3f(0.0f, 0.0f, 0.0f);
glNormal3f(0, -2, 5);
glVertex3f(5.0f, 0.0f, 0.0f);
glNormal3f(-1, 1, 1);
glVertex3f(5.0f, -5.0f, 0.0f);
glNormal3f(1, -2, 0);
glVertex3f(0.0f, -5.0f, 0.0f);
glEnd();

Точечный свет находится в (0, 0, 10), а также в камере. Результат ниже не имеет визуальной аномалии, я думаю. Может быть, нормали должны быть особенными?

Что-то не так я сделал? Может ли кто-нибудь дать мне несколько советов, чтобы это произошло?

2 ответа

Решение

T-Junction плохо подходит для затенения Гуро и геометрии в целом.

Прежде всего следует помнить, что затенение Горада - это метод интерполяции света, используемый в эпоху фиксированных конвейеров, когда свет интерполируется по вершинам, что делает тесселяцию сетки (количество и связность) вершин непосредственно влияет на затенение. Наличие Т-образного перехода даст внезапный разрыв в том, как будет выглядеть окончательный интерполированный цвет (имейте в виду, что у затенения Гуро есть другие проблемы, такие как недостаточная выборка).

Затенение Гуро напрямую использует нормали вершин в отличие от затенения Фонга, и как примечание не путайте затенение Фонга с освещением Фонга, они отличаются

Обратите внимание, что случай, который вы представляете, представляет собой t-переход, но вы не заметите никаких проблем с затенением, потому что меш недостаточно тесселирован и (кажется) вы не используете свет. Попробуйте провести тестирование на сфере с Т-образным соединением.

Относительно геометрии t-переход считается вырожденным случаем. Поскольку в этом ребре / многоугольнике геометрическая сетка теряет согласованность, у вас больше нет двух ребер, соединенных на их концах, и вы теряете свойство многоугольной петли (читай: направленные ребра). Обычно это сложная задача, решение которой может заключаться в триангуляции многоугольников, чтобы ребро t-соединения теперь было правильно соединено.

http://en.wikipedia.org/wiki/Gouraud_shading

Чем больше вы разберетесь с этой ситуацией, тем яснее станет проблема в ее основе. С одним убедительным примером и временем, потраченным на его просмотр, вы, вероятно, скажете: "Ага!" и это щелкнет.

Теоретически проблема обычно описывается как ситуация, когда пиксели в непосредственной и соседней области t-вершины заштрихованы на основе отдельных и иногда различных входных данных (нормали в t-верте по сравнению с нормалями соседних вершин). Вы можете преувеличить проблему в качестве иллюстрации, установив для нормали t-вертикали нечто очень отличное от нормалей соседних вершин (например, сильно отличающихся от их среднего значения).

Однако на практике, помимо угловых случаев, вы обычно имеете дело с плавными градациями нормалей между вершинами, поэтому проблема более тонкая. Я рассматриваю проблему по-другому из-за этого: как пример распространения данных. Ситуация вызывает интерполяцию между образцами, которая не распространяет данные образца по поверхности однородным образом. В вашем примере вход образца света t-vert не распространяется вверх, только влево / вправо / вниз. Это одна из причин того, что t-вершины являются проблематичными, они представляют разрывы в сети меша, которые приводят к таким проблемам.

Вы можете визуализировать это в своем уме, изображая световые значения в каждой из нормальных точек на поверхности, а затем думая о том, какие будут результирующие цвета на гранях для заданных местоположений света. Используя ваш пример, но с более плавной градацией нормалей, для верхней грани вы увидите одну длинную линейную интерполяцию цвета. Для двух нижних граней вы увидите две линейные интерполяции цвета, управляемые нормалью t-вершины. В зависимости от угла света нормаль t-вершины может поглощать различное количество света, чем соседние нормали. Это разделит цветовые интерполяции над и под ним, и вы увидите затененный шов.

Чтобы проиллюстрировать на вашем примере, я бы использовал только один цвет, отрегулировал нормали, чтобы они сформировали более равномерное распределение относительного угла (что-то вроде набора, который я добавлю ниже), а затем просмотрел его с использованием различных источников света (особенно близкие к t-вершине).

top left normal: [-1, 1, 1]
top right normal: [1, 1, 1]
middle left normal: [-1, 0, 1]
t-vert normal: [0, 0, 1]
middle right normal: [1, 0, 1]
bottom left normal: [-1, -1, 1]
bottom middle normal: [0, -1, 1]
bottom right normal: [1, -1, 1]

Поскольку это проблема, обусловленная неравномерным распространением выборочных данных, а именно интерполяцией является распространение, аналогичные аномалии возникают, кстати, и при использовании других методов интерполяции (например, затенение Фонга).

Другие вопросы по тегам