Вычисление нормалей на кубе: вершины или шейдеры?

У меня вполне теоретический вопрос по поводу нормалей в OpenGL. Я нигде не мог найти внятного объяснения (мои знания в этом предмете не точные).

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

Но включение нормалей в вершины приводит к тому, что эти вершины не разделяются:

  • На кубе с общими вершинами у нас будет 8 вершин.
  • На кубе с неразделенными вершинами у нас будет 8 * 3 = 32 вершины.

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

Вдобавок ко всему, я бы хотел, чтобы эти вершины не разделяли координаты текстуры, применяемой к ним (например, вершина в нижнем левом углу перед нами будет иметь (0,0) UV-координаты для текстуры на ПЕРЕДНЯЯ грань куба, УФ-координата (0,1) для текстуры на ЛЕВОЙ грани куба и (1,1) УФ-координата для текстуры на НИЖНЕЙ грани куба). Могут ли шейдеры добиться этой работы при исправлении текстуры?

В заключение, как лучше всего применить необщую текстуру и не разделяемую UV-координату к вершине: с необщими вершинами (намного больше вершин) или с шейдером (больше работы для графического процессора, я думаю )?


person johnkork    schedule 23.03.2014    source источник
comment
Наиболее распространенный метод - это повторение вершин с разными атрибутами, но вы также можете вычислить нормали в шейдере geom (увеличивая работу для графического процессора) и использовать индекс примитивов для каждой нарисованной грани для выделения правильной текстуры. Комбинация обернутых текстур может быть построена в fbo, если вы иметь только отдельные входные данные   -  person j-p    schedule 23.03.2014


Ответы (1)


Я бы сказал, это зависит от вашего варианта использования. Учтите следующее:

  • Сколько вершин нужно отрендерить? Если их мало, экономия места для хранения сетки не очень важна.
  • Как часто вершины передаются с CPU на GPU? Если это необходимо для каждого кадра, сохранение вершин может ускорить время рендеринга.
  • У большинства из вас края негладкие? Если большинство краев должны выглядеть гладкими, вы можете сломать сетку только в тех немногих случаях, когда это необходимо.

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

person Danvil    schedule 23.03.2014
comment
Что касается количества вершин, это уже хорошее количество (300 000 ~), и умножение этого числа на 3 кажется мне плохой идеей. О том, как часто перемещаются вершины, я действительно не знаю, так как работаю с Ogre3D, но я постараюсь собрать некоторую информацию по этой теме :) Большое спасибо за ваш ответ. - person johnkork; 24.03.2014