HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Наши проекты (https://hlfx.ru/forum/forumdisplay.php?forumid=1)
-- Проекционный динамический фонарик в GoldSrc (https://hlfx.ru/forum/showthread.php?threadid=6160)
Отправлено Sigurth 22-07-2026 в 20:49:
Проекционный динамический фонарик в GoldSrc
В общем, решил я похвастаться своей недавней наработкой. Долгое время был уверен, что если я хочу нормальный свет от фонарика, то надо либо движок менять, либо писать с нуля свой рендерер. Но в итоге за несколько дней попыток "по-приколу посмотреть че из этого выйдет" с помощью некоторых костылей и предыдущих наработок мне удалось сделать то, что в итоге получилось.
Кратко о том, как это работает. Все рисуется в DrawNormalTriangles и DrawTransparentTriangles. Так как стены уже отрисованы, вместо того, чтобы освещать стену, я рисую на этой стене декаль с текстурой альбедо самой этой стены по маске спроецированной текстуры фонарика, ну и дитейл текстуру для полноты картины. Нужно перебирать все видимые сурфейсы, отсекать те, которые точно не должны быть освещены, делать клиппинг по краям стены, к полученным вертексам применить трансформации в зависимости от ненулевых angles и origin энтити, а потом все это рисовать в аддитивном режиме. Линейное затухание света сделать с помощью черного туманчика. Достаточно функционала opengl 1.3, понадобится мультитекстурирование и GL_ENV_COMBINE. Но проще сделать через шейдер, будет производительнее, гибкая настройка, и туманчик не тужен.
Плюсы данного способа:
1. Вы получите красивый фонарик как фпараное. Правда без теней. Тоже как фпараное.
Минусы:
1. Полигоны света рисуются вторым проходом после рендеринга геометрии, поэтому на высокополигональных картах может сильнее просаживаться фпс при включении фонаря. На стандартных картах ХЛ и подобных все летает. На моих только в паре мест наблюдается небольшая просадка, но там в целом надо карту оптимизировать.
2. Чтобы красиво освещать модельки, придется все-таки написать кастомный рендерер студиомоделей. Но если лень с этим разбираться (как мне), можно все так же освещать модель по ее оригину.
3. Рандомно-тайлящиеся текстуры. Так как surf->texture->name - это всегда имя текстуры, которой вы окрасили стену в редакторе (как правило, это первая "-0texname"), а таблица рандомных чисел для тайлинга генерируется движком при запуске игры, то узнать, какая именно текстура сейчас рисуется на стене, мы не можем, и нам придется рисовать первую. Это не выглядит вырвиглазно и даже не всегда заметно. А если вы не используете такие текстуры, то это вовсе не проблема. С анимированными текстурами такой проблемы нет, там все легко считается.
На последнем скриншоте телефон на столе и стул - модельки. Если интересно посмотреть, как это выглядит в динамике, могу записать видео.

__________________
Никогда не поздно сделать мод под хл1
Отправлено XaeroX вчера в 03:01:
А декали как освещаются?
Отправлено Sigurth вчера в 06:55:
Цитата:
XaeroX писал:
А декали как освещаются?
Забыл их упомянуть. У меня в моде кастомные декали, и их поведение с фонарем согласовано. А вот стандартные декали будут просвечиваться. Тут придется либо переписывать рендеринг декалей, либо искать способ рисовать уже нарисованные на поверхности декали. Вроде у структуры msurface_t есть указатель на декали.__________________
Никогда не поздно сделать мод под хл1
Отправлено Ku2zoff вчера в 16:16:
Sigurth очень здорово. Такой фичи не хватало очень многим модам хл на протяжении всех лет существования голдсорса. Во многих из них хоть глаз выколи, ничего не видно.
Как я понял, всё равно приходится линковать либу, и делать вызовы Opengl32.dll из клиентки? Это же нереализуемо средствами движкового API?
Отправлено XaeroX вчера в 17:10:
Цитата:
Ku2zoff писал:
Как я понял, всё равно приходится линковать либу
Ну можно и динамически подгружать, эта либа ж всегда есть в системе.
Но в софтварном режиме работать не будет, конечно.
Цитата:
Ku2zoff писал:
Такой фичи не хватало очень многим модам хл на протяжении всех лет существования голдсорса.
Кастомные декали есть мало где, а вот освещение декалей тут реальная проблема. Я вот не уверен, что пасс фонарика не "съедает" декали на сурфасах - они вроде рисуются сразу же после самого сурфаса в голсорсе.
Добавлено вчера в 13:10:
Цитата:
Sigurth писал:
Чтобы красиво освещать модельки, придется все-таки написать кастомный рендерер студиомоделей
А ты уверен? Может быть можно просто настроить мультитекстурирование и проекционную текстурную матрицу (ну или вершинный шейдер) и просто сделать draw call на клиентке?
Отправлено Sigurth вчера в 18:31:
Цитата:
Ku2zoff писал:
Это же нереализуемо средствами движкового API?
Средствами движка сделать не получится. Так что да, придется подгружать opengl32.dll и работать с opengl напрямую.
Цитата:
XaeroX писал:
А ты уверен? Может быть можно просто настроить мультитекстурирование и проекционную текстурную матрицу (ну или вершинный шейдер) и просто сделать draw call на клиентке?
Я пока еще не углублялся в этот вопрос. Но попробую такой способ.
Цитата:
XaeroX писал:
освещение декалей тут реальная проблема
Вот так будут выглядеть стандартные декали. Не уверен, что буду пытаться их подружить. Но может быть мне станет интересно, и я попробую. Ну или если будет спрос на тутор или кому-нибудь помочь в мод затащить.

__________________
Никогда не поздно сделать мод под хл1
Отправлено XaeroX вчера в 19:56:
Цитата:
Sigurth писал:
Вот так будут выглядеть стандартные декали.
Да, выглядит так что фонарик их "перезаписывает". Попробуй убрать аттенуацию вообще - тогда декали пропадут?
Отправлено Sigurth вчера в 20:32:
Цитата:
XaeroX писал:
Попробуй убрать аттенуацию вообще - тогда декали пропадут?
Да, тогда фонарик полностью перекроет декали. Они рисуются сразу с сурфейсом. В любом случае придется рисовать "освещенные" декали вручную.
Кстати, огромное спасибо за наводку насчет освещение моделей. Перед вызовом StudioDrawPoints настраиваю фонарик вторым текстурным юнитом, и включаю шейдер, где уже смешиваю мой фонарик с вертексным освещением. Уже есть результаты, осталось потестировать, но пока артефактов не наблюдаю.
На скриншоте дерево - модель с оригином в самом низу, листва с альфа каналом.

__________________
Никогда не поздно сделать мод под хл1
Отправлено Ku2zoff сегодня в 00:28:
Цитата:
XaeroX писал:
Ну можно и динамически подгружать, эта либа ж всегда есть в системе.
Но в софтварном режиме работать не будет, конечно.
Цитата:
Sigurth писал:
придется подгружать opengl32.dll и работать с opengl напрямую.
Это костыль, который может сломаться от любого непредвиденного обновления движка. Как было с паранойей, например. Там вообще весь рендерер отвалился. С тринити ситуация полегче и попроще, там расчёт видимости сломался после добавления widescreen fov. Ну и ещё кое-что по-мелочи поломалось.
Мне думается, такие наработки нужно обязательно выкладывать на гитхабе, чтобы авторы римейков/ремастеров или оригинальных модов могли их без проблем внедрить в свои релизы.
Скрытый текст:
Этот текст скрытый. Вы должны оставить хотя бы одно сообщение в теме, чтобы его увидеть.
Добавлено сегодня в 07:24:
Цитата:
XaeroX писал:
Кастомные декали есть мало где
Мне вспоминается только лишь Ивазион, где есть такая фича. Реализованная средствами движка без каких-либо хаков, конечно. Я был нереально этим впечатлён, поэтому изучал исходники французского мода с большим энтузиазмом, чем исходники той же паранойи.
Добавлено сегодня в 07:28:
Говоря про фичу, я имел в виду нормально светящий фонарик, а не декали. Да даже в древнючей AvP2 наплечный фонарь морпеха даёт больше света, чем фонарик в голдсорсе. В первом деусе, кстати, тоже. Там можно с кастомным рендерером загрузить текстуры высокого разрешения, и фонарик не сломается. А в голдсорсе сломается, если использовать большие текстуры.
Отправлено ZGreen сегодня в 04:06:
Цитата:
Ku2zoff писал:
А в голдсорсе сломается, если использовать большие текстуры.
А как он ломается? Он только маленьким становится, если скейл текстуры занижен. Это имеется в виду?
Отправлено Sigurth сегодня в 09:10:
Цитата:
Ku2zoff писал:
Это костыль, который может сломаться от любого непредвиденного обновления движка. Как было с паранойей, например
Ну почему же. На твои вызовы glBindTexture, glBegin/glEnd никак не повлияет то, что вальва там обновит. Если только вдруг не решит перевести хл на вулкан и не удалит опенгл рендерер) Что действительно может все сломать, так это использование всяких структур, которые вальва может внезапно дополнить и не документировать. Как было с юбилейным обновлением и их дополнением структуры msurface_t в хардварной версии, когда в sdk лежит только софтварная. Но все это спокойно фиксится и работает дальше.
Скрытый текст:
Этот текст скрытый. Вы должны оставить хотя бы одно сообщение в теме, чтобы его увидеть.
Добавлено сегодня в 16:10:
Цитата:
Ku2zoff писал:
Мне думается, такие наработки нужно обязательно выкладывать на гитхабе, чтобы авторы римейков/ремастеров или оригинальных модов могли их без проблем внедрить в свои релизы.
Проблемы в любом случае будут. Например, с теми же декалями. Я думаю, что проще уж выкладывать наработку "фонарик+кастомные декали". Если уже кто-то и захочет себе нормальный свет, то почему бы не захотеть и нормальные декали. Причем никто не заставляет использовать супер HD дырочки от пуль. Можно и стандартные из decals.wad рисовать так, что никто и не догадается, что они рисуются не средствами движка.
Вот, например, стандартные декали, но рисуются вручную.

__________________
Никогда не поздно сделать мод под хл1