|
Xors3D Графический движок с поддержкой DirectX9 |
19.02.2013, 19:49
|
#1
|
ПроЭктировщик
Регистрация: 08.05.2011
Сообщений: 143
Написано 46 полезных сообщений (для 219 пользователей)
|
Освещение - множество источников + бамп
Привет!
В сцене 50 точечных источников света, почти на всех поверхностях бамп, в кадре, к примеру, не более 10 источников.
Помогите разобраться, какие технологии/шейдеры использовать для реализации подобного?
Поковырял стандартные примеры, везде только с 1 источником света.
|
(Offline)
|
|
19.02.2013, 20:49
|
#2
|
Разработчик
Регистрация: 20.02.2010
Сообщений: 397
Написано 173 полезных сообщений (для 565 пользователей)
|
Ответ: Освещение - множество источников + бамп
Писать свой deferred rendering, либо использовать forward rendering он стандартный- ограничения до 30 источников света.
|
(Offline)
|
|
19.02.2013, 21:12
|
#3
|
ПроЭктировщик
Регистрация: 08.05.2011
Сообщений: 143
Написано 46 полезных сообщений (для 219 пользователей)
|
Ответ: Освещение - множество источников + бамп
Спасибо,
Можно немного подробней про deferred rendering? Это возможно реализовать шейдором для xors3D ?
Хотя и 30 вполне достаточно, forward rendering - это стандартные источники света в ксорсе ?
|
(Offline)
|
|
19.02.2013, 21:25
|
#4
|
Разработчик
Регистрация: 20.02.2010
Сообщений: 397
Написано 173 полезных сообщений (для 565 пользователей)
|
Ответ: Освещение - множество источников + бамп
deferred rendering был в Движке года то, но видимо они накосячили сильно и отрубили его, до лучших времен. Шейдеры deferred renderinga лежат в Samples для Ксорса, поковыряй может что и получится. В forward rendering есть свои недостатки и производительность будет падать от количества источников света. Можно схитрить, где надо там показываем источник света где не надо скрываем либо перемещаем его туда куда нужно.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
19.02.2013, 21:42
|
#5
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Освещение - множество источников + бамп
Деферед = с помощью MRT рендерим за 1 вызов отрисовки объекты сразу в множество текстур - всего как минимум нам нужен цвет, нормали и позиция (можно хранить глубину и из неё восстановить позицию в шейдере). Далее постпроцессом всё это совмещается, т.е. освещение считается на полноэкранном кваде на основе инфы из отрендереных текстур и массива источников света.
Форвард = рендерим объекты с шейдерами, в которых сразу всё считаем.
Почему деферед потенциально быстрее форварда = в дефереде мы считаем свет только на столько пикселей, сколько влезают в экран, в форварде объекты загораживают друг друга, и мы считаем шейдер куда чаще; вообще видюха не шейдит пиксели, если те не проходят Z тест, т.е. в случае рендера объектов от ближних к дальним, кол-во зашейденых пикселей может приблизится к дефереду, но не полностью, т.к. на каждом объекте сами по себе треугольники могут создавать overdraw.
Если тебе нужно 10 источников света не на каждом объекте, а в сцене вообще - то форвард справится, просто суй только необходимые источники в шейдеры объектам.
Насчёт ксорса - хз - выпилили деферед, но может не выпилили МРТ? Если МРТ на месте, то всё реализуемо, если не на месте, то забей.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
19.02.2013, 21:43
|
#6
|
ПроЭктировщик
Регистрация: 08.05.2011
Сообщений: 143
Написано 46 полезных сообщений (для 219 пользователей)
|
Ответ: Освещение - множество источников + бамп
Phyton
ага, т.е. подставлять источники света туда, где их видно в кадре ?
но deferred rendering реализовать этими шейдерами возможно ?
|
(Offline)
|
|
19.02.2013, 21:46
|
#7
|
ПроЭктировщик
Регистрация: 08.05.2011
Сообщений: 143
Написано 46 полезных сообщений (для 219 пользователей)
|
Ответ: Освещение - множество источников + бамп
Mr_F_, спасибо
Деферед меня заинтересовал больше, но кажется придется повозится :\
в поставке с движком есть DeferredMRT.fx
|
(Offline)
|
|
19.02.2013, 21:53
|
#8
|
ПроЭктировщик
Регистрация: 08.05.2011
Сообщений: 143
Написано 46 полезных сообщений (для 219 пользователей)
|
Ответ: Освещение - множество источников + бамп
xSetDeferredShaders() и xInitDeferred() не работают. Вставил эти функции из старого xors3d.bb и xors3d.decls - тоже не хочет. MRT тоже никак, вырвали xEnableEntityShader
печаль беда
|
(Offline)
|
|
19.02.2013, 22:06
|
#9
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Освещение - множество источников + бамп
MRT тоже никак, вырвали xEnableEntityShader
|
тебе по идее нужны только:
xSetMRT(buffer%, frame%, index%)
xUnSetMRT()
|
(Offline)
|
|
20.02.2013, 16:54
|
#10
|
ПроЭктировщик
Регистрация: 08.05.2011
Сообщений: 143
Написано 46 полезных сообщений (для 219 пользователей)
|
Ответ: Освещение - множество источников + бамп
не удалось разобраться.
а что там с попиксельным освещением ?
|
(Offline)
|
|
21.02.2013, 20:28
|
#11
|
ПроЭктировщик
Регистрация: 08.05.2011
Сообщений: 143
Написано 46 полезных сообщений (для 219 пользователей)
|
Ответ: Освещение - множество источников + бамп
я кажется нашел то что мне нужно:
это шейдер за авторством MoKa, но у меня только шейдер, сорсов этой демки нету. Что передавать в шейдер (вообще их 2) так и не разобрался
|
(Offline)
|
|
22.02.2013, 17:01
|
#12
|
Разработчик
Регистрация: 20.02.2010
Сообщений: 397
Написано 173 полезных сообщений (для 565 пользователей)
|
Ответ: Освещение - множество источников + бамп
В общем так Владислав, первое что тебе нужно сделать это читать учебник по шейдерам для Xors3D http://area.xors3d.com/depository/do...ps-ru/download , это раз.
По поводу освещения ты можешь сделать следующие, берешь стандартный шейдер и поставки Xors3D > ShaderPack > - Bump Light. Разберешь сам пример по полочкам. Далее открываем шейдер Bump Light.FX смотрим у нас есть переменные
// Light
const float3 AmbientClr; // Ambient Color
const float3 LightClr; // Light Color
const half LightInt; // Light Intensity
// Positions
float3 PosLight; // Light Position
float RngLight; // Light Range
float DotLight; // Light Soft
// Other
static float3 Color;
static float4 cD;
static float3 cN;
static float3 nLight;
Добовляем еще переменные в виде LightClr2, LightInt2, PosLight2, RngLight2 , DotLight2, nLight2.
// Light 1
const float3 AmbientClr; // Ambient Color
const float3 LightClr; // Light Color
const half LightInt; // Light Intensity
// Positions
float3 PosLight; // Light Position
float RngLight; // Light Range
float DotLight; // Light Soft
// Light 2
const float3 LightClr2; // Light Color
const half LightInt2; // Light Intensity
// Positions
float3 PosLight2; // Light Position
float RngLight2; // Light Range
float DotLight2; // Light Soft
// Other
static float3 Color;
static float4 cD;
static float3 cN;
static float3 nLight;
static float3 nLight2;
Далее перелистываем ниже и видим описание техник. Нам нужна ТЕХНИКА psPointDistance.
Нам нужно добавить сюда второй источник света.
float4 psPointDistance( in sp_PW_TBN_TC IN ) : COLOR {
cD = tex2D(TexDiffuse,IN.TexCoords);
Color = cD.rgb*AmbientClr;
RngLight = pow(saturate(1.0f-(distance(IN.pWorld,PosLight)/RngLight)),DotLight);
if (RngLight>0.0f) {
cN = normalize(tex2D(TexNormal,IN.TexCoords)*2.0f-1.0f);
PosLight = normalize(PosLight-IN.pWorld);
nLight = float3(dot(PosLight,IN.Tangent),
dot(PosLight,IN.Binormal),dot(PosLight,IN.Normal));
nLight = pow(max(dot(cN,nLight),0.0f),0.8f);
Color +=cD.rgb*nLight*LightClr*LightInt*RngLight;
}
return float4(Color,cD.a);
}
Добавляем переменные второго источника света.
float4 psPointDistance( in sp_PW_TBN_TC IN ) : COLOR {
cD = tex2D(TexDiffuse,IN.TexCoords);
Color = cD.rgb*AmbientClr;
//light=1
RngLight = pow(saturate(1.0f-(distance(IN.pWorld,PosLight)/RngLight)),DotLight);
cN = normalize(tex2D(TexNormal,IN.TexCoords)*2.0f-1.0f);
PosLight = normalize(PosLight-IN.pWorld);
nLight = float3(dot(PosLight,IN.Tangent),
dot(PosLight,IN.Binormal),dot(PosLight,IN.Normal));
nLight = pow(max(dot(cN,nLight),0.0f),0.8f);
//light=2
RngLight2 = pow(saturate(1.0f-(distance(IN.pWorld,PosLight2)/RngLight2)),DotLight2);
cN = normalize(tex2D(TexNormal,IN.TexCoords)*2.0f-1.0f);
PosLight2 = normalize(PosLight2-IN.pWorld);
nLight2 = float3(dot(PosLight2,IN.Tangent),
dot(PosLight2,IN.Binormal),dot(PosLight2,IN.Normal));
nLight2 = pow(max(dot(cN,nLight2),0.0f),0.8f);
Color +=cD.rgb*nLight*LightClr*LightInt*RngLight+cD.rgb*nLight2*LightClr2*LightInt2*RngLight2;
return float4(Color,cD.a);
}
Далее уже в самом Ксорсе указываем второй источник света, ну думаю ты сам там поставишь источник света.
пару скринов.
Последний раз редактировалось FREE MAN, 04.03.2013 в 00:09.
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо FREE MAN за это полезное сообщение:
|
|
22.02.2013, 17:48
|
#13
|
ПроЭктировщик
Регистрация: 08.05.2011
Сообщений: 143
Написано 46 полезных сообщений (для 219 пользователей)
|
Ответ: Освещение - множество источников + бамп
Спасибо большое за развернутый ответ! Обязательно буду разбираться.
Сколько таким образом источников света возможно отображать, в смысле какое количество будет не критично ?
|
(Offline)
|
|
22.02.2013, 17:54
|
#14
|
Разработчик
Регистрация: 20.02.2010
Сообщений: 397
Написано 173 полезных сообщений (для 565 пользователей)
|
Ответ: Освещение - множество источников + бамп
Сообщение от Владислав
Спасибо большое за развернутый ответ! Обязательно буду разбираться.
Сколько таким образом источников света возможно отображать, в смысле какое количество будет не критично ?
|
Я тестировал 30 источников света 100-200 Fps. Опиши какая у тебя игра с открытыми местностями или закрытые помещения, от этого будет играть роль сколько можно будет использовать источников освещения, а также сколько количества полигонов и дипов в кадре.
|
(Offline)
|
|
22.02.2013, 18:03
|
#15
|
ПроЭктировщик
Регистрация: 08.05.2011
Сообщений: 143
Написано 46 полезных сообщений (для 219 пользователей)
|
Ответ: Освещение - множество источников + бамп
Игра закрытая (открытые локации если и будут, то с 1 глобальным источником)
Много коридоров, много автоматических дверей (участки карты за дверьми можно прятать, пока дверь закрыта, и снова показывать когда открыта)
так что думаю на 1 комнату лампочек так 10 точно можно.
Пока я слабо представляю как буду подставлять свет в необходимые места, это же придется все время в шейдер передавать новые значения.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:40.
|