#1 2022-03-07 22:34:02

Глеб
Участник
Зарегистрирован: 2022-03-04
Сообщений: 48

Теневые карты

Думал уже бросать проект из-за тумана на весь экран. Но как-то обратил внимание на то, что при закрытии остальных программ всё нормализуется.
Но теперь у меня новый вопрос.
Я не силен в программировании и пока что плохо разобрался в движке. Читаю справку на русском.
Все равно у меня не получается добавить тени на ландшафт. Ландшафт 8 К разрешения. Тени на плоскости не подходят, так как есть "особенности геометрии". Значение shadow volume не подходит. Только одну модель добавил и фпс упал до 0.011.
Остается shadow mapping. Вроде он довольно производительный, но имеет ограничение отдаления от камеры.
У меня никак не получается подключить все.
Делал как в примерах, но ничего не выходит. Справку тоже читал.
Можно поподробнее как это делается по шагам? В справке про "тени в реальном времени" очень кратко, но хорошо описаны первые два варианта, а про теневые карты мало информации для меня. Я думаю там не сложно все, нужно объявить теневую карту, назначить камеру и актёров (от кого падает тень). А вот с BumpShader я не понимаю что делать. Как теневую карту передать в шейдер? И что нужно сделать, чтобы все заработало?

Offline

#2 2022-03-09 07:44:01

Gecko
Админ
Из РФ, Казань
Зарегистрирован: 2018-06-02
Сообщений: 163
Сайт

Re: Теневые карты

Делается так: создаем родительский dummycube для всех объектов, которые должны отбрасывать тень (shadowCasters). Создаем камеру для рендеринга теневой карты, потом саму карту:

shadowCasters = DummycubeCreate(global.scene);

shadowCamera = CameraCreate(global.scene);
CameraSetViewDepth(shadowCamera, 500);
    
shadowResolution = 1024;
shadowMap = ShadowMapCreate(shadowResolution, view, shadowCasters);
ShadowMapSetCamera(shadowMap, shadowCamera);
ShadowMapSetProjectionSize(shadowMap, 5);
ShadowMapSetZClippingPlanes(shadowMap, -10.0, 200.0);

Применяем к шейдеру:

BumpShaderSetShadowMap(bumpShader, shadowMap);
BumpShaderSetShadowBlurRadius(bumpShader, 2);

Рендерим теневую карту после Update, но перед ViewerRender (рекомендую при этом скрыть фронтальные объекты, если они есть):

Update(1.0 / room_speed);

ObjectHide(global.front);
ShadowMapRender(sm);
ObjectShow(global.front);

ViewerRender(view);

Но вообще в BumpShader самая простейшая реализация shadow mapping, для уличных сцен я бы ее не рекомендовал - у одной проекции слишком ограниченная площадь покрытия. Поищи пример cascade-shadows.gmk с каскадными тенями в SDK 3.9.0 (который еще для GM8) - там показано, как использовать три проекции (и, соответственно, три карты) разной площади для разных расстояний.
Могу этот пример отдельно собрать и выложить.

Offline

#3 2022-03-09 08:03:39

Gecko
Админ
Из РФ, Казань
Зарегистрирован: 2018-06-02
Сообщений: 163
Сайт

Re: Теневые карты

Думаю, надо сделать оговорку. Xtreme3d - это двиг родом из нулевых, изначально он создавался, когда еще не было никаких шейдерных теней - в нем старинный рендер (GLScene 1.0), который разрабатывали не мы. Шейдеры, теневые карты и прочие эффекты, прикрученные мной, работают вообще каким-то чудом, т.к. очень много архаичного кода, и сама архитектура движка не создавалась под шейдерный пайплайн. Мы тут все в контексте, поэтому часто говорить об этом не приходится) Короче говоря, тут непросто с нуля понять, как работают подобные эффекты, они были реализованы для тех, кто давно работает с движком и знает что делает.

Offline

#4 2022-03-09 08:08:59

Глеб
Участник
Зарегистрирован: 2022-03-04
Сообщений: 48

Re: Теневые карты

Так а чего, на UE4 переходить? У меня 2010 года компьютер, и видеокарта geforce gt 710
Дадите совет?
Спасибо за разъяснения)

Редактировался Глеб (2022-03-09 08:18:54)

Offline

#5 2022-03-09 08:18:50

Gecko
Админ
Из РФ, Казань
Зарегистрирован: 2018-06-02
Сообщений: 163
Сайт

Re: Теневые карты

Необязательно UE, полно движков сейчас. Мне сложно советовать, я с готовыми движками не так уж часто работаю. Многое зависит от задач, специфики проекта, ЯП, потребности в готовом инструментарии. Unity или Godot старое железо норм потянут, я считаю. Разные там Irrlicht, OGRE тоже никто не отменял (правда я давно не смотрел, что там у них нового), но с ними однозначно труднее будет работать, чем с тем же Unity и аналогами.

Offline

#6 2022-03-09 08:27:18

Глеб
Участник
Зарегистрирован: 2022-03-04
Сообщений: 48

Re: Теневые карты

Unity и UE4 у меня после создания ландшафта почему то тормозить начали, не знаю в чем дело, может файл терраина нужно моделью загружать, хотя как потом его текстурить? Готовую нужно, а я пытался 8К в унриал загрузить - не загружается. Может через внешнюю загрузку как-то надо, гамак тоже 8к не читает. Как вообще реалистичный ландшафт в играх делается? Не загружают же огромную текстуру, это ж сколько К нужно. Скорее всего маленькая разноцветная, и цвета заменяют на готовые текстуры и просто устанавливают тайловость и детализацию. Ну и карта высот тоже наверное есть. Из неё то и получают геометрию.

Редактировался Глеб (2022-03-09 08:29:40)

Offline

#7 2022-03-09 08:49:45

Глеб
Участник
Зарегистрирован: 2022-03-04
Сообщений: 48

Re: Теневые карты

Кстати возвращаясь к теме вопроса. Я не понимаю что нужно делать с bumpshader, его просто создать нужно функцией и как-то назвать? Зачем тогда это делать.

Offline

#8 2022-03-09 15:09:30

Gecko
Админ
Из РФ, Казань
Зарегистрирован: 2018-06-02
Сообщений: 163
Сайт

Re: Теневые карты

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

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

Кстати возвращаясь к теме вопроса. Я не понимаю что нужно делать с bumpshader, его просто создать нужно функцией и как-то назвать? Зачем тогда это делать.

Я думал, у тебя он уже создается)

Делается примерно так:

MaterialCreate('mDiffuse', 'diffuse.png');
MaterialCreate('mNormal', 'normal.png');
bumpShader = BumpShaderCreate();
BumpShaderSetDiffuseTexture(bumpShader, 'mDiffuse');
BumpShaderSetNormalTexture(bumpShader, 'mNormal');
BumpShaderSetMaxLights(bumpShader, 8);

MaterialCreate('mShader', '');
MaterialSetShininess('mShader', 32);
MaterialSetAmbientColor('mShader', c_dkgray, 1);
MaterialSetDiffuseColor('mShader', c_white, 1);
MaterialSetSpecularColor('mShader', c_white, 1);
MaterialSetShader('mShader', bumpShader);

Offline

#9 2022-03-10 00:12:36

Глеб
Участник
Зарегистрирован: 2022-03-04
Сообщений: 48

Re: Теневые карты

Ясно. Спасибо) хороший движок у вас)
Только единственное если я завершу игру нужно будет где-то написать юзерам чтобы не открывали браузер со вкладками!!!
А кому нужно создавать эти шейдеры? Тому кто отбрасывает тень или тот на кого она падает?

Редактировался Глеб (2022-03-10 00:54:38)

Offline

#10 2022-03-10 01:55:42

Глеб
Участник
Зарегистрирован: 2022-03-04
Сообщений: 48

Re: Теневые карты

https://drive.google.com/file/d/1VAaKPB … sp=sharing
У меня все равно не получается, если будет время, глянь пожалуйста, что я делаю не так.
И прошу проверить еще со вкладками браузера и без них как запускается игра, есть ли туман.

Offline

#11 2022-03-10 13:27:41

Gecko
Админ
Из РФ, Казань
Зарегистрирован: 2018-06-02
Сообщений: 163
Сайт

Re: Теневые карты

Посмотрел, никакого постороннего тумана не увидел (кроме черного, который и должен быть). Браузер никак не влияет.
Какая-то невнятная навигация по сцене, сложно нормально тестировать)

j-P15xbrk-WY.jpg

Пока вот что заметил:

view1 = ViewerCreate(0, 0, display_get_width(), display_get_height(), window_handle());

при том, что окно 500x500, к тому же идет запуск в полноэкранном режиме. В Xtreme3D это может плохо работать. Советую размер комнаты/окна и размер view делать одинаковый, например 1280x720, и потестить сначала в оконном режиме. Start in fullscreen mode в ГМ сам по себе некорректно работает при использовании сторонней графики. Если наужен фулскрин, то надо еще в настройках Resolution поставить галку Set the resolution of the screen и выставить нужные настройки. Соответственно, соотношение размера окна и view должны быть такими же, как у выбранного видеорежима (то есть, 3:4, так как ГМ8 не поддерживает другие соотношения). Это самый надежный способ, насколько я знаю.

А кому нужно создавать эти шейдеры? Тому кто отбрасывает тень или тот на кого она падает?

Материал 'mShader' применить к объектам, на которые должна падать тень. У объектов, которые отбрасывают тень, шейдер не имеет значения, но они могут использовать тот же самый (т.е., и отбрасывать, и принимать). Главное их добавить в дерево к shadowCasters.

Offline

#12 2022-03-11 01:18:46

Глеб
Участник
Зарегистрирован: 2022-03-04
Сообщений: 48

Re: Теневые карты

Странно, почему у вас нету текстуры ландшафта? И как размер комнаты может повлиять на размер окна? У меня действие происходит (терраин по размерам 500 на 500). Вот я и решил ограничить комнату. Так всегда делал.
Это нужна специальная функция для настройки вида? Разрешение и полноэкранный режим?
В чем проблема навигации? Когда мышку до краев доводили перемещение осуществлялось или были какие-то проблемы? Приближение отдаление колёсиком. Зажать пкм и двигать мышь в право влево и будет поворот.
На счет теней я так делал, но вместо этого весь терраин просто затемнился но теней от танка нет.

Offline

#13 2022-03-11 01:23:40

Глеб
Участник
Зарегистрирован: 2022-03-04
Сообщений: 48

Re: Теневые карты

У меня 1680 на 1050, если я выставлю такой размер комнаты, то как будет работать на мониторах с другим разрешением? Как одоптировать под любой монитор, нужно в настройках окна задать по размерам дисплея.
В функциях вида нашел в справке только как взять ширину и высоту, где указать полноэкранный?
Я так понимаю нужно window_set_fullscreen true и window_set_size display_get_width и аналогично для высоты, я вас правильно понял?
Ещё в конце добавил две строчки кода
room_width=display_get_width();
room_height=display_get_height();
А саму комнату в настройках оставил 500 на 500, мне так удобнее расставлять объекты, чтобы было ограничение на краях карты.
И все же вы не дали ответ на самый главный вопрос, где тени то? Что я не так сделал?

matterrain=MaterialLibraryCreate();
MaterialLibraryActivate(matterrain);

MaterialCreate('mTerrain1', 'textures/terrain/tex_river_rakovka.jpg'); 
MaterialSetOptions('mTerrain1',false,false);
shmap1=BumpShaderCreate();
BumpShaderSetDiffuseTexture(shmap1,'mTerrain1');
BumpShaderSetMaxLights(shmap1,8);
MaterialCreate('mShader1','');
MaterialSetShininess('mShader1',32);
MaterialSetAmbientColor('mShader1',c_dkgray,1);
MaterialSetDiffuseColor('mShader1',c_white,1);
MaterialSetSpecularColor('mShader1',c_white,1);
MaterialSetShader('mShader1',shmap1);

BumpShaderSetShadowMap(shmap1,global.shadowmap);
BumpShaderSetShadowBlurRadius(shmap1,2);

map1=FreeformCreate('models/terrain/river_rakovka.obj',matterrain,matterain,global.scene);
ObjectSetMaterial(map1,'mShader1');
ObjectSetPosition(map1,250,0,250);

FreeformBuildOctree(map1);
OdeStaticCreate(map1);
OdeAddTriMesh(map1,0);

вот я применил к местности шейдерный материал, но в игре просто он серый, а теней нет от танка. Танк 100% в древе шадоукастерс

Редактировался Глеб (2022-03-11 10:02:10)

Offline

#14 2022-03-19 13:59:46

Gecko
Админ
Из РФ, Казань
Зарегистрирован: 2018-06-02
Сообщений: 163
Сайт

Re: Теневые карты

Чтобы корректно растянуть на весь экран, нужно включить полноэкранный видеорежим, и чтобы размер вида совпадал с этим режимом. К сожалению, в ГМ ограниченный набор видеорежимов. Если просто сделать окно на весь экран (Start in fullscreen mode), и создать вид с размерами, полученными из display_get_width/height, то это может плохо работать (по крайней мере, у меня на некоторых конфигурациях некорректно работало).

Да и черт с ним, я считаю - я вообще не рекомендую ГМ8 использовать, слишком много там проблем накопилось. Мне вот интересно, как в Студии обстоят дела с этим, скорее всего лучше - как-нибудь на днях проверю.

Offline

Подвал доски

Под управлением FluxBB