Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Теневые карты
#1
Думал уже бросать проект из-за тумана на весь экран. Но как-то обратил внимание на то, что при закрытии остальных программ всё нормализуется.
Но теперь у меня новый вопрос.
Я не силен в программировании и пока что плохо разобрался в движке. Читаю справку на русском.
Все равно у меня не получается добавить тени на ландшафт. Ландшафт 8 К разрешения. Тени на плоскости не подходят, так как есть "особенности геометрии". Значение shadow volume не подходит. Только одну модель добавил и фпс упал до 0.011.
Остается shadow mapping. Вроде он довольно производительный, но имеет ограничение отдаления от камеры.
У меня никак не получается подключить все.
Делал как в примерах, но ничего не выходит. Справку тоже читал.
Можно поподробнее как это делается по шагам? В справке про "тени в реальном времени" очень кратко, но хорошо описаны первые два варианта, а про теневые карты мало информации для меня. Я думаю там не сложно все, нужно объявить теневую карту, назначить камеру и актёров (от кого падает тень). А вот с BumpShader я не понимаю что делать. Как теневую карту передать в шейдер? И что нужно сделать, чтобы все заработало?
Ответ
#2
Делается так: создаем родительский 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) - там показано, как использовать три проекции (и, соответственно, три карты) разной площади для разных расстояний.
Могу этот пример отдельно собрать и выложить.
Ответ
#3
Думаю, надо сделать оговорку. Xtreme3d - это двиг родом из нулевых, изначально он создавался, когда еще не было никаких шейдерных теней - в нем старинный рендер (GLScene 1.0), который разрабатывали не мы. Шейдеры, теневые карты и прочие эффекты, прикрученные мной, работают вообще каким-то чудом, т.к. очень много архаичного кода, и сама архитектура движка не создавалась под шейдерный пайплайн. Мы тут все в контексте, поэтому часто говорить об этом не приходится) Короче говоря, тут непросто с нуля понять, как работают подобные эффекты, они были реализованы для тех, кто давно работает с движком и знает что делает.
Ответ
#4
Так а чего, на UE4 переходить? У меня 2010 года компьютер, и видеокарта geforce gt 710
Дадите совет?
Спасибо за разъяснения)
Ответ
#5
Необязательно UE, полно движков сейчас. Мне сложно советовать, я с готовыми движками не так уж часто работаю. Многое зависит от задач, специфики проекта, ЯП, потребности в готовом инструментарии. Unity или Godot старое железо норм потянут, я считаю. Разные там Irrlicht, OGRE тоже никто не отменял (правда я давно не смотрел, что там у них нового), но с ними однозначно труднее будет работать, чем с тем же Unity и аналогами.
Ответ
#6
Unity и UE4 у меня после создания ландшафта почему то тормозить начали, не знаю в чем дело, может файл терраина нужно моделью загружать, хотя как потом его текстурить? Готовую нужно, а я пытался 8К в унриал загрузить - не загружается. Может через внешнюю загрузку как-то надо, гамак тоже 8к не читает. Как вообще реалистичный ландшафт в играх делается? Не загружают же огромную текстуру, это ж сколько К нужно. Скорее всего маленькая разноцветная, и цвета заменяют на готовые текстуры и просто устанавливают тайловость и детализацию. Ну и карта высот тоже наверное есть. Из неё то и получают геометрию.
Ответ
#7
Кстати возвращаясь к теме вопроса. Я не понимаю что нужно делать с bumpshader, его просто создать нужно функцией и как-то назвать? Зачем тогда это делать.
Ответ
#8
Цитата:Как вообще реалистичный ландшафт в играх делается? Не загружают же огромную текстуру, это ж сколько К нужно. Скорее всего маленькая разноцветная, и цвета заменяют на готовые текстуры и просто устанавливают тайловость и детализацию. Ну и карта высот тоже наверное есть. Из неё то и получают геометрию.
Шейдер с неск. слоями повторяющихся текстур, а как их смешивать - есть много способов. 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);
Ответ
#9
Ясно. Спасибо) хороший движок у вас)
Только единственное если я завершу игру нужно будет где-то написать юзерам чтобы не открывали браузер со вкладками!!!
А кому нужно создавать эти шейдеры? Тому кто отбрасывает тень или тот на кого она падает?
Ответ
#10
https://drive.google.com/file/d/1VAaKPBU...sp=sharing
У меня все равно не получается, если будет время, глянь пожалуйста, что я делаю не так.
И прошу проверить еще со вкладками браузера и без них как запускается игра, есть ли туман.
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 3 Гость(ей)