Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Xors3D

Xors3D Графический движок с поддержкой DirectX9

Ответ
 
Опции темы
Старый 19.02.2013, 19:49   #1
Владислав
ПроЭктировщик
 
Аватар для Владислав
 
Регистрация: 08.05.2011
Сообщений: 143
Написано 46 полезных сообщений
(для 219 пользователей)
Сообщение Освещение - множество источников + бамп

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

Поковырял стандартные примеры, везде только с 1 источником света.
(Offline)
 
Ответить с цитированием
Старый 19.02.2013, 20:49   #2
FREE MAN
Разработчик
 
Регистрация: 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
FREE MAN
Разработчик
 
Регистрация: 20.02.2010
Сообщений: 397
Написано 173 полезных сообщений
(для 565 пользователей)
Ответ: Освещение - множество источников + бамп

deferred rendering был в Движке года то, но видимо они накосячили сильно и отрубили его, до лучших времен. Шейдеры deferred renderinga лежат в Samples для Ксорса, поковыряй может что и получится. В forward rendering есть свои недостатки и производительность будет падать от количества источников света. Можно схитрить, где надо там показываем источник света где не надо скрываем либо перемещаем его туда куда нужно.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Владислав (20.02.2013)
Старый 19.02.2013, 21:42   #5
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Освещение - множество источников + бамп

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

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

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

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

Насчёт ксорса - хз - выпилили деферед, но может не выпилили МРТ? Если МРТ на месте, то всё реализуемо, если не на месте, то забей.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Владислав (20.02.2013)
Старый 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
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 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
FREE MAN
Разработчик
 
Регистрация: 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), jfkkk (13.04.2013), tirarex (22.02.2013)
Старый 22.02.2013, 17:48   #13
Владислав
ПроЭктировщик
 
Аватар для Владислав
 
Регистрация: 08.05.2011
Сообщений: 143
Написано 46 полезных сообщений
(для 219 пользователей)
Ответ: Освещение - множество источников + бамп

Спасибо большое за развернутый ответ! Обязательно буду разбираться.
Сколько таким образом источников света возможно отображать, в смысле какое количество будет не критично ?
(Offline)
 
Ответить с цитированием
Старый 22.02.2013, 17:54   #14
FREE MAN
Разработчик
 
Регистрация: 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)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com