![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Источники света
Xerx © (2004-07-02 05:07:00)Доброй ночи (у меня :)! Ночи не сплю, все думаю: как реализовать более 8 источников света в OpenGL. Может как-то по хитрому рисовать или еще что? А если нельзя, то как же реализуют, или это просто точный просчет, что одновременно видно не больше? Получал ответ с предложением использовать OpenGL от NVidia, но он будет нормально работать на карточках не от NVidia?
MrAngel (2004-08-02 20:06:00) [1]ViK © (02.08.04 01:59) [22]
если не сложно то мне тоже... ^-)
RagE (2004-08-02 11:02:00) [2]ViK © (02.08.04 01:59) [22]
а можно и мне исходник? rage_prog@mail.ru
ViK (2004-08-02 01:59:00) [3]to Xerx
Исходик я выслал, разбирайся там все понятно
wiz (2004-07-30 15:08:00) [4]2 NailMan: оп-паньки...
сейчас внимательно перечитаю SDK по oGL
NailMan (2004-07-30 14:51:00) [5]насколько я понял, в D3D SDK(не думаю что OGL в этом отличается от D3D) - ограничение именно на включенные, а не загруженные источники.
"Check the MaxActiveLights member of the D3DCAPS9 structure when you retrieve device capabilities to determine the maximum number of active lightssupported by that device. If you no longer need a light, you can disable it or overwrite it with a new set of light properties."
Значит можно нагрузить более 8-ми источников и включить нужные 8(в максимуме). Остальные он будет просто игнорировать и никакого софтвара не будет, так как нефиг.
---
WBR, NailMan aka 2:5020/3337.13
Darthman (2004-07-30 12:12:00) [6]Аппаратно только 8, остальные можно задействовать софтово. Но скорость упадет катастрофически.
wiz (at work) (2004-07-30 10:30:00) [7]2 NailMan:
Если я правильно понимаю, то слотов под источники света в видюхе (аппаратно) - 8. Они хранятся в памяти карты и их можно просто перетыкать gl(En)/(Dis)able(...). Больше oGL (аппаратно) не позволяет. Т.е. все остальные источники нужно заливать в видюху из ОЗУшки.
Может быть есть какой-нибудь способ закинуть некую структуру в память карты а потом на неё ссылаться... (я о таком даже не слышал, но...)
А может быть есть способы обойти ограничение на 8 источников (какое-нибудь расширение и что-то еще)...
Я не знаю.
NailMan (2004-07-30 09:29:00) [8]wiz (at work)
А разве в OGL нельзя залить предварительно все источники в девайс, а потом просто энаблить/дизаблить нужные без прокачки всей структуры источника?
---
WBR, NailMan aka 2:5020/3337.13
wiz (at work) (2004-07-30 09:17:00) [9]2 Xerx:
моё предложение в плане математики - не очень сложный коллижн менеджер, и объектов в нём не так и много. Так что я думаю считать (если нормально написать и оптимизировать) такой менеджер будет всего пару миллисикунд на кадр (на машинке вроде P3-1000)...
другое дело, что тебе нужно будет заливать в видеокарту (на каждый объект) кучку лампочек (8 x N байт, где N - описание одной лампы ~100-200 байт). Вот тут могут начаться тормоза.
(хотя это наверняка будет быстрее чем способ, предложенный ViK, но может быть медленнее (при правильном написании) чем способ xdev)
Xerx (2004-07-30 04:39:00) [10]> NailMan
Из-за спины. камера сама подстраивается под вращение и перемещение игрока. Вид сверху-сзади (~70 градусов от гориз).
> ViK
Думаешь получиться? Попробую... А какую прозрачность?
> xdev
Жду и надеюсь...
> wiz
Медленно! Очень при таком количестве света, но я попробую...
wiz (2004-07-29 19:14:00) [11]2 Xerx: есть одна мысль...
вряд ли у тебя _один_ объект освещается более чем восемью источниками (а если ты хочешь больше, то тебе стоит провериться - не будет ли у тебя сумбура в видеообразе?).
Таким образом, пишем лайт-манагер, который вызываем перед отрисовкой каждого объекта (или группы объектов).
Лайт-манагер работает следующем образом:
1) На входе получает координаты объекта, который ты сейчас будешь рисовать (и может быть его размеры).
2) Находит 8-16 источников света к объекту, и вычисляет их влияние на объект (например если источник спотовый и спот направлен в сторону от объекта, то его можно сейчас и не включать).
3) Выбирает из списка 8 значимых лайтов и забивает их в GL_LIGHTx (x=0..7).
В это время программист сидит и пьёт пЫво, фигея от собственной крутости :)
PS: сам такую фишку не писал, но imho работать будет (хотя может быть и медленно).
xdev (2004-07-29 18:35:00) [12]Можно попробовать сделать эффект освещенности просчитав цвет и покрасить каждый треугольник через glColor. Я писал для этого модуль, если найду скину на мыло.
ViK (2004-07-29 02:11:00) [13]Можно делать так:
прорисовываем сцену (N div 8)+1 раз, где N - кол-во лампочек; т.е. включаем первые восемь источников и прорисовываем, потом включаем следующие 8 и прорисовываем сцену повторно, только с включеной прозрачностью и т.д. пока не кончатся лампочки; в итоге получаем готовую картинку с N источников света
Белый Крыс (2004-07-28 15:27:00) [14]Спасибо за книжную информацию, которая есть в каждой книге. Если бы я и этого не знал, то не лез бы с такими вопросами.
Всегда пожалуйста. Какие тогда могут быть проблемы?
NailMan (2004-07-28 14:45:00) [15]MrAngel
Если запустишь в софтваре, то хоть MaxInt пользуй.
---
WBR, NailMan aka 2:5020/3337.13
MrAngel (2004-07-28 12:12:00) [16]Неужели так и не сделали более восьми источников? Хотябы софтварно...
NailMan (2004-07-28 09:42:00) [17]Xerx ©
Это вид от третьего лица сзади игрока или типа как в Warcraft3(типа 3Д но вид как у изометрии)? Извини но в DungeonKeeper не играл.
Если последний вариант, то определить какой источник надо выключить, а какой включить проще чем в первом случае, так как камера смотрит на ограниченный участок земли, который легко обработать на видимость, а в случае с нормальным видом от третьего лица могут возникать сложные ситуации с видимостями объектов для источников света.
---
WBR, NailMan aka 2:5020/3337.13
Xerx (2004-07-28 04:19:00) [18]> ViK
Жду...
> NailMan
У меня не шутер а что-то типа DungeonKeeper. И много света: факелы, фонарики, светящиеся модели и т.д.
> Белый Крыс
Спасибо за книжную информацию, которая есть в каждой книге. Если бы я и этого не знал, то не лез бы с такими вопросами.
Белый Крыс (2004-07-27 21:57:00) [19]glEnable(GL_LIGHTING); glDisable(GL_LIGHTING); - вообще свет
glEn(Dis)able(GL_LIGHTx); - конкретный источник х = [0, 7].
NailMan (2004-07-27 21:22:00) [20]Не знаю как в OGL, но в директе обойти ограничение на 8 аппаратно поддерживаемыхединовременно источников света можно только переключением оных.
Тоесть скажем есть большая сцена(закрытая) на которой в разных местах расположены 20 источников света(спотовые и направленные).
Максимум видеокартой поддерживается 8 включенныхисточников одновременно. Следовательно напрашивается вывод - надо попеременно включать нужные источники и выключать ненужные. Вопрос - как определить какие нужные а какие нет?
Да очень просто - надо определить какие источники находятся в зоне видимости игрока(или которые имеют какое-то влияние на видимость объектов во фрустуме), а какие нет.
Скажем зачем освещать объекты источником если они удалены очень далеко(скажем для шутера это 300 метров)? Или вообще что-то освещать за спиной игрока если это место далеко и за углом?
Вобщем надо писать лайт-манагер, который будет следить за тем какие источники надо выключить и какие включить незаметно для игрока и всегда не вызходить за границы лимита источников аппаратно поддерживаемых картой.
Другой способ - выключать обработку освещения у объектов, которые попали во фрустум(в зони видимости игрока), но очень удалены(а потому не понятно освещены правильно или нет) от него. В директе это стейтом выключается/включатеся при рендере объекта. Как в OGL незнаю.
Вот такие мысли.
---
WBR, NailMan aka 2:5020/3337.13