Комментарии 28
Актуальность столь запоздавших статей для современного программирования трёхмерной графики, конечно, нулевая
Ну, почему же нулевая? Для моего http://www.moddb.com/mods/wolfgl-3d — будет в самый раз, там как раз освещение работает через GL_LIGHTING :)
И, кстати, попробуйте исходники прогнать статическим анализатором, например, CPPCheck 1.64 (1.7… чего-то там у меня глючила и врала) — у вас есть критические ошибки. Возможно, это позволит улучшить стабильность работы программы.
У меня предыдущая версия была тоже XP :)
У Вас в папке с игрой файлы GAMEMAPS.WL6 и остальные .WL6 (или .SOD) от оригинальной игры версии 1.4 присутствуют?
(помню, что у кого-то игра вылетала просто из-за отсутствия этих файлов)
:D
А версия файлов у Вас какая? Поддерживается 1.4
PS фонарик можно выключать.
Вот тут http://ftp.3drealms.com/faq/w3dfaq420.txt написано, что можно официально взять бесплатно отсюда ftp://ftp.gamers.org/pub/games/wolf3d/official/
PS официально, потому что эта ссылка дана на сайте 3D-Realms (вряд ли бы 3D-Realms давала пиратскую ссылку)
А какие у вас настройки параметров фонарика и материала потолка?
Я имею в виду вот это:
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,sMatherial.Ambient);
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,sMatherial.Diffuse);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,sMatherial.Specular);
glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,sMatherial.Emission);
glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,sMatherial.Shininess);
И вот это:
glLightfv(GL_LIGHT0,GL_POSITION,l0_position);
glLightfv(GL_LIGHT0,GL_AMBIENT,l0_ambient);
glLightfv(GL_LIGHT0,GL_DIFFUSE,l0_diffuse);
glLightfv(GL_LIGHT0,GL_SPECULAR,l0_specular);
glLightfv(GL_LIGHT0,GL_SHININESS,l0_shininess);
Очень похоже на то, что фонарик работает на GL_SPECULAR, а не за счёт GL_DIFFUSE.
Фонарик имеет два конуса:
- внешний конус и Diffuse и Specular по 0.5
- внутренний конус и Diffuse и Specular по 0.9
Материал потолка ещё не задавал (насколько я помню), то есть должен быть стандартный по умолчанию.
PS в принципе у меня есть редактор материалов, работающий с файлами настроек вида
Ambient 63 50 18 3F3212
Diffuse 192 155 58 C09B3A
Specular 160 142 94 A08E5E
Emission 0 0 0 000000
Shiness 51
но, пока он к Вольфу ещё не прикручен.
Кстати, есть ещё один простой способ построения красивых теней. Но он медленный и заключается фактически в обратной трассировке луча. Можно дважды строить сцену — первый раз без освещения (с полной яркостью) и считать её в буфер. А второй раз построить в условных цветах (цвет равен номеру полигона) и опять считать в другой буфер вместе с глубиной пикселя. А дальше пробежаться по буферу и для каждой точки картинки посмотреть, какие источники её освещают и вычислить освещённость точки (0-1 по каналам R,G,B), после чего умножить её значение из буфера на эту освещённость. Собственно, картинки с геометрией из этой статьи таким способом и были сделаны.
фонарик надо шейдерами делать
Шейдеры будут позже, а сейчас мне интересно поработать с со стандартным GL_LIGHTING
То какую грань из четырёх рисовать у Кармака определяется координатами игрока. Например, если игрок находится левее стены, то рисуется именно левая грань "квадрата", и не рисуется правая. Трассировка же определяет какие именно "квадраты" рисовать.
Моя же версия сейчас находится в оптимизации. Для начала попробовал уменьшить число лучей — выпуская их только для углов и центра "квадрата", но, полезли глюки. Так же пытаюсь использовать Quad-Trees, и тоже в процессе работы.
PS после смены версии C++ проект перестал компилироваться. Сейчас уже компилируется, но, всё ещё не запускается. Как начнёт запускаться — продолжу оптимизацию и доделывание.
Нет, я сейчас делаю ровно наоборот посылаю луч от "квадрата" к наблюдателю, и смотрю не пересёкся ли он. И поскольку, как Вы заметили, луч может и не попасть в проём между блоками, то наблюдаются глюки.
PS добавь к статье хаб https://habrahabr.ru/hub/3d_graphics/
А этот хаб https://habrahabr.ru/hub/cgi/ находится?
Разница только в большей гибкости, Кстати динамические объекты всё равно этой тени не заметят, как я понимаю. На них будут действовать все источники в пределах досягаемости, что палевно.
Использование источников света OpenGL для построения цветных теней