forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   Освещение - множество источников + бамп (http://forum.boolean.name/showthread.php?t=17907)

Владислав 19.02.2013 19:49

Освещение - множество источников + бамп
 
Привет!
В сцене 50 точечных источников света, почти на всех поверхностях бамп, в кадре, к примеру, не более 10 источников.
Помогите разобраться, какие технологии/шейдеры использовать для реализации подобного?

Поковырял стандартные примеры, везде только с 1 источником света.

FREE MAN 19.02.2013 20:49

Ответ: Освещение - множество источников + бамп
 
Писать свой deferred rendering, либо использовать forward rendering он стандартный- ограничения до 30 источников света.

Владислав 19.02.2013 21:12

Ответ: Освещение - множество источников + бамп
 
Спасибо,
Можно немного подробней про deferred rendering? Это возможно реализовать шейдором для xors3D ?

Хотя и 30 вполне достаточно, forward rendering - это стандартные источники света в ксорсе ?

FREE MAN 19.02.2013 21:25

Ответ: Освещение - множество источников + бамп
 
deferred rendering был в Движке года то, но видимо они накосячили сильно и отрубили его, до лучших времен. Шейдеры deferred renderinga лежат в Samples для Ксорса, поковыряй может что и получится. В forward rendering есть свои недостатки и производительность будет падать от количества источников света. Можно схитрить, где надо там показываем источник света где не надо скрываем либо перемещаем его туда куда нужно.

Mr_F_ 19.02.2013 21:42

Ответ: Освещение - множество источников + бамп
 
Деферед = с помощью MRT рендерим за 1 вызов отрисовки объекты сразу в множество текстур - всего как минимум нам нужен цвет, нормали и позиция (можно хранить глубину и из неё восстановить позицию в шейдере). Далее постпроцессом всё это совмещается, т.е. освещение считается на полноэкранном кваде на основе инфы из отрендереных текстур и массива источников света.

Форвард = рендерим объекты с шейдерами, в которых сразу всё считаем.

Почему деферед потенциально быстрее форварда = в дефереде мы считаем свет только на столько пикселей, сколько влезают в экран, в форварде объекты загораживают друг друга, и мы считаем шейдер куда чаще; вообще видюха не шейдит пиксели, если те не проходят Z тест, т.е. в случае рендера объектов от ближних к дальним, кол-во зашейденых пикселей может приблизится к дефереду, но не полностью, т.к. на каждом объекте сами по себе треугольники могут создавать overdraw.

Если тебе нужно 10 источников света не на каждом объекте, а в сцене вообще - то форвард справится, просто суй только необходимые источники в шейдеры объектам.

Насчёт ксорса - хз - выпилили деферед, но может не выпилили МРТ? Если МРТ на месте, то всё реализуемо, если не на месте, то забей.

Владислав 19.02.2013 21:43

Ответ: Освещение - множество источников + бамп
 
Phyton
ага, т.е. подставлять источники света туда, где их видно в кадре ?

но deferred rendering реализовать этими шейдерами возможно ?

Владислав 19.02.2013 21:46

Ответ: Освещение - множество источников + бамп
 
Mr_F_, спасибо
Деферед меня заинтересовал больше, но кажется придется повозится :\
в поставке с движком есть DeferredMRT.fx

Владислав 19.02.2013 21:53

Ответ: Освещение - множество источников + бамп
 
xSetDeferredShaders() и xInitDeferred() не работают. Вставил эти функции из старого xors3d.bb и xors3d.decls - тоже не хочет. MRT тоже никак, вырвали xEnableEntityShader

печаль беда :(

Mr_F_ 19.02.2013 22:06

Ответ: Освещение - множество источников + бамп
 
Цитата:

MRT тоже никак, вырвали xEnableEntityShader
тебе по идее нужны только:
xSetMRT(buffer%, frame%, index%)
xUnSetMRT()

Владислав 20.02.2013 16:54

Ответ: Освещение - множество источников + бамп
 
не удалось разобраться.

а что там с попиксельным освещением ?

Владислав 21.02.2013 20:28

Ответ: Освещение - множество источников + бамп
 
я кажется нашел то что мне нужно:

это шейдер за авторством MoKa, но у меня только шейдер, сорсов этой демки нету. Что передавать в шейдер (вообще их 2) так и не разобрался

FREE MAN 22.02.2013 17:01

Ответ: Освещение - множество источников + бамп
 
В общем так Владислав, первое что тебе нужно сделать это читать учебник по шейдерам для 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);
}

Далее уже в самом Ксорсе указываем второй источник света, ну думаю ты сам там поставишь источник света.

пару скринов.

Владислав 22.02.2013 17:48

Ответ: Освещение - множество источников + бамп
 
Спасибо большое за развернутый ответ! Обязательно буду разбираться.
Сколько таким образом источников света возможно отображать, в смысле какое количество будет не критично ?

FREE MAN 22.02.2013 17:54

Ответ: Освещение - множество источников + бамп
 
Цитата:

Сообщение от Владислав (Сообщение 253524)
Спасибо большое за развернутый ответ! Обязательно буду разбираться.
Сколько таким образом источников света возможно отображать, в смысле какое количество будет не критично ?

Я тестировал 30 источников света 100-200 Fps. Опиши какая у тебя игра с открытыми местностями или закрытые помещения, от этого будет играть роль сколько можно будет использовать источников освещения, а также сколько количества полигонов и дипов в кадре.

Владислав 22.02.2013 18:03

Ответ: Освещение - множество источников + бамп
 
Игра закрытая (открытые локации если и будут, то с 1 глобальным источником)
Много коридоров, много автоматических дверей (участки карты за дверьми можно прятать, пока дверь закрыта, и снова показывать когда открыта)
так что думаю на 1 комнату лампочек так 10 точно можно.
Пока я слабо представляю как буду подставлять свет в необходимые места, это же придется все время в шейдер передавать новые значения.


Часовой пояс GMT +4, время: 09:43.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot