Вы не вошли.
Страницы 1
Думал уже бросать проект из-за тумана на весь экран. Но как-то обратил внимание на то, что при закрытии остальных программ всё нормализуется.
Но теперь у меня новый вопрос.
Я не силен в программировании и пока что плохо разобрался в движке. Читаю справку на русском.
Все равно у меня не получается добавить тени на ландшафт. Ландшафт 8 К разрешения. Тени на плоскости не подходят, так как есть "особенности геометрии". Значение shadow volume не подходит. Только одну модель добавил и фпс упал до 0.011.
Остается shadow mapping. Вроде он довольно производительный, но имеет ограничение отдаления от камеры.
У меня никак не получается подключить все.
Делал как в примерах, но ничего не выходит. Справку тоже читал.
Можно поподробнее как это делается по шагам? В справке про "тени в реальном времени" очень кратко, но хорошо описаны первые два варианта, а про теневые карты мало информации для меня. Я думаю там не сложно все, нужно объявить теневую карту, назначить камеру и актёров (от кого падает тень). А вот с BumpShader я не понимаю что делать. Как теневую карту передать в шейдер? И что нужно сделать, чтобы все заработало?
Offline
Делается так: создаем родительский 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
Думаю, надо сделать оговорку. Xtreme3d - это двиг родом из нулевых, изначально он создавался, когда еще не было никаких шейдерных теней - в нем старинный рендер (GLScene 1.0), который разрабатывали не мы. Шейдеры, теневые карты и прочие эффекты, прикрученные мной, работают вообще каким-то чудом, т.к. очень много архаичного кода, и сама архитектура движка не создавалась под шейдерный пайплайн. Мы тут все в контексте, поэтому часто говорить об этом не приходится) Короче говоря, тут непросто с нуля понять, как работают подобные эффекты, они были реализованы для тех, кто давно работает с движком и знает что делает.
Offline
Так а чего, на UE4 переходить? У меня 2010 года компьютер, и видеокарта geforce gt 710
Дадите совет?
Спасибо за разъяснения)
Редактировался Глеб (2022-03-09 08:18:54)
Offline
Необязательно UE, полно движков сейчас. Мне сложно советовать, я с готовыми движками не так уж часто работаю. Многое зависит от задач, специфики проекта, ЯП, потребности в готовом инструментарии. Unity или Godot старое железо норм потянут, я считаю. Разные там Irrlicht, OGRE тоже никто не отменял (правда я давно не смотрел, что там у них нового), но с ними однозначно труднее будет работать, чем с тем же Unity и аналогами.
Offline
Unity и UE4 у меня после создания ландшафта почему то тормозить начали, не знаю в чем дело, может файл терраина нужно моделью загружать, хотя как потом его текстурить? Готовую нужно, а я пытался 8К в унриал загрузить - не загружается. Может через внешнюю загрузку как-то надо, гамак тоже 8к не читает. Как вообще реалистичный ландшафт в играх делается? Не загружают же огромную текстуру, это ж сколько К нужно. Скорее всего маленькая разноцветная, и цвета заменяют на готовые текстуры и просто устанавливают тайловость и детализацию. Ну и карта высот тоже наверное есть. Из неё то и получают геометрию.
Редактировался Глеб (2022-03-09 08:29:40)
Offline
Кстати возвращаясь к теме вопроса. Я не понимаю что нужно делать с bumpshader, его просто создать нужно функцией и как-то назвать? Зачем тогда это делать.
Offline
Как вообще реалистичный ландшафт в играх делается? Не загружают же огромную текстуру, это ж сколько К нужно. Скорее всего маленькая разноцветная, и цвета заменяют на готовые текстуры и просто устанавливают тайловость и детализацию. Ну и карта высот тоже наверное есть. Из неё то и получают геометрию.
Шейдер с неск. слоями повторяющихся текстур, а как их смешивать - есть много способов. 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
Ясно. Спасибо) хороший движок у вас)
Только единственное если я завершу игру нужно будет где-то написать юзерам чтобы не открывали браузер со вкладками!!!
А кому нужно создавать эти шейдеры? Тому кто отбрасывает тень или тот на кого она падает?
Редактировался Глеб (2022-03-10 00:54:38)
Offline
https://drive.google.com/file/d/1VAaKPB … sp=sharing
У меня все равно не получается, если будет время, глянь пожалуйста, что я делаю не так.
И прошу проверить еще со вкладками браузера и без них как запускается игра, есть ли туман.
Offline
Посмотрел, никакого постороннего тумана не увидел (кроме черного, который и должен быть). Браузер никак не влияет.
Какая-то невнятная навигация по сцене, сложно нормально тестировать)
Пока вот что заметил:
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
Странно, почему у вас нету текстуры ландшафта? И как размер комнаты может повлиять на размер окна? У меня действие происходит (терраин по размерам 500 на 500). Вот я и решил ограничить комнату. Так всегда делал.
Это нужна специальная функция для настройки вида? Разрешение и полноэкранный режим?
В чем проблема навигации? Когда мышку до краев доводили перемещение осуществлялось или были какие-то проблемы? Приближение отдаление колёсиком. Зажать пкм и двигать мышь в право влево и будет поворот.
На счет теней я так делал, но вместо этого весь терраин просто затемнился но теней от танка нет.
Offline
У меня 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
Чтобы корректно растянуть на весь экран, нужно включить полноэкранный видеорежим, и чтобы размер вида совпадал с этим режимом. К сожалению, в ГМ ограниченный набор видеорежимов. Если просто сделать окно на весь экран (Start in fullscreen mode), и создать вид с размерами, полученными из display_get_width/height, то это может плохо работать (по крайней мере, у меня на некоторых конфигурациях некорректно работало).
Да и черт с ним, я считаю - я вообще не рекомендую ГМ8 использовать, слишком много там проблем накопилось. Мне вот интересно, как в Студии обстоят дела с этим, скорее всего лучше - как-нибудь на днях проверю.
Offline
Страницы 1