03-09-2022, 07:44 AM
Делается так: создаем родительский dummycube для всех объектов, которые должны отбрасывать тень (shadowCasters). Создаем камеру для рендеринга теневой карты, потом саму карту:
Применяем к шейдеру:
Рендерим теневую карту после Update, но перед ViewerRender (рекомендую при этом скрыть фронтальные объекты, если они есть):
Но вообще в BumpShader самая простейшая реализация shadow mapping, для уличных сцен я бы ее не рекомендовал - у одной проекции слишком ограниченная площадь покрытия. Поищи пример cascade-shadows.gmk с каскадными тенями в SDK 3.9.0 (который еще для GM8) - там показано, как использовать три проекции (и, соответственно, три карты) разной площади для разных расстояний.
Могу этот пример отдельно собрать и выложить.
Код:
[== Неизвестный ==]
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) - там показано, как использовать три проекции (и, соответственно, три карты) разной площади для разных расстояний.
Могу этот пример отдельно собрать и выложить.