HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Разработка игр > Наши проекты > XashNT: блог разработчика
Часть I
Страницы (240): « Первая ... « 38 39 40 41 [42] 43 44 45 46 » ... Последняя »   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
thambs
мразь конченная

Дата регистрации: Mar 2006
Проживает: -
Сообщений: 6417

Рейтинг



Цитата:
сможем описать практически любую из существующих систем материалов или создать свою собственную

Прям мета-система какая-то.

__________________
http://www.moddb.com/mods/monorail-quest

Сообщить модератору | | IP: Записан
Сообщение: 186694

Старое сообщение 22-11-2019 11:21
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32202
Нанёс повреждений: 392 ед.

Рейтинг



Можно провести аналогии с тем же С++. Там ведь тоже есть макросы.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 186696

Старое сообщение 22-11-2019 11:44
-
thambs
мразь конченная

Дата регистрации: Mar 2006
Проживает: -
Сообщений: 6417

Рейтинг



Дядя Миша
Скажи, а вот эту гадость с полупрозрачностью в новой системе удалось забороть?

__________________
http://www.moddb.com/mods/monorail-quest

Сообщить модератору | | IP: Записан
Сообщение: 186757

Старое сообщение 23-11-2019 16:01
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32202
Нанёс повреждений: 392 ед.

Рейтинг



Эту "гадость" еще ни одному человеку на планете забороть не удалось и едва ли это вообще возможно. Впрочем, я еще не занимался стёклами.

Добавлено 23-11-2019 в 19:57:

В кутри это бороли повертексным освещением, но тогда прощай тени на стёклах. Дилемма.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 186763

Старое сообщение 23-11-2019 16:57
-
nemyax
Нёмыч

Дата регистрации: Jul 2011
Проживает: (void)
Сообщений: 4136

Рейтинг



Трассировкой-то борют.

Сообщить модератору | | IP: Записан
Сообщение: 186789

Старое сообщение 24-11-2019 13:55
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32202
Нанёс повреждений: 392 ед.

Рейтинг



Тут для солидных тел не могут толком трассировку наладить, а ты на полупрозрачные замахнулся, очуметь можно.

Добавлено 24-11-2019 в 19:23:

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

Добавлено 24-11-2019 в 19:26:

Сам макро-язык включает в себя три ключевых слова.
enum - это для макросчетчиков, которые можно инкременировать прямо во время макроподстановки, например для слоёв ландшафта или стадий в кутришном шейдере.
#keydef - заменяет одно регулярное выражение на другое. Пример:

C++ Source Code:
#keydef map <value>\
image u_ColorMap<unitNum> = "<value>";

второй аргумент - исходная переменная, путь к текстуре. А вот пример строгого соответствия
C++ Source Code:
#keydef map $lightmap\
image u_LightMap = "entity->$LightmapTexture";

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

Добавлено 24-11-2019 в 19:29:

А, да. <unitNum> в данном примере это как раз ссылка на счётчик, которая заменится на его текущее значение и получится строчка u_ColorMap0
Ну, разумеется к любой строке макро-подстановки это можно применять.
Сформированная финальная строка замены, просто подаётся на вход парсера, как будто бы она была в реальном файле и дальше парсинг происходит в обычном режиме.

Добавлено 24-11-2019 в 19:33:

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

У моей системы есть одно принципиальное ограничение - базовый формат, всегда должен иметь вид, типа

C++ Source Code:
materialName
{
}

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

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 186801

Старое сообщение 24-11-2019 16:33
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32202
Нанёс повреждений: 392 ед.

Рейтинг



Ну вот потихоньку ввожу в строй свои макросы. Вот текущие команды для замены в кутришных шейдерах:

C++ Source Code:
1
enum unitNum;
2
enum stageNumber;
3
enum texModCount;
4
enum deformCount;
5
 
6
// q3map keywords (just eliminate)
7
#keydef qer_editorimage <value>
8
#define q3map_noFog
9
#define q3map_globalTexture
10
#define q3map_nonplanar
11
#keydef q3map_shadeangle <a>
12
#keydef q3map_sunExt <a> <b> <c> <d> <e> <f> <g> <h>
13
#keydef q3map_skyLight <a> <b>
14
 
15
// surfaceparms, etc
16
#keydef surfaceparm <value>
17
#define nopicmip
18
 
19
// blendfunc replacements
20
#define GL_ZERO			0.0
21
#define GL_ONE			1.0
22
#define GL_SRC_COLOR		2.0
23
#define GL_DST_COLOR		3.0
24
#define GL_ONE_MINUS_SRC_COLOR	4.0
25
#define GL_ONE_MINUS_DST_COLOR	5.0
26
#define GL_SRC_ALPHA		6.0
27
#define GL_DST_ALPHA		7.0
28
#define GL_ONE_MINUS_SRC_ALPHA	8.0
29
#define GL_ONE_MINUS_DST_ALPHA	9.0
30
#define GL_ALPHA_SATURATE		10.0	// rare case
31
 
32
#keydef map <value>\
33
image u_ColorMap<unitNum> = "<value>";\
34
unitNum++;
35
 
36
#keydef map $lightmap\
37
image u_ColorMap<unitNum> = "entity->$LightmapTexture";\
38
unitNum++;
39
 
40
#keydef blendFunc <src> <dst>\
41
vec2 u_BlendFunc<unitNum> = vec2( <src>, <dst> );
42
 
43
#keydef {\
44
addShaderDefine( SHADER_STAGE<stageNumber> );
45
 
46
#keydef }\
47
stageNumber++;

#define в моём языке всегда задаёт строгое соответствие замены A на B или A на пустоту. Сишная фишка с функциями типа #define func(a,b,c) не поддерживается, поскольку в подавляющем большинстве материалов никаких функций просто нет, там именно keyvalue pair. И наоборот, у меня работает то, что нереализуемо на сишных макросах (но там это и не нужно).

Простой пример, для кутришного блендфунка. Шаблон автозамены
blendFunc <src> <dst>
превращается сперва в
vec2 u_BlendFunc<unitNum> = vec2( <src>, <dst> );
потом подставляется текущее значение энума <unitNum>, а потом система ищет переопределение GL_SRC_XXX, GL_DST_XXX и тоже их заменяет на цифры. То есть финальный результат автозамены будет выглядеть примерно так:
C++ Source Code:
vec2 u_BlendFunc2 = vec2( 6.0, 8.0 );

и уже этот результат снова подаётся на вход парсера, где и читается в обычном режиме, т.к. нативный формат записи. А в шейдере для blendFunc будут условия на выходные значения, соответствующие режимам смещевания (собсно так и переводят кутришные шейдеры на GLSL). Для каждого юнита, соответственно юниформ со своим номером.
А чтобы понять, какие юниты задействованы в шейдере, у нас есть команда addShaderDefine( SHADER_STAGE<stageNumber> );
где stageNumber точно так же превратится в текущее значение счётчика.
Ну разумеется, в шейдере эти #ifdef SHADER_STAGE0, #ifdef SHADER_STAGE1 придётся прописывать ручками, но нам понадобится один-единственный шейдер для описания абсолютно всех комбинаций кутришных материалов.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 186867

Старое сообщение 25-11-2019 10:32
-
thambs
мразь конченная

Дата регистрации: Mar 2006
Проживает: -
Сообщений: 6417

Рейтинг



Дядя Миша
А это всё куда-то потом коптилируется, или каждый запуск налиту читается?

__________________
http://www.moddb.com/mods/monorail-quest

Сообщить модератору | | IP: Записан
Сообщение: 186874

Старое сообщение 25-11-2019 12:40
- За что?
nemyax
Нёмыч

Дата регистрации: Jul 2011
Проживает: (void)
Сообщений: 4136

Рейтинг



thambs
Заранее скомпиленные шейдеры вроде только в OpenGL 4.5 и новее поддерживаются. Обычно-то их компилят-линкуют-подключают при инициализации рендерера.

Сообщить модератору | | IP: Записан
Сообщение: 186875

Старое сообщение 25-11-2019 13:08
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34510
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


nemyax
А вот в д3д всегда можно было бинарник с игрой распространять.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 186876

Старое сообщение 25-11-2019 13:44
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32202
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
thambs писал:
каждый запуск налиту читается?

каждый запуск читается налету, но это быстро. Это ж простая макро-подстановка и парсится она один раз при запуске движка.

Цитата:
nemyax писал:
Заранее скомпиленные шейдеры вроде только в OpenGL 4.5 и новее поддерживаются

так это вообще не шейдеры. Скомпиленные шейдеры у меня тоже поддерживаются.

Добавлено 25-11-2019 в 18:07:

Так, ну чтожы, я сделал макроподстановки для большинства случаев, ну покрайней мере чтобы материалы Edge Of Forever ни на что не ругались.
Теперь самое сложное - надо написать такой шейдер, который бы всё это корректно учитывал. То что я распарсил - это же просто параметры на вход шейдера, конвертация.

Добавлено 25-11-2019 в 18:09:

Для интерисующихся, пример тепичного шейдера. сконверченного в мою систему:
C++ Source Code:
1
textures/moteof/walltrim2
2
{
3
  <ShaderState>
4
  addShaderDefine( SHADER_STAGE0 )
5
  addShaderDefine( SHADER_STAGE1 )
6
  u_ColorMap0:-1 = *unused*;
7
  u_ColorMap1:-1 = *unused*;
8
  vec2 u_BlendFunc2;
9
}

диффузка + лайтмапа. Не пугайтесь странным значениям, это у меня дебаг-инфо недоделатый.

Добавлено 25-11-2019 в 18:10:

А вот шейдер с множеством стадий
C++ Source Code:
1
textures/moteof/water_healing
2
{
3
  <ShaderState>
4
  addShaderDefine( APPLY_DEFORM_VERTS0 )
5
  addShaderDefine( SHADER_STAGE0 )
6
  addShaderDefine( APPLY_VERTEXCOLOR0 )
7
  addShaderDefine( APPLY_COLORWAVE0 )
8
  addShaderDefine( APPLY_TEXMOD_TRANSFORM0_0 )
9
  addShaderDefine( APPLY_TEXMOD_TURB0_1 )
10
  addShaderDefine( SHADER_STAGE1 )
11
  addShaderDefine( APPLY_VERTEXCOLOR1 )
12
  addShaderDefine( APPLY_COLORWAVE1 )
13
  addShaderDefine( APPLY_TEXMOD_STRETCH1_0 )
14
  addShaderDefine( APPLY_TEXMOD_SCROLL1_1 )
15
  addShaderDefine( SHADER_STAGE2 )
16
  addShaderDefine( APPLY_VERTEXCOLOR2 )
17
  addShaderDefine( APPLY_COLORWAVE2 )
18
  addShaderDefine( APPLY_TEXMOD_TURB2_0 )
19
  addShaderDefine( SHADER_STAGE3 )
20
  addShaderDefine( APPLY_VERTEXCOLOR3 )
21
  addShaderDefine( APPLY_TEXMOD_STRETCH3_0 )
22
  addShaderDefine( APPLY_TEXMOD_TRANSFORM3_1 )
23
  addShaderDefine( APPLY_TEXMOD_ROTATE3_2 )
24
  u_ColorMap0:-1 = *unused*;
25
  u_ColorMap1:-1 = *unused*;
26
  u_ColorMap2:-1 = *unused*;
27
  u_ColorMap3:-1 = *unused*;
28
  vec2 u_WaveDeformFunc0;
29
  vec4 u_WaveDeformBase0;
30
  vec2 u_BlendFunc1;
31
  float u_rgbGenWaveFunc0;
32
  vec4 u_rgbGenWaveParams0;
33
  vec4 u_texModBase0_0;
34
  vec2 u_texModTrans0_0;
35
  vec4 u_texModTurb0_1;
36
  vec2 u_BlendFunc2;
37
  float u_rgbGenWaveFunc1;
38
  vec4 u_rgbGenWaveParams1;
39
  float u_texModWaveFunc1_0;
40
  vec4 u_texModWaveParams1_0;
41
  vec2 u_texModScroll1_1;
42
  vec2 u_BlendFunc3;
43
  float u_rgbGenWaveFunc2;
44
  vec4 u_rgbGenWaveParams2;
45
  vec4 u_texModTurb2_0;
46
  vec2 u_BlendFunc4;
47
  float u_texModWaveFunc3_0;
48
  vec4 u_texModWaveParams3_0;
49
  vec4 u_texModBase3_1;
50
  vec2 u_texModTrans3_1;
51
  float u_texModRotate3_2;
52
}

Впрочем старая проблема по прежнему остается - я так и не придумал как делать анимацию текстур. Но на этой карте её и нету.

Добавлено 25-11-2019 в 22:02:

Кстати, что касается времени такого парсинга с заменой. Оптимизировал функцию, теперь это занимает 0.3 секунды для полного пака кутришных шейдеров + еще шейдеров 500 от Сока для его карт и шейдеры для rustgrad.
Можно их еще хэшировать, но я думаю и так уже норм.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 186877

Старое сообщение 25-11-2019 19:02
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32202
Нанёс повреждений: 392 ед.

Рейтинг



Немного причесал дебаг, ну вот примерно так выглядят входные параметры распарсенного кутришного шейдера.

C++ Source Code:
1
textures/base_light/proto_lightred2
2
{
3
#define SHADER_STAGE0
4
#define SHADER_STAGE1
5
#define SHADER_STAGE2
6
#define APPLY_COLORWAVE2
7
  u_ColorMap0 = entity->$LightmapTexture;
8
  u_ColorMap1 = textures/base_light/proto_lightred.tga;
9
  u_ColorMap2 = textures/base_light/proto_lightred.tga;
10
  vec2 u_BlendFunc1 = vec2( 3, 0 );
11
  vec2 u_BlendFunc2 = vec2( 1, 1 );
12
  float u_rgbGenWaveFunc2 = 1;
13
  vec4 u_rgbGenWaveParams2 = vec4( 0.5, 0.5, 0, 1 );
14
}

Может я конечно буду менять организацию, но со скриптами это быстро.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 186891

Старое сообщение 26-11-2019 07:34
-
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34510
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


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

__________________

Сообщить модератору | | IP: Записан
Сообщение: 186896

Старое сообщение 26-11-2019 07:47
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32202
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
XaeroX писал:
Выглядит очень переусложнённо в сравнении с самими ку3шными скриптами.

то что я привёл - это скрытый промежуточный результат, который не виден пользователю. Это то, что подается на вход GLSL-шейдера. Ты правильно подметил, что это руками набивать - очуметь можно. А когда этим автозамена занимается - нормально.

Цитата:
XaeroX писал:
Да, возможностей больше - но они никому и не нужны

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

Добавлено 26-11-2019 в 10:53:

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

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 186898

Старое сообщение 26-11-2019 07:53
-
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34510
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
Дядя Миша писал:
Кстати и волатиловские шейдеры я смогу описать точно так же

Да вот хз. Есть у тебя аналог dynamicMap? Это когда на вход шейдера подаётся содержимое FBO от рендеринга экрана или зеркала?

__________________

Сообщить модератору | | IP: Записан
Сообщение: 186900

Старое сообщение 26-11-2019 07:58
-
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 11:40. Новая тема    Ответить
Страницы (240): « Первая ... « 38 39 40 41 [42] 43 44 45 46 » ... Последняя »   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Разработка игр > Наши проекты > XashNT: блог разработчика
Часть I
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024