OpenGL: Использование шейдеров для создания освещения вершин с помощью предварительно рассчитанной карты цветов?

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

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

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

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

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


person Newbie    schedule 19.11.2010    source источник


Ответы (3)


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

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

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

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

person Jerry Coffin    schedule 19.11.2010
comment
Мне не нужно затенение пикселей, нужно изменить только 4 угла моего GL_QUADS, так как это также будет быстрее. Создание 3D-текстуры звучит как проблема совместимости со старыми картами... Есть ли способ каким-то образом использовать мои сгенерированные данные с шейдером? - person Newbie; 19.11.2010
comment
Кроме того, эта карта освещения должна быть эффективно обновлена, см. мои правки. - person Newbie; 19.11.2010
comment
Кубическая карта хм... но мне нужно, чтобы она работала как 3D-текстуры, на самом деле цветовая карта, которую я буду использовать, будет иметь как минимум 257x257x257 разных цветов, поэтому я могу раскрасить отдельный полигон в центре мира соответствующим цветом. и если он находится между двумя из этих 256 кубов, он будет интерполировать цвет. Теперь я начинаю думать, что использование этого типа цветовой карты будет раздутым, когда я увеличу размер мира ... 257x257x257 будет использовать как минимум 67 МБ памяти: / Но вычисление цвета во время выполнения будет медленным ... любые лучшие идеи для освещения без используя GL_LIGHT[0-7]? - person Newbie; 19.11.2010

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

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

person Daniel    schedule 19.11.2010
comment
Но все мои источники света видны, возможности оптимизации для уменьшения количества источников света нет. - person Newbie; 20.11.2010
comment
Да, но оптимизация с отложенным рендерингом заключается не в том, чтобы уменьшить количество света (зачем вам свет, который не виден?), а в том, чтобы уменьшить количество вычислений света, рассчитывая только видимую геометрию. Обычный рендеринг может тратить много времени на расчет освещения вершин/фрагментов, которые в любом случае могут не отображаться в конце из-за другой геометрии перед ними. - person Daniel; 20.11.2010
comment
ах, понятно, да, я думал об этом, но также я не хотел бы пересчитывать каждый объект, освещающий каждый кадр... только если их положение меняется или когда меняется свет. также мне не нужны какие-либо отражения или что-то сложное, просто цветные вершины. - person Newbie; 21.11.2010

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

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

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

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

person kvark    schedule 11.02.2011