Показать сообщение отдельно
Старый 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)