OpenGL: Использование шейдеров для создания освещения вершин с использованием предварительно рассчитанной карты цветов? - PullRequest
1 голос
/ 19 ноября 2010

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

Я не могу использовать типичное освещение OpenGLпотому что это, вероятно, слишком медленно и есть много источников света, которые мне нужно визуализировать.Я собираюсь сначала «визуализировать» источники света на карте цветов, а затем я могу вручную сопоставить каждую вершину, нарисованную с соответствующим цветом из карты цветов.

... Или я мог бы каким-то образом автоматизировать этот процесс, поэтомумне не пришлось бы менять значения цвета вершин самостоятельно, но шейдер мог бы сделать это для меня?

Вопросы ... это возможно, и если это так: что мне нужно знать, чтобы это сделать?возможно?

Редактировать: Обратите внимание, что мне также нужно эффективно обновить карту освещения, не заботясь о размере карты освещения, поэтому обновление следует выполнять только в этой конкретной части карты освещения.я хочу обновить.

Ответы [ 3 ]

0 голосов
/ 20 ноября 2010

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

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

0 голосов
/ 11 февраля 2011

Это возможно, но не будет эффективно на текущем оборудовании.

Вы хотите преобразовать легкие объемы в трехмерную текстуру.Растеризатор работает на 2D-поверхности, поэтому ваши объемы должны быть разделены вдоль одной из осей.Разделение может быть выполнено одним из следующих способов:

  • Различные вызовы отрисовки для каждого разделения
  • Экземплярное рисование с выбором слоя на основе glInstanceID (потребуется геометрический шейдер)
  • Ответвление в геометрическом шейдере непосредственно из одного вызова отрисовки

Для его реализации я бы предложил прочитать спецификацию и примеры GL-3.Это будет непросто и не будет достаточно быстро в результате для сложных сцен.

0 голосов
/ 19 ноября 2010

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

Это отличается в некотором смысле: вместо того, чтобы просто воздействовать на вершины, он будет отображаться на отдельные фрагменты (пиксели, по сути).

Редактировать: я имел в виду не текстуру 3D, а карту куба.По сути, создайте виртуальный куб, окружающий все в вашем «мире».Создайте 2D текстуру для каждой грани куба.Визуализируйте свою раскраску на кубической карте.Затем, чтобы окрасить вершину, вы (виртуально) расширяете луч наружу от центра, через вершину, к кубу.Пиксель, попавший на карту куба, дает вам цвет освещения для этой вершины.

Обновление должно быть относительно эффективным - у вас есть обычные 2D текстуры для верха, низа, лицевой стороны и т. Д., И вы обновляетеих по мере необходимости.

...