diff --git a/build/gamesource/levels/stalker_atp/stalker_atp.ent b/build/gamesource/levels/stalker_atp/stalker_atp.ent
index f91a0518dcd1406daef6721b393fec7868beeb71..459d8d323abd710269be07d0927717b8c66b3603 100644
--- a/build/gamesource/levels/stalker_atp/stalker_atp.ent
+++ b/build/gamesource/levels/stalker_atp/stalker_atp.ent
@@ -290,7 +290,9 @@ origin = -3.900000 -2.750000 22.000000
 rotation = 0.000000 0.000000 0.000000 1.000000
 
 [ent_22]
-classname = trigger
+OnTurnOn = 
+OnTurnOff = 
+classname = light_point
 model = "meshes/light/light_1.dse"
 ;origin = 0.000000 75.0000 0.000000
 origin = -3.9 -2.750000 22.000000
diff --git a/build/gamesource/shaders/aigrid/aigrid_quad.ps b/build/gamesource/shaders/aigrid/aigrid_quad.ps
index 2f4284aba3a53357cdc428b9ae7f20d23c7e8ddb..69041c882518a653433ceac7bce40b36b5799736 100644
--- a/build/gamesource/shaders/aigrid/aigrid_quad.ps
+++ b/build/gamesource/shaders/aigrid/aigrid_quad.ps
@@ -6,17 +6,13 @@ aigrid_quad.ps
 
 #include <../struct.h>
 
-sampler2D BaseSampler:register(s0);
+//##########################################################################
 
-struct VS_OUT 
-{
-	half4 Position	:POSITION0;
-	half2 TexUV		:TEXCOORD0;
-	half4 Pos		:TEXCOORD1;
-	half4 Color		:TEXCOORD2;
-};
+sampler2D g_sColor:register(s0);
+
+//##########################################################################
 
-half4 main(in vs_output_aigrid IN):COLOR0
+half4 main(in VSO_AIgrid IN):COLOR0
 {
-	return half4(lerp(tex2D(BaseSampler,IN.TexUV).xyz,IN.Color.xyz,IN.Color.a),1.f);
+	return half4(lerp(tex2D(g_sColor,IN.vTexUV).xyz, IN.vColor.xyz, IN.vColor.a), 1.f);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/aigrid/aigrid_quad.vs b/build/gamesource/shaders/aigrid/aigrid_quad.vs
index a75bbd65a7c1651783f92eae563f70e463d4dd8d..c7f853bd626e46fb9de7835784c16ccf7ec271ae 100644
--- a/build/gamesource/shaders/aigrid/aigrid_quad.vs
+++ b/build/gamesource/shaders/aigrid/aigrid_quad.vs
@@ -6,15 +6,22 @@ aigrid_quad.vs
 
 #include <../struct.h>
 
-half4x4 WorldViewProjection;
+//##########################################################################
 
-void main(in vs_input_aigrid IN, out vs_output_aigrid OUT) 
+half4x4 g_mWVP;
+
+//##########################################################################
+
+VSO_AIgrid main(in VSI_AIgrid IN) 
 {
-	OUT.Position.xyz = IN.Position + IN.InstancePos;
-	OUT.Position.w = 1.f;
-	OUT.Position = mul(OUT.Position, WorldViewProjection);
+	VSO_AIgrid OUT;
+	OUT.vPosition.xyz = IN.vPosition + IN.vInstPos;
+	OUT.vPosition.w = 1.0;
+	OUT.vPosition = mul(OUT.vPosition, g_mWVP);
+	
+	OUT.vPos = OUT.vPosition;
+	OUT.vColor = IN.vInstColor;
+	OUT.vTexUV = (IN.vTexUV * IN.vInstTex.xy)+IN.vInstTex.zw;
 	
-	OUT.Pos = OUT.Position;
-	OUT.Color = IN.InstanceCol;
-	OUT.TexUV = (IN.TexUV * IN.InstanceTex.xy)+IN.InstanceTex.zw;
+	return OUT;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/gdefines.h b/build/gamesource/shaders/gdefines.h
index b5bceb03e67a674e7a54ca20ae06b2d439f90570..12c3c54688d95f0432724cd74afa75774ba79d27 100644
--- a/build/gamesource/shaders/gdefines.h
+++ b/build/gamesource/shaders/gdefines.h
@@ -4,25 +4,59 @@ gdefines.h
 Макроопределения
 */
  
-#ifndef G_DEFINES
-#define G_DEFINES
+#ifndef __G_DEFINES
+#define __G_DEFINES
 
-const half2 TexUV_Center = half2(0.5f,0.5f);
+//! координаты центра текстуры
+static const half2 g_vTexUVcenter = half2(0.5, 0.5);
 
-//максимальное значение для альфа теста растительности
-#define GREEN_ALPHATEST_VALUE 	0.5
-
-//коэфициент освещения дальнего сплита теней для pssm [0,1]
+//! коэффициент освещения дальнего сплита теней для pssm [0,1]
 #define PSSM_SHADING_LAST 		0.1
 
-//на сколько будут домножены координаты для смещения по текстуре со случайными значениями при генерации теней
+//! на сколько будут домножены координаты для смещения по текстуре со случайными значениями при генерации теней
 #define SHADOWGEN_JITTER_SCALE 1024.0
 
-//дистанция от камеры на которую не будет растространяться эффект motion blur (сделано для того чтобы не размывать худ)
-#define PP_MOTION_BLUR_DISTNOBLUR 1.f
+//! дистанция от камеры, на которую не будет растространяться эффект motion blur (сделано для того чтобы не размывать худ)
+#define PP_MOTION_BLUR_DISTNOBLUR 1.0
+
+//! дистанция от камеры плавного появления SSAO, чтобы близко не было сильного затенения
+#define PP_SSAO_DIST_EMERSION 3.0
+
+//! количество принимаемого исходного цвета
+#define PP_LENS_FLARE_COUNT_DEST_COLOR 0.8
 
+//! PI :)
 #define PI 3.141592654f
 
+//! количество лодов текстур для сцены
+#define SCENE_COUNT_TEXTURE_LOD	10
+
+
+/*
+С параметрами устранения shadow acne пришлось долго возиться подбирая наиболее оптимальные, надо иметь ввиду при правках
+*/
+
+//! коэффициент смещения вершин по нормали, для уменьшения объем модели, для устранения shadow acne
+#define SHADOW_SCOPE_BIAS 0.01
+
+//! добавочное смещение глубины для теней, для устранения shadow acne
+#define SHADOW_SLOPE_BIAS 0.00001
+
+//! множитель slope смещения теней, для устранения shadow acne
+#define SHADOW_SLOPE_SCALE 1.8
+
+
+//! минимально допустимое значение отражательной способности материала для принятия ambient цвета
+#define F0_MIN_4_DEST_AMBIENT 0.25
+
+//! максимальнео количество слоев
+#define LAYERS_COUNT_MAX 256
+
+//! слой непрозрачной геометрии
+#define LAYER_OPAQUE 1
+
+//##########################################################################
+
 /*! \name Возможные слои
 @{*/
 
@@ -38,20 +72,32 @@ const half2 TexUV_Center = half2(0.5f,0.5f);
 //! прозрачные освещаемые
 #define MTLTYPE_LAYER_TRANSPARENT_LIGHT	1.0
 
+
+//! сравнение слоев
 #define EQUAL_LAYER(layer1, layer2) (abs(layer1 - layer2) < 0.1)
 
 //!@}
 
-//парметры для tone mapping
-//{
+//##########################################################################
+
+/*! \name парметры для tone mapping
+@{*/
 
-//прибавляемое смещение к коэфициенту адаптации глаза к освещению (чтобы не было деления на 0)
+//! прибавляемое смещение к коэфициенту адаптации глаза к освещению (чтобы не было деления на 0)
 #define TONE_MAPPING_ADAPT_ADD_BIAS 		0.0001f
 
-//число которое будет поделено на коэфициент адаптации глаза к освещению
+//! число которое будет поделено на коэффициент адаптации глаза к освещению
 #define TONE_MAPPING_DENOMENATOR			0.1f
 
-//}
+//!@}
+
+//##########################################################################
+
+//! значение для альфа теста растительности
+#define GREEN_ALPHATEST_VALUE 	0.5
+
+//! значение альфа теста при построении глубины, нужно учитывать что растительность будет отсекаться именно по этому значению, а не по #GREEN_ALPHATEST_VALUE
+#define SHADOW_DEPTH_ALPHATEST_VALUE 	0.5
 
 //регистры данных для растительности
 //{
@@ -62,22 +108,24 @@ const half2 TexUV_Center = half2(0.5f,0.5f);
 #define GREEN_R_BBMIN		c63
 //}
 
-//дистанция на которую распространяется детализированность шейдеров mtrl_land_
+//##########################################################################
+
+//! дистанция на которую распространяется детализированность шейдеров mtrl_land_
 #define MTRL_LAND_DIST	100.f
 
-//на сколько увеличиваем текстурные координаты для текстур микрорельефа и детальных текстур mtrl_land_
+//! на сколько увеличиваем текстурные координаты для текстур микрорельефа и детальных текстур mtrl_land_
 #define MTRL_LAND_TEXUV_SCALE	1024.f
 
-//на сколько увеличиваем текстурные координаты для текстур микрорельефа и детальных текстур
+//! на сколько увеличиваем текстурные координаты для текстур микрорельефа и детальных текстур
 #define MTRL_TEXUV_SCALE	32.f
 
-//количество возможных лодов для отражений
+//! количество возможных лодов для отражений
 #define MTRL_REF_LOD_COUNT	5.f
 
-//параметр освещения "шероховатость поверхности", минимальное значение
+//! параметр освещения "шероховатость поверхности", минимальное значение
 #define PARAM_LIGHTING_ROUGHNESS_MIN	0.05f
 
-//параметр освещения "шероховатость поверхности", максимальное значение
+//! параметр освещения "шероховатость поверхности", максимальное значение
 #define PARAM_LIGHTING_ROUGHNESS_MAX	0.4f
 
 #else
diff --git a/build/gamesource/shaders/green.h b/build/gamesource/shaders/green.h
index 73485ebf19d689a05e20661e1723afebbafdb275..a16ca908e7903b60babc8ce9bfbaf41a818ddd5c 100644
--- a/build/gamesource/shaders/green.h
+++ b/build/gamesource/shaders/green.h
@@ -28,3 +28,10 @@ half4 GreenTransformPos(half3 pos,half scale,half multiplier, half3 translate)
 	tpos.xyz += translate;
 	return tpos;
 }
+
+half4 GreenAlphaTest(half4 vColor)
+{
+	clip(vColor.a - GREEN_ALPHATEST_VALUE);
+	vColor.a = 1.f;
+	return vColor;
+}
\ No newline at end of file
diff --git a/build/gamesource/shaders/lighting/lighting_blend.ps b/build/gamesource/shaders/lighting/lighting_blend.ps
index fbbba4db9f9d843dd3d26d5d9f544f5359c43737..9c1053661eef7d35ed227fb3bf9a8965a64b8dbc 100644
--- a/build/gamesource/shaders/lighting/lighting_blend.ps
+++ b/build/gamesource/shaders/lighting/lighting_blend.ps
@@ -6,36 +6,52 @@ Cмешивание всех текстур для финального изоб
 
 #include <../struct.h>
 
-sampler2D ColorSampler:register(s0);
-sampler2D AmbientSampler:register(s1);
-sampler2D SpecDiffSampler:register(s2);
-sampler2D NormalSampler:register(s3);
-sampler2D AdaptedLumSampler:register(s4);
-sampler2D ParamSampler:register(s5);
-
-half4 main(vs_out_pp IN):COLOR0
+//##########################################################################
+
+sampler2D g_sColor:register(s0);
+sampler2D g_sAmbient:register(s1);
+sampler2D g_sSpecDiff:register(s2);
+sampler2D g_sNormals:register(s3);
+sampler2D g_sAdaptedLum:register(s4);
+sampler2D g_sParameters:register(s5);
+
+//##########################################################################
+
+half4 main(VSO_PP IN):COLOR0
 {
-	half4 normal = tex2D(NormalSampler,IN.TexUV);
-	half sort = normal.w;
-	half layer = normal.z;
-	half4 color = pow(tex2D(ColorSampler,IN.TexUV),2.2);
-	half4 param = tex2D(ParamSampler,IN.TexUV);
-
-	half4 ambient = tex2D(AmbientSampler,IN.TexUV);
-	half3 ambient_color = lerp((ambient.x + ambient.y + ambient.z)/3.0, ambient.xyz, ambient.w*2);
-	ambient_color = lerp(ambient_color.xyz, 1.0, clamp(param.y, 0.25, param.y));
-	//return float4(ambient.w,ambient.w,ambient.w,1);;
-	half spec = tex2D(SpecDiffSampler,IN.TexUV).r;
-	half fAdaptedLum = tex2D(AdaptedLumSampler, half2(0.5f, 0.5f));
-
-	if(!(EQUAL_LAYER(sort, MTLTYPE_LAYER_OPAQUE_UNLIT) || EQUAL_LAYER(sort, MTLTYPE_LAYER_TRANSPARENT_UNLIT)))
-		color.xyz = (((ambient_color * (ambient.w))*color.xyz)) + spec*0.5*(ambient.xyz);
+	half4 vNormal = tex2D(g_sNormals,IN.vTexUV);
+	half fSort = vNormal.w;
+	half fLayer = vNormal.z;
+	
+	//цвет приводим к sRGB
+	half4 vColor = pow(tex2D(g_sColor,IN.vTexUV), 2.2);
+	half4 vParameters = tex2D(g_sParameters,IN.vTexUV);
+
+	half4 vAmbient = tex2D(g_sAmbient,IN.vTexUV);
+	
+	/* расчет фонового цвета
+	1) интерполяция от чернобелого до цветного, на основании затенения, то есть чем больше тень тем меньше там фонового цвета
+	*/
+	half3 vAmbientColor = lerp((vAmbient.x + vAmbient.y + vAmbient.z)/3.0, vAmbient.xyz, vAmbient.w*2);
+	
+	/* 2) интерполяция приема цвета материалом, чем больше отражательная способность (f0) тем меньше примет цвета материал*/
+	vAmbientColor = lerp(vAmbientColor.xyz, 1.0, clamp(vParameters.y, F0_MIN_4_DEST_AMBIENT, vParameters.y));
+	
+	half fSpecular = tex2D(g_sSpecDiff,IN.vTexUV).r;
+	half fAdaptedLum = tex2D(g_sAdaptedLum, g_vTexUVcenter);
+
+	// если материал освещаемый то надо вычислить его освещенность
+	if(!(EQUAL_LAYER(fSort, MTLTYPE_LAYER_OPAQUE_UNLIT) || EQUAL_LAYER(fSort, MTLTYPE_LAYER_TRANSPARENT_UNLIT)))
+		vColor.xyz = (vAmbientColor * vAmbient.w*vColor.xyz) + (fSpecular * 0.5 * vAmbient.xyz);
 		
-	if(int(layer * 256.f) == 1)
-		color.a = 1.f;
+	// если слой материала относится к непрозрачной геометрии, тогда не нужна прозрачность
+	if(int(fLayer * LAYERS_COUNT_MAX) == LAYER_OPAQUE)
+		vColor.a = 1.0;
 
-	color.rgb *= TONE_MAPPING_DENOMENATOR/(fAdaptedLum + TONE_MAPPING_ADAPT_ADD_BIAS);
-	color.rgb /= (fAdaptedLum + color.rgb);
+	//применение тонмапинга
+	vColor.rgb *= TONE_MAPPING_DENOMENATOR/(fAdaptedLum + TONE_MAPPING_ADAPT_ADD_BIAS);
+	vColor.rgb /= (fAdaptedLum + vColor.rgb);
 	
-	return /*half4(ambient.xyz, 1.f);//*/pow(color, 1/2.2);
+	//приводим цвет к линейному пространству
+	return pow(vColor, 1.0/2.2);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/lighting/lighting_com.ps b/build/gamesource/shaders/lighting/lighting_com.ps
index 0b2508c17a29d49a437c47b39e1de96e96b19647..bf00d7076454cf8602070b0886b09ee2700ed547 100644
--- a/build/gamesource/shaders/lighting/lighting_com.ps
+++ b/build/gamesource/shaders/lighting/lighting_com.ps
@@ -7,22 +7,25 @@ lighting_blend.ps
 #include <../struct.h>
 #include <../mtrl.h>
 
-half4 LightPos;
-half2 LightPowerDist;
-half4 ViewPos;
-half4 LightColor;
-//half2 NearFar;	//!!!пустая, данные из движка сюда не приход¤т, как понадобитьс¤ надо включить
-
-sampler2D ColorSampler:register(s0);
-sampler2D NormalSampler:register(s1);
-sampler2D ParamSampler:register(s2);
+//##########################################################################
+
+half4 g_vLightPos;
+half2 g_vLightPowerDist;
+half4 g_vViewPos;
+half4 g_vLightColor;
+
+//##########################################################################
+
+sampler2D g_sNormals:register(s1);
+sampler2D g_sParameters:register(s2);
 //x - шероховатость (roughness)
 //y - отражательная способность поверхности (f0)
 //z - толщина (thickness)
+//w - occlusion
 
-sampler2D DepthSampler:register(s3);
-sampler2D ShadowSampler:register(s4);
-sampler2D AdaptedLumSampler:register(s5);
+sampler2D g_sDepth:register(s3);
+sampler2D g_sShadow:register(s4);
+sampler2D g_sAdaptedLum:register(s5);
 
 //#############################################################################
 
@@ -51,88 +54,83 @@ half GetSpecular(half4 matparam,half NdotH,half NdotV,half NdotL,half VdotL,half
 	matparam.x = lerp(PARAM_LIGHTING_ROUGHNESS_MIN, PARAM_LIGHTING_ROUGHNESS_MAX, matparam.x);
 	half D = D_Get(matparam.x, NdotH);
 	half G = G_Get(NdotV,NdotL,VdotL,NdotH,HdotV);
-	half3 F = F_Get(matparam.y, HdotV)*saturate(matparam.y*2);
+	half3 F = F_Get(matparam.y, HdotV)*saturate(matparam.y*3);
 	return ((D*G*F)/(PI*NdotL*NdotV+0.001));
 }
 
 //#############################################################################
 
-ps_out_com_lighting main(vs_out_res_pos IN)
+PSO_Lbuffer main(VSO_ResPos IN)
 {
-	ps_out_com_lighting OUT;
+	PSO_Lbuffer OUT;
 
-	half4 normalds = tex2D(NormalSampler,IN.TexUV);
+	half4 vNormals = tex2D(g_sNormals, IN.vTexUV);
 	
-	[branch]if(EQUAL_LAYER(normalds.w, MTLTYPE_LAYER_OPAQUE_UNLIT) || EQUAL_LAYER(normalds.w, MTLTYPE_LAYER_TRANSPARENT_UNLIT))
+	[branch]if(EQUAL_LAYER(vNormals.w, MTLTYPE_LAYER_OPAQUE_UNLIT) || EQUAL_LAYER(vNormals.w, MTLTYPE_LAYER_TRANSPARENT_UNLIT))
 	{
-		OUT.Amdient.xyz = 0;
-		OUT.Amdient.w = 0;
-		OUT.Spec = 0;
+		OUT.vAmdient.xyz = 0;
+		OUT.vAmdient.w = 0;
+		OUT.vSpecular = 0;
 		return OUT;
 	}
 	
-	half depth = tex2D(DepthSampler,IN.TexUV).r;
-	half fAdaptedLum = tex2D(AdaptedLumSampler, half2(0.5f, 0.5f));
+	half fDepth = tex2D(g_sDepth,IN.vTexUV).r;
+	
 	#ifdef IS_SHADOWED
-	half shadow = tex2D(ShadowSampler,IN.TexUV).r;
-	half originshadow = shadow;
+	half fShadow = saturate(tex2D(g_sShadow, IN.vTexUV).r);
+	half fOriginShadow = fShadow;
 	#endif
 	
-	half4 Position = half4(ViewPos.xyz + (IN.WorldRay) * (depth),1.f);
-	half dist = distance(Position.xyz,LightPos.xyz);
+	half4 vPosition = half4(g_vViewPos.xyz + IN.vWorldRay * fDepth, 1.0);
+	half fDistance = distance(vPosition.xyz, g_vLightPos.xyz);
 			
-	half invdist = 1.f - (dist/LightPowerDist.y);
-	
-	[branch]if(invdist < 0.f)
-		invdist = 0.f;
+	half fInvDistance = 1.f - (fDistance/g_vLightPowerDist.y);
 	
-	half attenuation = (invdist*invdist);
+	[branch]if(fInvDistance < 0.0)
+		fInvDistance = 0.0;
 	
-	half4 Param = tex2D(ParamSampler,IN.TexUV);
+	half fAttenuation = fInvDistance*fInvDistance;
 	
-	//normalds.xyz = NormalDecode(normalds.xy);//2.f * normalds.xyz - 1.f;
+	half4 vParam = tex2D(g_sParameters, IN.vTexUV);
 	
-	half3 NormalPixel = normalize(NormalDecode(normalds.xy));
-	half3 Ligth  = normalize(LightPos.xyz - Position.xyz); 
-	half3 VertexToEye = normalize(ViewPos.xyz - Position.xyz);
-	half3 HalfVector = normalize(VertexToEye + Ligth.xyz);
+	half3 vNormalPixel = normalize(NormalDecode(vNormals.xy));
+	half3 vLigth  = normalize(g_vLightPos.xyz - vPosition.xyz); 
+	half3 vVertexToEye = normalize(g_vViewPos.xyz - vPosition.xyz);
+	half3 vHalfVector = normalize(vVertexToEye + vLigth.xyz);
 	
-	half NdotH = dot(NormalPixel, HalfVector);
-	half NdotV = dot(NormalPixel, VertexToEye);
-	half NdotL = dot(NormalPixel, Ligth);
-	half LdotV = dot(Ligth, VertexToEye);
-	half HdotV = dot(HalfVector, VertexToEye);
+	half fNdotH = dot(vNormalPixel, vHalfVector);
+	half fNdotV = dot(vNormalPixel, vVertexToEye);
+	half fNdotL = dot(vNormalPixel, vLigth);
+	half fLdotV = dot(vLigth, vVertexToEye);
+	half fHdotV = dot(vHalfVector, vVertexToEye); 
 
-	half specular = (GetSpecular(Param,NdotH,NdotV,NdotL,LdotV,HdotV));
+	half fSpecular = GetSpecular(vParam, fNdotH, fNdotV, fNdotL, fLdotV, fHdotV);
 
-	half absdiffuse = saturate(NdotL);
-	half diffuse = absdiffuse;
+	half fAbsDiffuse = saturate(fNdotL);
+	half fDiffuse = fAbsDiffuse;
 	
-	//закрываем косяк с отставанием теней
+	//закрываем баг с отставанием теней
 	#ifdef IS_SHADOWED
-	shadow = saturate(min(shadow,absdiffuse-0.02));// + (normalds.w == 1 ? 0.2 : 0));//+0.01;
-	absdiffuse = shadow;
+	fShadow = saturate(min(fShadow, fAbsDiffuse - 0.02));// + (vNormals.w == 1 ? 0.2 : 0));//+0.01;
+	fAbsDiffuse = fShadow;
 	#endif
 
-	diffuse = saturate(diffuse + 0.1);
-	//diffuse = diffuse * (1.f+Param.y+0.01);
-	diffuse = lerp(1,diffuse, Param.z);
+	fDiffuse = saturate(fDiffuse + 0.1);
+	fDiffuse = lerp(1, fDiffuse, vParam.z);
+	
 	#ifdef IS_SHADOWED
-	if(Param.z < 1.f)
-		diffuse *= max(originshadow,0.2);
+	//если просвечиваемость меньше 1 (значит пиксель просвечиваемый)
+	[branch]if(vParam.z < 1.0)
+		fDiffuse *= max(fOriginShadow, 0.2);
 	else
-	{
-		diffuse *= max(shadow,lerp(0.01,0.2,LightColor.w));
-	}
+		//иначе выбираем значения тени из диапазона, на основании силы света
+		fDiffuse *= max(fShadow, lerp(0.01, 0.07,g_vLightColor.w));
 	#endif
 	
-	//LightColor.xyz *= max(diffuse,0.2);
-	
-	//OUT.Amdient.xyz = lerp(LightColor.xyz, 1.0, clamp((1.0 - Param.y - 0.001), 0.25, 1.0));
-	OUT.Amdient.xyz = LightColor.xyz * LightColor.xyz * LightPowerDist.x * attenuation;
-	OUT.Amdient.w = diffuse * Param.w * LightPowerDist.x * attenuation;
+	OUT.vAmdient.xyz = g_vLightColor.xyz * g_vLightColor.xyz * g_vLightPowerDist.x * fAttenuation;
+	OUT.vAmdient.w = fDiffuse * vParam.w * g_vLightPowerDist.x * fAttenuation;
 	
-	OUT.Spec = (specular*absdiffuse * attenuation * LightPowerDist.x);
+	OUT.vSpecular = fSpecular * fDiffuse * fAttenuation * g_vLightPowerDist.x;
 	
 	return OUT;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/lighting/lighting_tone_mapping.ps b/build/gamesource/shaders/lighting/lighting_tone_mapping.ps
deleted file mode 100644
index 23a87d4d4e7f1186778dad2e9c98bcc250c32d5f..0000000000000000000000000000000000000000
--- a/build/gamesource/shaders/lighting/lighting_tone_mapping.ps
+++ /dev/null
@@ -1,21 +0,0 @@
-
-/*
-lighting_tone_mapping.ps
-Применение фильтра tone mapping
-*/
-
-#include <../struct.h>
-
-sampler2D ColorSampler:register(s0);
-sampler2D AdaptedLumSampler:register(s1);
-
-half4 main(vs_out_pp IN):COLOR0
-{
-	half4 color = tex2D(ColorSampler,IN.TexUV);
-	half fAdaptedLum = tex2D(AdaptedLumSampler, TexUV_Center);
-
-	//color.rgb *= TONE_MAPPING_DENOMENATOR/(fAdaptedLum + TONE_MAPPING_ADAPT_ADD_BIAS);
-	//color.rgb /= (fAdaptedLum + color.rgb);
-	
-	return color;
-}
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrl.h b/build/gamesource/shaders/mtrl.h
index 09f62264ba50c3a66da869e284a2ec3e43ae16f4..4b1a05f576bcaa9de5f62800cf8edf48096d5c95 100644
--- a/build/gamesource/shaders/mtrl.h
+++ b/build/gamesource/shaders/mtrl.h
@@ -4,7 +4,7 @@ mtrl.h
 Общие функции для материалов
 */
 
-//матрица для трансформации координат текстуры отражени¤ (над водой)
+//! матрица для трансформации координат текстуры отражения (над водой)
 static const half4x4  MatrixReflection =
 {	0.5,	0,		0,		0, 
     0,		0.5,	0,		0, 
@@ -12,7 +12,7 @@ static const half4x4  MatrixReflection =
     0.5,	0.5,	0.5,	1
 };
 
-//матрица дл¤ трансофрмации координат текстуры преломлени¤ (под водой)
+//! матрица для трансофрмации координат текстуры преломления (под водой)
 static const half4x4  MatrixRefraction =
 {	0.5,	0,		0,		0, 
     0,		-0.5,	0,		0, 
@@ -20,64 +20,150 @@ static const half4x4  MatrixRefraction =
     0.5,	0.5,	0.5,	1
 };
 
-//отсечение пиксел¤ по дистанции (при превышении)
-void ClipFar(half curr_z, half far)
+//##########################################################################
+
+//! отсечение пикселя по дистанции (при превышении)
+void ClipFar(half fZ, half fFar)
+{
+	clip(fFar-fZ);
+}
+
+//##########################################################################
+
+//! просчет цвета линейной глубины [0,1] на основании текущей позиции и плоскостей отсечения! 
+half ComDepthByPos(half4 vPositionWVP, half2 vNearFar)
 {
-	clip(far-curr_z);
+	return ((vPositionWVP.z + vNearFar.x)/vNearFar.y);
 }
 
-//просчет цвета линейной глубины [0,1] на основании текущей позиции и плоскостей отсечени¤
-half4 GetDepthW(half4 pos, half2 near_far)
+//! аналогично #ComDepthByPos, только возвращает вектор
+half4 ComDepthByPosVec4(half4 vPositionWVP, half2 vNearFar)
 {
-	half depth = /*pos.z / pos.w;//*/(pos.z + near_far.x)/near_far.y;
-	return half4(depth,depth,depth,1);
+	half fDepth = ComDepthByPos(vPositionWVP, vNearFar);
+	return half4(fDepth, fDepth, fDepth,1);
 }
 
-//! debug просчет линейной глубины
-/*half4 GetDepthLinearR(half depth, half2 near_far)
+#define GetDepthW ComDepthByPosVec4
+
+//##########################################################################
+
+//! возвращает номер лода для для отражений, на основании шероховатости материала [0, 1]
+half GetTexLod4Ref(half fRoughness)
 {
-	return depth;
-}*/
+	return lerp(0.f, MTRL_REF_LOD_COUNT, fRoughness);
+}
 
-//просчет дистанци на основании линейной глубины и плоскостей отсечени¤
-/*half4 GetDepthDistR(half depth, half2 near_far)
+/*! возаращет нужный лод текстуры,
+ \param fCountLods - количество лодов в текстуре
+ \param vDX - ddx(vTexUV.x)
+ \param vDY - ddx(vTexUV.y)
+*/
+half GetTextureLodEx(half fCountLods, half2 vDX, half2 vDY)
 {
-	return depth*near_far.y;
-}*/
+	return (fCountLods - 1.0)+log2(max(length(vDX), length(vDY)));
+}
 
-half GetTexLod4Ref(half roughness)
+//! возвращает номер лода, подробности #GetTextureLodEx
+half GetTextureLod(half fCountLods, half2 vTexUV)
 {
-	return lerp(0.f, MTRL_REF_LOD_COUNT, roughness);
+	return GetTextureLodEx(fCountLods, ddx(vTexUV.x), ddx(vTexUV.y));
 }
 
-/*half LinearizeDepth(half depth, half2 NearFar)
+//! возвращает номер нужного лода на основании текстурных координат, для текстур сцены (текстуры для моделей)
+half GetTextureLod4Scene(half2 vTexUV)
 {
-	return depth;//(NearFar.x / (NearFar.y + NearFar.x - depth * (NearFar.y - NearFar.x)));
-}*/
+	return GetTextureLodEx(SCENE_COUNT_TEXTURE_LOD, ddx(vTexUV), ddy(vTexUV));
+}
+
+//##########################################################################
 
+//! кодирование xyz нормали в xy
 half3 NormalEncode(half3 n)
 {
-    /*half p = sqrt(n.z*8+8);
-    return half4(n.xy/p + 0.5,0,0);*/
-	
 	half2 enc = normalize(n.xy) * (sqrt(-n.z*0.5+0.5));
     enc = enc*0.5+0.5;
     return half3(enc, 0);
 }
 
+//! декодирование нормали xy в xyz
 half3 NormalDecode(half2 enc)
 {
-   /* half2 fenc = enc*4-2;
-    half f = dot(fenc,fenc);
-    half g = sqrt(1-f/4);
-    half3 n;
-    n.xy = fenc*g;
-    n.z = 1-f/2;
-    return n;*/
-	
 	half4 nn = half4(enc, enc)*half4(2,2,0,0) + half4(-1,-1,1,-1);
     half l = dot(nn.xyz,-nn.xyw);
     nn.z = l;
     nn.xy *= sqrt(l);
     return nn.xyz * 2 + half3(0,0,-1);
 }
+
+//! преобразвоание цвета в нормаль (если конечно цвет содержит нормаль)
+half3 Color2Normal(half3 vColor)
+{
+	return (2.0 * vColor - 1.0);
+}
+
+//##########################################################################
+
+//! формирование структуры G буфера
+PSO_Gbuffer CreateGbuffer(half4 vColor, half3 vNormal, half4 vParam, half4 vPosition, half4 vNearFarLayers)
+{
+	PSO_Gbuffer OUT;
+	
+	OUT.vColor = vColor;
+	
+	vNormal = normalize(vNormal);
+	OUT.vNormal.xy = NormalEncode(vNormal);
+	OUT.vNormal.w = vNearFarLayers.z;
+	OUT.vNormal.z = vNearFarLayers.w;
+	
+	OUT.vParam = vParam;
+	
+	OUT.vDepth = ComDepthByPosVec4(vPosition,vNearFarLayers.xy);
+	
+	return OUT;
+}
+
+//##########################################################################
+
+//! возвращает фактор интерполяции [0, 1] для детальных/микрорельефных текстур, где чем меньше значение тем больше будет проявление детальности/микронормалей
+half GetLerpFactorDetail(half fDistance)
+{
+	return saturate(fDistance/MTRL_LAND_DIST);
+}
+
+//! смешивание макронормали (модели) с микронормалью (из normal map)
+half3 MixNormalMicro(half3 vMacroNormal, half3 vMicroNormal)
+{
+	return normalize((vMacroNormal + half3(vMicroNormal.xy,vMacroNormal.z)));
+}
+
+//! смешивание 2 детальных текстур по маске, где r канал маски для первой детальной текстуры, а g для второй
+half4 MixDetail2(half4 vMask, half4 vDetail1, half4 vDetail2, half fIntesity)
+{
+	return (vDetail1 * vMask.r + vDetail2 * vMask.g) * fIntesity * 2.0;
+}
+
+//! смешивание 4 детальных текстур по маске, где на каждую текстуру по каналу из маски, r канал для первой детальной, и т.д.
+half4 MixDetail4(half4 vMask, half4 vDetail1, half4 vDetail2, half4 vDetail3, half4 vDetail4, half fIntesity)
+{
+	return (vDetail1 * vMask.r + vDetail2 * vMask.g + vDetail3 * vMask.b + vDetail4 * vMask.a) * fIntesity;
+}
+
+//! смешивание двух микронормалей (normal map)
+half3 MixMicroNormal(half3 vMicroNormal1, half3 vMicroNormal2, half fIntesity)
+{
+	return (vMicroNormal1 * fIntesity + vMicroNormal2 * fIntesity);
+}
+
+//! смешивание 4 микронормалей (normal map) по маске, где на каждую текстуру по каналу из маски, r канал для vMicroNormal1, и т.д.
+half3 MixMicroNormal4(half4 vMask, half3 vMicroNormal1, half3 vMicroNormal2, half3 vMicroNormal3, half3 vMicroNormal4, half fIntesity)
+{
+	return (vMicroNormal1 * vMask.r + vMicroNormal2 * vMask.g + vMicroNormal3 * vMask.b + vMicroNormal4 * vMask.a) * fIntesity;
+}
+
+//! смешивание цвета и детального цвета, на основе фактора интерполяции #GetLerpFactorDetail
+half4 MixColorDetail(half4 vColor, half4 vDetail, half fLerpFactor)
+{
+	half4 vBlend = vColor * vDetail * (2.0 - vDetail);
+	vColor.rgb = lerp(vBlend,vColor,fLerpFactor).rgb;
+	return vColor;
+}
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_base.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_base.ps
index 1f2518911ddabc10bd5e28faaa3f91e68314af17..294e0e85805c184a3a0dec82f16f19806e1f4f95 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_base.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_base.ps
@@ -7,27 +7,21 @@ mtrlgeom_base.ps
 #include <../struct.h>
 #include <../mtrl.h>
 
-sampler2D BaseTex:register(s0);
-sampler2D ParamTex:register(s10);
+//##########################################################################
 
-half4 NearFarIsUnlit;
+sampler2D g_sColor:register(s0);
+sampler2D g_sParameters:register(s10);
 
-ps_out_ds_mrt main(vs_out_gcommon IN)
+//##########################################################################
+
+half4 g_vNearFarLayers;
+
+//##########################################################################
+
+PSO_Gbuffer main(VSO_SceneCommon IN)
 {
-	ClipFar(IN.Pos.z,NearFarIsUnlit.y);
-	
-	ps_out_ds_mrt OUT; 
-	OUT.Color = tex2D(BaseTex,IN.TexUV);
-	
-	IN.Normal = normalize(IN.Normal);
-	OUT.Normal.xy = NormalEncode(IN.Normal);
-	OUT.Normal.w = NearFarIsUnlit.z;
-	OUT.Normal.z = NearFarIsUnlit.w;
-	
-	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	//OUT.Param.w = OUT.Param.w;
-	
-	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
+	ClipFar(IN.vPos.z,g_vNearFarLayers.y);
+	IN.vNormal = normalize(IN.vNormal);
 	
-	return OUT;
+	return CreateGbuffer(tex2D(g_sColor,IN.vTexUV), IN.vNormal, tex2D(g_sParameters,IN.vTexUV), IN.vPos, g_vNearFarLayers);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_base.vs b/build/gamesource/shaders/mtrlgeom/mtrlgeom_base.vs
index 6775b06a29f95dabf944176397189eb7b16b11f4..e8dddced8f74a2908242a3d254b02f102bccee8b 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_base.vs
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_base.vs
@@ -6,17 +6,21 @@ mtrlgeom_base.vs
 
 #include <../struct.h>
 
-half4x4	WorldViewProjection;
-half4x4	World;
+//##########################################################################
 
-vs_out_gcommon main(vs_in_geom IN)
+half4x4	g_mWVP;
+half4x4	g_mW;
+
+//##########################################################################
+
+VSO_SceneCommon main(VSI_Geometry IN)
 {
-	vs_out_gcommon OUT;
+	VSO_SceneCommon OUT;
 
-	OUT.Position = mul(half4(IN.Position,1.f),WorldViewProjection);
-	OUT.Normal = mul(IN.Normal,World);
-	OUT.TexUV = IN.TexUV;
-	OUT.Pos = OUT.Position;
+	OUT.vPosition = mul(half4(IN.vPosition,1.f),g_mWVP);
+	OUT.vNormal = mul(IN.vNormal,g_mW);
+	OUT.vTexUV = IN.vTexUV;
+	OUT.vPos = OUT.vPosition;
 
 	return OUT;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_decal.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_decal.ps
index 67ef2088b26594392023914a07fa785d2c1e2c8e..8002ddaa2aac8600bc2e5c4dffc12c5668068e58 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_decal.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_decal.ps
@@ -7,14 +7,20 @@ mtrlgeom_decal.ps
 #include <../struct.h>
 #include <../mtrl.h>
 
-sampler2D BaseTex:register(s0);
+//##########################################################################
 
-half4 NearFarIsUnlit;
+sampler2D g_sColor:register(s0);
 
-half4 main(vs_out_gcommon IN) : COLOR0
+//##########################################################################
+
+half4 g_vNearFarLayers;
+
+//##########################################################################
+
+half4 main(VSO_SceneCommon IN) : COLOR0
 {
-	ClipFar(IN.Pos.z,NearFarIsUnlit.y);
-	half4 color = tex2D(BaseTex,IN.TexUV);
-	clip(color.a - 0.5f);
-	return color;
+	ClipFar(IN.vPos.z,g_vNearFarLayers.y);
+	half4 vColor = tex2D(g_sColor,IN.vTexUV);
+	clip(vColor.a - 0.5);
+	return vColor;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_det1.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_det1.ps
index b80ec01578bb61cb78afc5a6433d9d15963d6a72..a85982bec94bb2ac1b9da995687dd472669e9045 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_det1.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_det1.ps
@@ -7,31 +7,29 @@ mtrlgeom_det1.ps
 #include <../struct.h>
 #include <../mtrl.h>
 
-sampler2D BaseTex:register(s0);
-sampler2D DetTex0:register(s2);
-sampler2D ParamTex:register(s10);
+//##########################################################################
 
-half4 Param;
-half4 NearFarIsUnlit;
+sampler2D g_sColor:register(s0);
+sampler2D g_sDetails0:register(s2);
+sampler2D g_sParameters:register(s10);
 
-ps_out_ds_mrt main(vs_out_gcommon IN)
-{
-	ClipFar(IN.Pos.z,NearFarIsUnlit.y);
+//##########################################################################
 
-	ps_out_ds_mrt OUT; 
-	OUT.Color = tex2D(BaseTex,IN.TexUV);
-	half4 detcolor1 = tex2D(DetTex0, (IN.TexUV) * Param.x * MTRL_TEXUV_SCALE);
-	OUT.Color.rgb *= detcolor1.rgb;
+half4 g_vParam;
+half4 g_vNearFarLayers;
 
-	IN.Normal = normalize(IN.Normal);
-	OUT.Normal.xy = NormalEncode(IN.Normal);
-	OUT.Normal.w = NearFarIsUnlit.z;
-	OUT.Normal.z = NearFarIsUnlit.w;
-	
-	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	//OUT.Param.w = NearFarIsUnlit.w;
-	
-	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
+//##########################################################################
+
+PSO_Gbuffer main(VSO_SceneCommon IN)
+{
+	ClipFar(IN.vPos.z,g_vNearFarLayers.y);
+	IN.vNormal = normalize(IN.vNormal);
 	
-	return OUT;
+	return CreateGbuffer(
+		MixColorDetail(tex2D(g_sColor,IN.vTexUV), tex2D(g_sDetails0, IN.vTexUV * g_vParam.x * MTRL_TEXUV_SCALE), GetLerpFactorDetail(IN.vPos.z)), 
+		IN.vNormal, 
+		tex2D(g_sParameters,IN.vTexUV), 
+		IN.vPos, 
+		g_vNearFarLayers
+		);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_det2.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_det2.ps
deleted file mode 100644
index 36ab548682ba543e50584158d7fc3bc19aab67f2..0000000000000000000000000000000000000000
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_det2.ps
+++ /dev/null
@@ -1,56 +0,0 @@
-
-/*
-mtrlgeom_land_det2.ps
-Рендер ландшафта (геометрии), 2 детальные текстуры по маске
-*/
-
-#include <../struct.h>
-#include <../mtrl.h>
-
-sampler2D BaseTex:register(s0);
-
-sampler2D MaskTex:register(s1);
-
-sampler2D DetTex0:register(s2);
-sampler2D DetTex1:register(s3);
-
-sampler2D ParamTex:register(s10);
-
-half4 Param;
-half4 NearFarIsUnlit;
-
-ps_out_ds_mrt main(vs_out_gcommon IN)
-{
-	ClipFar(IN.Pos.z,NearFarIsUnlit.y);
-	ps_out_ds_mrt OUT;
-	half2 dx = ddx((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE);
-	half2 dy = ddy((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE);
-	half lod = 9.f+log2(max(length(dx), length(dy)));
-
-	IN.Normal = normalize(IN.Normal);
-	half4 basecolor = tex2D(BaseTex, IN.TexUV);
-	half4 detmaskcolor = tex2D(MaskTex, IN.TexUV);
-		[branch]if(IN.Pos.z < MTRL_LAND_DIST)
-		{
-			half4 detcolor1 = tex2Dlod(DetTex0, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0.f,lod));
-			half4 detcolor2 = tex2Dlod(DetTex1, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0.f,lod));
-			
-			half4 detcolor = detcolor1 * detmaskcolor.r + detcolor2 * detmaskcolor.g;
-			detcolor *= Param.y * 2.f;
-			
-			half4 blend = basecolor * detcolor * (2.f - detcolor);
-			basecolor.rgb = lerp(blend,basecolor,lerpfactor).rgb;
-		}
-	
-
-	OUT.Normal.xy = NormalEncode(IN.Normal);
-	OUT.Normal.w = NearFarIsUnlit.z;
-	OUT.Normal.z = NearFarIsUnlit.w;
-	
-	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	//OUT.Param.w = NearFarIsUnlit.w;
-	OUT.Color = basecolor;
-	
-	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
-	return OUT;
-}
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_det3.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_det3.ps
deleted file mode 100644
index 29dc0be8de1941ebf670007688c10d5542624fbd..0000000000000000000000000000000000000000
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_det3.ps
+++ /dev/null
@@ -1,57 +0,0 @@
-
-/*
-mtrlgeom_land_det3.ps
-Рендер ландшафта (геометрии), 3 детальные текстуры по маске
-*/
-
-#include <../struct.h>
-#include <../mtrl.h>
-
-sampler2D BaseTex:register(s0);
-
-sampler2D MaskTex:register(s1);
-
-sampler2D DetTex0:register(s2);
-sampler2D DetTex1:register(s3);
-sampler2D DetTex2:register(s4);
-
-sampler2D ParamTex:register(s10);
-
-half4 Param;
-half4 NearFarIsUnlit;
-
-ps_out_ds_mrt main(vs_out_gcommon IN)
-{
-	ClipFar(IN.Pos.z,NearFarIsUnlit.y);
-	ps_out_ds_mrt OUT;
-	half2 dx = ddx((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE);
-	half2 dy = ddy((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE);
-	half lod = 9.f+log2(max(length(dx), length(dy)));
-
-	IN.Normal = normalize(IN.Normal);
-	half4 basecolor = tex2D(BaseTex, IN.TexUV);
-	half4 detmaskcolor = tex2D(MaskTex, IN.TexUV);
-		[branch]if(IN.Pos.z < MTRL_LAND_DIST)
-		{
-			half4 detcolor1 = tex2Dlod(DetTex0, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0.f,lod));
-			half4 detcolor2 = tex2Dlod(DetTex1, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0.f,lod));
-			half4 detcolor3 = tex2Dlod(DetTex2, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0.f,lod));
-			
-			half4 detcolor = detcolor1 * detmaskcolor.r + detcolor2 * detmaskcolor.g + detcolor3 * detmaskcolor.b;
-			detcolor *= Param.y * 3.f;
-			
-			half4 blend = basecolor * detcolor * (3.f - detcolor);
-			basecolor.rgb = lerp(blend,basecolor,lerpfactor).rgb;
-		}	
-
-	OUT.Normal.xy = NormalEncode(IN.Normal);
-	OUT.Normal.w = NearFarIsUnlit.z;
-	OUT.Normal.z = NearFarIsUnlit.w;
-	
-	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	//OUT.Param.w = NearFarIsUnlit.w;
-	OUT.Color = basecolor;
-	
-	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
-	return OUT;
-}
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_det4.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_det4.ps
deleted file mode 100644
index 2afaaedddfeb1828f0abc306af1b08baf323ad3e..0000000000000000000000000000000000000000
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_det4.ps
+++ /dev/null
@@ -1,59 +0,0 @@
-
-/*
-mtrlgeom_land_det4.ps
-Рендер ландшафта (геометрии), 4 детальные текстуры по маске
-*/
-
-#include <../struct.h>
-#include <../mtrl.h>
-
-sampler2D BaseTex:register(s0);
-
-sampler2D MaskTex:register(s1);
-
-sampler2D DetTex0:register(s2);
-sampler2D DetTex1:register(s3);
-sampler2D DetTex2:register(s4);
-sampler2D DetTex3:register(s5);
-
-sampler2D ParamTex:register(s10);
-
-half4 Param;
-half4 NearFarIsUnlit;
-
-ps_out_ds_mrt main(vs_out_gcommon IN)
-{
-	ClipFar(IN.Pos.z,NearFarIsUnlit.y);
-	ps_out_ds_mrt OUT;
-	half2 dx = ddx((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE);
-	half2 dy = ddy((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE);
-	half lod = 9.f+log2(max(length(dx), length(dy)));
-
-	IN.Normal = normalize(IN.Normal);
-	half4 basecolor = tex2D(BaseTex, IN.TexUV);
-	half4 detmaskcolor = tex2D(MaskTex, IN.TexUV);
-		[branch]if(IN.Pos.z < MTRL_LAND_DIST)
-		{
-			half4 detcolor1 = tex2Dlod(DetTex0, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0.f,lod));
-			half4 detcolor2 = tex2Dlod(DetTex1, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0.f,lod));
-			half4 detcolor3 = tex2Dlod(DetTex2, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0.f,lod));
-			half4 detcolor4 = tex2Dlod(DetTex3, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0.f,lod));
-			
-			half4 detcolor = detcolor1 * detmaskcolor.r + detcolor2 * detmaskcolor.g + detcolor3 * detmaskcolor.b + detcolor4 * detmaskcolor.a;
-			detcolor *= Param.y * 4.f;
-			
-			half4 blend = basecolor * detcolor * (4.f - detcolor);
-			basecolor.rgb = lerp(blend,basecolor,lerpfactor).rgb;
-		}	
-
-	OUT.Normal.xy = NormalEncode(IN.Normal);
-	OUT.Normal.w = NearFarIsUnlit.z;
-	OUT.Normal.z = NearFarIsUnlit.w;
-	
-	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	//OUT.Param.w = NearFarIsUnlit.w;
-	OUT.Color = basecolor;
-	
-	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
-	return OUT;
-}
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_mr2_det2.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_mr2_det2.ps
deleted file mode 100644
index 421fb404399605d8c7db7d83bb63685958e54002..0000000000000000000000000000000000000000
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_mr2_det2.ps
+++ /dev/null
@@ -1,74 +0,0 @@
-
-/*
-mtrlgeom_land_mr2_det2.ps
-Рендер ландшафта (геометрии), 2 детальные текстуры и 2 текстуры микрорельефа по маске
-*/
-
-#include <../struct.h>
-#include <../mtrl.h>
-
-sampler2D BaseText:register(s0);
-
-sampler2D MaskTex:register(s1);
-
-sampler2D DetTex0:register(s2);
-sampler2D DetTex1:register(s3);
-
-sampler2D MRTex0:register(s6);
-sampler2D MRTex1:register(s7);
-
-sampler2D ParamTex:register(s10);
-
-half4 Param;
-half4 NearFarIsUnlit;
-
-ps_out_ds_mrt main(vs_out_gcommon IN)
-{
-	ClipFar(IN.Pos.z,NearFarIsUnlit.y);
-	ps_out_ds_mrt OUT;
-	half2 dx = ddx((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE);
-	half2 dy = ddy((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE);
-	half lod = 9.f+log2(max(length(dx), length(dy)));
-
-	IN.Normal = normalize(IN.Normal);
-	half3 NormalPixel;
-	half4 basecolor = tex2D(BaseText, IN.TexUV);
-	half4 detmaskcolor = tex2D(MaskTex, IN.TexUV);
-		[branch]if(IN.Pos.z < MTRL_LAND_DIST)
-		{
-			half4 detcolor1 = tex2Dlod(DetTex0, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0.f,lod));
-			half4 detcolor2 = tex2Dlod(DetTex1, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0.f,lod));
-			
-			half3 mdetcolor1 = (2.f * (tex2Dlod(MRTex0, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0,lod)).rgb)) - 1.f;
-			half3 mdetcolor2 = (2.f * (tex2Dlod(MRTex1, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0,lod)).rgb)) - 1.f;
-			
-
-			half4 detcolor = detcolor1 * detmaskcolor.r + detcolor2 * detmaskcolor.g;
-			detcolor *= Param.y * 2.f;
-			
-			half3 mdetcolor = mdetcolor1 * detmaskcolor.r + mdetcolor2 * detmaskcolor.g;
-			mdetcolor *= Param.z;
-			
-			
-			half lerpfactor = IN.Pos.z/MTRL_LAND_DIST;
-			lerpfactor = saturate(lerpfactor*lerpfactor);
-			NormalPixel = lerp(normalize((IN.Normal+half3(mdetcolor.xy,IN.Normal.z)) * 0.5f), IN.Normal, lerpfactor);
-			
-			half4 blend = basecolor * detcolor * (2.f - detcolor);
-			basecolor.rgb = lerp(blend,basecolor,lerpfactor).rgb;
-		}
-		else
-			NormalPixel = IN.Normal;
-	
-
-	OUT.Normal.xy = NormalEncode(NormalPixel);
-	OUT.Normal.w = NearFarIsUnlit.z;
-	OUT.Normal.z = NearFarIsUnlit.w;
-	
-	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	//OUT.Param.w = NearFarIsUnlit.w;
-	OUT.Color = basecolor;
-	
-	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
-	return OUT;
-}
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_mr3_det3.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_mr3_det3.ps
deleted file mode 100644
index 60413f9421594ba5ee979ee9a9044209f014c6e9..0000000000000000000000000000000000000000
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_mr3_det3.ps
+++ /dev/null
@@ -1,78 +0,0 @@
-
-/*
-mtrlgeom_land_mr3_det3.ps
-Рендер ландшафта (геометрии), 3 детальные текстуры и 3 текстуры микрорельефа по маске
-*/
-
-#include <../struct.h>
-#include <../mtrl.h>
-
-sampler2D BaseText:register(s0);
-
-sampler2D MaskTex:register(s1);
-
-sampler2D DetTex0:register(s2);
-sampler2D DetTex1:register(s3);
-sampler2D DetTex2:register(s4);
-
-sampler2D MRTex0:register(s6);
-sampler2D MRTex1:register(s7);
-sampler2D MRTex2:register(s8);
-
-sampler2D ParamTex:register(s10);
-
-half4 Param;
-half4 NearFarIsUnlit;
-
-ps_out_ds_mrt main(vs_out_gcommon IN)
-{
-	ClipFar(IN.Pos.z,NearFarIsUnlit.y);
-	ps_out_ds_mrt OUT;
-	half2 dx = ddx((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE);
-	half2 dy = ddy((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE);
-	half lod = 9.f+log2(max(length(dx), length(dy)));
-
-	IN.Normal = normalize(IN.Normal);
-	half3 NormalPixel;
-	half4 basecolor = tex2D(BaseText, IN.TexUV);
-	half4 detmaskcolor = tex2D(MaskTex, IN.TexUV);
-		[branch]if(IN.Pos.z < MTRL_LAND_DIST)
-		{
-			half4 detcolor1 = tex2Dlod(DetTex0, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0.f,lod));
-			half4 detcolor2 = tex2Dlod(DetTex1, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0.f,lod));
-			half4 detcolor3 = tex2Dlod(DetTex2, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0.f,lod));
-			
-			half3 mdetcolor1 = (2.f * (tex2Dlod(MRTex0, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0,lod)).rgb)) - 1.f;
-			half3 mdetcolor2 = (2.f * (tex2Dlod(MRTex1, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0,lod)).rgb)) - 1.f;
-			half3 mdetcolor3 = (2.f * (tex2Dlod(MRTex2, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0,lod)).rgb)) - 1.f;
-			
-
-			half4 detcolor = detcolor1 * detmaskcolor.r + detcolor2 * detmaskcolor.g + detcolor3 * detmaskcolor.b;
-			detcolor *= Param.y * 3.f;
-			
-			half3 mdetcolor = mdetcolor1 * detmaskcolor.r + mdetcolor2 * detmaskcolor.g + mdetcolor3 * detmaskcolor.b;
-			mdetcolor *= Param.z;
-		
-			
-			half lerpfactor = IN.Pos.z/MTRL_LAND_DIST;
-			lerpfactor = saturate(lerpfactor*lerpfactor);
-			NormalPixel = lerp(normalize((IN.Normal+half3(mdetcolor.xy,IN.Normal.z)) * 0.5f), IN.Normal,lerpfactor);
-			
-			half4 blend = basecolor * detcolor * (3.f - detcolor);
-			basecolor.rgb = lerp(basecolor * detcolor * (3.f - detcolor),basecolor,lerpfactor).rgb;
-		}
-		else
-			NormalPixel = IN.Normal;
-	
-
-	OUT.Normal.xy = NormalEncode(NormalPixel);
-	OUT.Normal.w = NearFarIsUnlit.z;
-	OUT.Normal.z = NearFarIsUnlit.w;
-	
-	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	//OUT.Param.w = NearFarIsUnlit.w;
-	OUT.Color = basecolor;
-	
-	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
-	return OUT;
-}
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_mr4_det4.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_mr4_det4.ps
index b10d310e00a592e4e83d6e7ecda2ecdbe7d6ecd8..838f7e34ca0a5a6b232746b9eaee21a3a4a2942d 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_mr4_det4.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_mr4_det4.ps
@@ -6,77 +6,70 @@ mtrlgeom_land_mr4_det4.ps
 
 #include <../struct.h>
 #include <../mtrl.h>
+#include <../ps.h>
 
-sampler2D BaseTex:register(s0);
+//##########################################################################
 
-sampler2D MaskTex:register(s1);
+sampler2D g_sColor:register(s0);
 
-sampler2D DetTex0:register(s2);
-sampler2D DetTex1:register(s3);
-sampler2D DetTex2:register(s4);
-sampler2D DetTex3:register(s5);
+sampler2D g_sMask:register(s1);
 
-sampler2D MRTex0:register(s6);
-sampler2D MRTex1:register(s7);
-sampler2D MRTex2:register(s8);
-sampler2D MRTex3:register(s9);
+sampler2D g_sDetails0:register(s2);
+sampler2D g_sDetails1:register(s3);
+sampler2D g_sDetails2:register(s4);
+sampler2D g_sDetails3:register(s5);
 
-sampler2D ParamTex:register(s10);
+sampler2D g_sNormals0:register(s6);
+sampler2D g_sNormals1:register(s7);
+sampler2D g_sNormals2:register(s8);
+sampler2D g_sNormals3:register(s9);
 
-half4 Param;
-half4 NearFarIsUnlit;
+sampler2D g_sParameters:register(s10);
 
-ps_out_ds_mrt main(vs_out_gcommon IN)
+//##########################################################################
+
+half4 g_vParam;
+half4 g_vNearFarLayers;
+
+//##########################################################################
+
+PSO_Gbuffer main(VSO_SceneCommon IN)
 {
-	ClipFar(IN.Pos.z,NearFarIsUnlit.y);
-	ps_out_ds_mrt OUT;
-	half2 dx = ddx((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE);
-	half2 dy = ddy((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE);
-	half lod = 9.f+log2(max(length(dx), length(dy)));
+	ClipFar(IN.vPos.z,g_vNearFarLayers.y);
+	IN.vNormal = normalize(IN.vNormal);
+	
+	half fLod = GetTextureLod4Scene(IN.vTexUV * g_vParam.x * MTRL_LAND_TEXUV_SCALE);
 
-	IN.Normal = normalize(IN.Normal);
-	half3 NormalPixel;
-	half4 basecolor = tex2D(BaseTex, IN.TexUV);
-	half4 detmaskcolor = tex2D(MaskTex, IN.TexUV);
-		[branch]if(IN.Pos.z < MTRL_LAND_DIST)
+	half3 vNormal;
+	half4 vColor = tex2D(g_sColor, IN.vTexUV);
+	half4 vMask = tex2D(g_sMask, IN.vTexUV);
+		[branch]if(IN.vPos.z < MTRL_LAND_DIST)
 		{
-			half4 detcolor1 = tex2Dlod(DetTex0, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0.f,lod));
-			half4 detcolor2 = tex2Dlod(DetTex1, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0.f,lod));
-			half4 detcolor3 = tex2Dlod(DetTex2, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0.f,lod));
-			half4 detcolor4 = tex2Dlod(DetTex3, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0.f,lod));
+			half2 vTexUV = half2(IN.vTexUV * g_vParam.x * MTRL_LAND_TEXUV_SCALE);
+			half4 vDetail0 = tex2Dlod2(g_sDetails0, vTexUV, fLod);
+			half4 vDetail1 = tex2Dlod2(g_sDetails1, vTexUV, fLod);
+			half4 vDetail2 = tex2Dlod2(g_sDetails2, vTexUV, fLod);
+			half4 vDetail3 = tex2Dlod2(g_sDetails3, vTexUV, fLod);
 			
-			half3 mdetcolor1 = (2.f * (tex2Dlod(MRTex0, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0,lod)).rgb)) - 1.f;
-			half3 mdetcolor2 = (2.f * (tex2Dlod(MRTex1, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0,lod)).rgb)) - 1.f;
-			half3 mdetcolor3 = (2.f * (tex2Dlod(MRTex2, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0,lod)).rgb)) - 1.f;
-			half3 mdetcolor4 = (2.f * (tex2Dlod(MRTex3, half4((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE,0,lod)).rgb)) - 1.f;
+			half3 vMicroNormal0 = Color2Normal(tex2Dlod2(g_sNormals0, vTexUV, fLod).rgb);
+			half3 vMicroNormal1 = Color2Normal(tex2Dlod2(g_sNormals1, vTexUV, fLod).rgb);
+			half3 vMicroNormal2 = Color2Normal(tex2Dlod2(g_sNormals2, vTexUV, fLod).rgb);
+			half3 vMicroNormal3 = Color2Normal(tex2Dlod2(g_sNormals3, vTexUV, fLod).rgb);
 			
 
-			half4 detcolor = detcolor1 * detmaskcolor.r + detcolor2 * detmaskcolor.g + detcolor3 * detmaskcolor.b + detcolor4 * detmaskcolor.a;
-			detcolor *= Param.y;
+			half4 vDetail = MixDetail4(vMask, vDetail0, vDetail1, vDetail2, vDetail3, g_vParam.y);
 			
-			half3 mdetcolor = mdetcolor1 * detmaskcolor.r + mdetcolor2 * detmaskcolor.g + mdetcolor3 * detmaskcolor.b + mdetcolor4 * detmaskcolor.a;
-			mdetcolor *= Param.z;
+			half3 vMicroNormal = MixMicroNormal4(vMask, vMicroNormal0, vMicroNormal1, vMicroNormal2, vMicroNormal3, g_vParam.z);
 			
+			half fLerpFactor = GetLerpFactorDetail(IN.vPos.z);
 			
-			half lerpfactor = IN.Pos.z/MTRL_LAND_DIST;
-			lerpfactor = saturate(lerpfactor*lerpfactor);
-			NormalPixel = lerp(normalize((IN.Normal+half3(mdetcolor.xy,IN.Normal.z)) * 0.5f),IN.Normal,lerpfactor);
+			vNormal = lerp(MixNormalMicro(IN.vNormal, vMicroNormal), IN.vNormal, fLerpFactor);
 			
-			half4 blend = basecolor * detcolor * (4.f - detcolor);
-			basecolor.rgb = lerp(blend,basecolor,lerpfactor).rgb;
+			vColor = MixColorDetail(vColor, vDetail, GetLerpFactorDetail(IN.vPos.z));
 		}
 		else
-			NormalPixel = IN.Normal;
+			vNormal = IN.vNormal;
 	
 
-	OUT.Normal.xy = NormalEncode(NormalPixel);
-	OUT.Normal.w = NearFarIsUnlit.z;
-	OUT.Normal.z = NearFarIsUnlit.w;
-	
-	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	//OUT.Param.w = NearFarIsUnlit.w;
-	OUT.Color = basecolor;
-	
-	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
-	return OUT;
+	return CreateGbuffer(vColor, vNormal, tex2D(g_sParameters,IN.vTexUV), IN.vPos, g_vNearFarLayers);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_light.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_light.ps
index 2b21d2300c5dd0b986f44b42de577f610482a4a1..19ba51713931d214d87dbba5863a0dc0835b1259 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_light.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_light.ps
@@ -7,18 +7,16 @@ mtrlgeom_light.ps
 #include <../struct.h>
 #include <../mtrl.h>
 
-half4 Param;	//цвет света
-half4 NearFarIsUnlit;
+//##########################################################################
 
-ps_out_ds_mrt main(vs_out_gcommon IN)
+//! цвет света
+half4 g_vParam;	
+half4 g_vNearFarLayers;
+
+//##########################################################################
+
+PSO_Gbuffer main(VSO_SceneCommon IN)
 {
-	ClipFar(IN.Pos.z,NearFarIsUnlit.y);
-	ps_out_ds_mrt OUT; 
-	OUT.Color = Param;
-	OUT.Color.a = 1.f;
-	OUT.Normal = half4(0.f, 0.f, 0.f, NearFarIsUnlit.z);
-	OUT.Param = half4(0.f, 0.f, 0.f, NearFarIsUnlit.w);
-	
-	OUT.Depth = GetDepthW(IN.Pos, NearFarIsUnlit.xy);
-	return OUT;
+	ClipFar(IN.vPos.z,g_vNearFarLayers.y);
+	return CreateGbuffer(g_vParam, half3(1.0, 1.0, 1.0), half4(0.0, 0.0, 0.0, 1.0), IN.vPos, g_vNearFarLayers);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_mrbase.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_mrbase.ps
index b12e5e56c94f8cf09c3323c144e7da75d984a8fe..3c66f1757ed61c7a09f32904952692e76d520743 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_mrbase.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_mrbase.ps
@@ -7,34 +7,24 @@ mtrlgeom_mrbase.ps
 #include <../struct.h>
 #include <../mtrl.h>
 
-sampler2D BaseTex:register(s0);
-sampler2D MRTex0:register(s6);
-sampler2D ParamTex:register(s10);
+//##########################################################################
 
-half4 Param;
-half4 NearFarIsUnlit;
+sampler2D g_sColor:register(s0);
+sampler2D g_sNormals0:register(s6);
+sampler2D g_sParameters:register(s10);
 
-ps_out_ds_mrt main(vs_out_gcommon IN)
-{
-	ClipFar(IN.Pos.z,NearFarIsUnlit.y);
+//##########################################################################
 
-	ps_out_ds_mrt OUT; 
-	OUT.Color = tex2D(BaseTex,IN.TexUV);
+half4 g_vParam;
+half4 g_vNearFarLayers;
 
-	half3 NormalMicro = ((2.f * (tex2D(MRTex0, IN.TexUV).rgb)) - 1.f);
-	NormalMicro *= Param.z;
-	IN.Normal = normalize(IN.Normal);
-	half3 NormalPixel = normalize((IN.Normal+half3(NormalMicro.xy,IN.Normal.z)) * 0.5f);
-	
-	OUT.Normal.xy = NormalEncode(NormalPixel);
-	OUT.Normal.w = NearFarIsUnlit.z;
-	OUT.Normal.z = NearFarIsUnlit.w;
-	
-	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	/*OUT.Normal.z = OUT.Param.w;
-	OUT.Param.w = NearFarIsUnlit.w;*/
-	
-	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
+//##########################################################################
+
+PSO_Gbuffer main(VSO_SceneCommon IN)
+{
+	ClipFar(IN.vPos.z,g_vNearFarLayers.y);
+	IN.vNormal = normalize(IN.vNormal);
 	
-	return OUT;
+	half3 vNormal = MixNormalMicro(IN.vNormal, Color2Normal(tex2D(g_sNormals0, IN.vTexUV).xyz) * g_vParam.z);
+	return CreateGbuffer(tex2D(g_sColor,IN.vTexUV), vNormal, tex2D(g_sParameters,IN.vTexUV), IN.vPos, g_vNearFarLayers);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_mrbase_det1.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_mrbase_det1.ps
index 0ecf7fdeac70bb2ee4acfe3560c7623ae2657e9c..3c58768cdde3d34e86ed520f53a2c0f2d47dd86f 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_mrbase_det1.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_mrbase_det1.ps
@@ -7,36 +7,32 @@ mtrlgeom_mrbase_det1.ps
 #include <../struct.h>
 #include <../mtrl.h>
 
-sampler2D BaseTex:register(s0);
-sampler2D DetTex:register(s2);
-sampler2D MRTex:register(s6);
-sampler2D ParamTex:register(s10);
+//##########################################################################
 
-half4 Param;
-half4 NearFarIsUnlit;
+sampler2D g_sColor:register(s0);
+sampler2D g_sDetails0:register(s2);
+sampler2D g_sNormals0:register(s6);
+sampler2D g_sParameters:register(s10);
 
-ps_out_ds_mrt main(vs_out_gcommon IN)
-{
-	ClipFar(IN.Pos.z,NearFarIsUnlit.y);
+//##########################################################################
 
-	ps_out_ds_mrt OUT; 
-	OUT.Color = tex2D(BaseTex,IN.TexUV);
-	half4 detcolor1 = tex2D(DetTex, (IN.TexUV) * Param.x * MTRL_TEXUV_SCALE);
-	OUT.Color.rgb *= detcolor1.rgb;
+half4 g_vParam;
+half4 g_vNearFarLayers;
 
-	half3 NormalMicro = ((2.f * (tex2D(MRTex, IN.TexUV).rgb)) - 1.f);
-	NormalMicro *= Param.z;
-	IN.Normal = normalize(IN.Normal);
-	half3 NormalPixel = normalize((IN.Normal+half3(NormalMicro.xy,IN.Normal.z)) * 0.5f);
-	
-	OUT.Normal.xy = NormalEncode(NormalPixel);
-	OUT.Normal.w = NearFarIsUnlit.z;
-	OUT.Normal.z = NearFarIsUnlit.w;
-	
-	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	//OUT.Param.w = NearFarIsUnlit.w;
+//##########################################################################
+
+PSO_Gbuffer main(VSO_SceneCommon IN)
+{
+	ClipFar(IN.vPos.z,g_vNearFarLayers.y);
+	IN.vNormal = normalize(IN.vNormal);
 	
-	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
+	half3 vNormal = MixNormalMicro(IN.vNormal, Color2Normal(tex2D(g_sNormals0, IN.vTexUV).rgb) * g_vParam.z);
 	
-	return OUT;
+	return CreateGbuffer(
+		MixColorDetail(tex2D(g_sColor,IN.vTexUV), tex2D(DetTex, IN.vTexUV * g_vParam.x * MTRL_TEXUV_SCALE), GetLerpFactorDetail(IN.vPos.z)), 
+		vNormal, 
+		tex2D(g_sParameters,IN.vTexUV), 
+		IN.vPos, 
+		g_vNearFarLayers
+		);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_mrbase_mr1_det1.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_mrbase_mr1_det1.ps
index 0a3f7e427973cef54fe2b70929fc79b9b30eed9f..d58efd0e64b483cbbd9fe7c19f176cbeeb3d700e 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_mrbase_mr1_det1.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_mrbase_mr1_det1.ps
@@ -7,39 +7,34 @@ mtrlgeom_mrbase_mr1_det1.ps
 #include <../struct.h>
 #include <../mtrl.h>
 
-sampler2D BaseTex:register(s0);
-sampler2D DetTex:register(s2);
-sampler2D MRTex0:register(s6);
-sampler2D MRTex1:register(s7);
-sampler2D ParamTex:register(s10);
+//##########################################################################
 
-half4 Param;
-half4 NearFarIsUnlit;
+sampler2D g_sColor:register(s0);
+sampler2D g_sDetails0:register(s2);
+sampler2D g_sNormals0:register(s6);
+sampler2D g_sNormals1:register(s7);
+sampler2D g_sParameters:register(s10);
 
-ps_out_ds_mrt main(vs_out_gcommon IN)
+//##########################################################################
+
+half4 g_vParam;
+half4 g_vNearFarLayers;
+
+//##########################################################################
+
+PSO_Gbuffer main(VSO_SceneCommon IN)
 {
-	ClipFar(IN.Pos.z,NearFarIsUnlit.y);
-
-	ps_out_ds_mrt OUT; 
-	OUT.Color = tex2D(BaseTex,IN.TexUV);
-	half4 detcolor1 = tex2D(DetTex, (IN.TexUV) * Param.x * MTRL_TEXUV_SCALE);
-	OUT.Color.rgb *= detcolor1.rgb;
-
-	half3 NormalMicro = ((2.f * (tex2D(MRTex0, IN.TexUV).rgb)) - 1.f);
-	NormalMicro *= Param.z;
-	half3 mrcolor1 = (2.f * (tex2D(MRTex1, (IN.TexUV) * Param.x * MTRL_TEXUV_SCALE).rgb)) - 1.f;
-	mrcolor1 *= Param.z;
-	IN.Normal = normalize(IN.Normal);
-	half3 NormalPixel = normalize((IN.Normal+half3((NormalMicro.xy+mrcolor1.xy),IN.Normal.z)) * 0.5f);
-	
-	OUT.Normal.xy = NormalEncode(NormalPixel);
-	OUT.Normal.w = NearFarIsUnlit.z;
-	OUT.Normal.z = NearFarIsUnlit.w;
-	
-	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	//OUT.Param.w = NearFarIsUnlit.w;
+	ClipFar(IN.vPos.z,g_vNearFarLayers.y);
+	IN.vNormal = normalize(IN.vNormal);
 	
-	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
+	half3 vMicroNormal = MixMicroNormal(Color2Normal(tex2D(g_sNormals0, IN.vTexUV).rgb), Color2Normal(tex2D(g_sNormals1, IN.vTexUV * g_vParam.x * MTRL_TEXUV_SCALE).rgb), g_vParam.z);
+	half3 vNormal = MixNormalMicro(IN.vNormal, vMicroNormal);
 	
-	return OUT;
+	return CreateGbuffer(
+		MixColorDetail(tex2D(g_sColor,IN.vTexUV), tex2D(g_sDetails0, IN.vTexUV * g_vParam.x * MTRL_TEXUV_SCALE), GetLerpFactorDetail(IN.vPos.z)), 
+		vNormal, 
+		tex2D(g_sParameters,IN.vTexUV), 
+		IN.vPos, 
+		g_vNearFarLayers
+		);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_reflect_cube.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_reflect_cube.ps
index 9230e3852fa25f6b6fa3646586e47b67959973fc..a0fffa4c5e2f766ffe5f44d31dcc412d14bf10ec 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_reflect_cube.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_reflect_cube.ps
@@ -7,31 +7,29 @@ mtrlgeom_reflect_cube.ps
 #include <../struct.h>
 #include <../mtrl.h>
 
-sampler2D BaseTex:register(s0);
-sampler2D ParamTex:register(s10);
-samplerCUBE ReflectTex:register(s12);
+//##########################################################################
 
-half4 NearFarIsUnlit;
+sampler2D g_sColor:register(s0);
+sampler2D g_sParameters:register(s10);
+samplerCUBE g_sReflection:register(s12);
 
-ps_out_ds_mrt main(vs_out_refcube IN)
+//##########################################################################
+
+half4 g_vNearFarLayers;
+
+//##########################################################################
+
+PSO_Gbuffer main(VSO_RefCube IN)
 {
-	ClipFar(IN.Pos.z,NearFarIsUnlit.y);
-	
-	ps_out_ds_mrt OUT; 
-	OUT.Color = tex2D(BaseTex,IN.TexUV);
-	
-	IN.Normal = normalize(IN.Normal);
-	OUT.Normal.xy = NormalEncode(IN.Normal);
-	OUT.Normal.w = NearFarIsUnlit.z;
-	OUT.Normal.z = NearFarIsUnlit.w;
+	ClipFar(IN.vPos.z,g_vNearFarLayers.y);
+	IN.vNormal = normalize(IN.vNormal);
 	
-	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	//OUT.Param.w = NearFarIsUnlit.w;
+	half4 vColor = tex2D(g_sColor,IN.vTexUV);
+	half4 vParam = tex2D(g_sParameters,IN.vTexUV);
 	
-	half MipmapIndex = GetTexLod4Ref(saturate(OUT.Param.r));
-	half4 reflection = texCUBElod(ReflectTex, half4(IN.CubePPos,MipmapIndex));
-	OUT.Color.xyz = lerp(OUT.Color.xyz,reflection.xyz,OUT.Param.y);
-	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
+	half fLod = GetTexLod4Ref(saturate(vParam.r));
+	half4 vReflection = texCUBElod(g_sReflection, half4(IN.vCubePPos, fLod));
+	vColor.xyz = lerp(vColor.xyz, vReflection.xyz, vParam.y);
 	
-	return OUT;
+	return CreateGbuffer(vColor, IN.vNormal, vParam, IN.vPos, g_vNearFarLayers);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_reflect_cube.vs b/build/gamesource/shaders/mtrlgeom/mtrlgeom_reflect_cube.vs
index ceb83181852ba4a73ac04afdd34fefa3ef39fbf2..e489fcf563f8622442219a477b52d7ac77d8254a 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_reflect_cube.vs
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_reflect_cube.vs
@@ -7,22 +7,26 @@ mtrlgeom_reflect_cube.vs
 #include <../struct.h>
 #include <../mtrl.h>
 
-half4x4	WorldViewProjection;
-half4x4	WorldView;
-half4x4	View;
-half4x4	World;
+//##########################################################################
 
-vs_out_refcube main(vs_in_geom IN)
+half4x4	g_mWVP;
+half4x4	g_mWV;
+half4x4	g_mV;
+half4x4	g_mW;
+
+//##########################################################################
+
+VSO_RefCube main(VSI_Geometry IN)
 {
-	vs_out_refcube OUT;
+	VSO_RefCube OUT;
 
-	OUT.Position = mul(half4(IN.Position,1), WorldViewProjection);
-	OUT.Normal	= mul(IN.Normal, World);
-	OUT.TexUV = IN.TexUV;
-	OUT.Pos = OUT.Position;
+	OUT.vPosition = mul(half4(IN.vPosition,1), g_mWVP);
+	OUT.vNormal	= mul(IN.vNormal, g_mW);
+	OUT.vTexUV = IN.vTexUV;
+	OUT.vPos = OUT.vPosition;
 	
-	half3 viewVec= mul(IN.Position, WorldView);
-	OUT.CubePPos = mul((half3x3)(View),reflect(viewVec, mul(OUT.Normal, (half3x3)(View))));
-	OUT.CubePPos.y = -OUT.CubePPos.y;
+	half3 vView= mul(IN.vPosition, g_mWV);
+	OUT.vCubePPos = mul((half3x3)(g_mV),reflect(vView, mul(OUT.vNormal, (half3x3)(g_mV))));
+	OUT.vCubePPos.y = -OUT.vCubePPos.y;
 	return OUT;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_reflect_cube_mrbase.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_reflect_cube_mrbase.ps
index f09890587896a6a261ba1a053315a74395601db9..f59f5717a9ba7a47b37d4274aa6cff9b742fa262 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_reflect_cube_mrbase.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_reflect_cube_mrbase.ps
@@ -7,36 +7,33 @@ mtrlgeom_reflect_cube_mrbase.vs
 #include <../struct.h>
 #include <../mtrl.h>
 
-sampler2D BaseTex:register(s0);
-sampler2D MRTex0:register(s6);
+//##########################################################################
 
-sampler2D ParamTex:register(s10);
-samplerCUBE ReflectTex:register(s12);
+sampler2D g_sColor:register(s0);
+sampler2D g_sNormals0:register(s6);
 
-half4 Param;
-half4 NearFarIsUnlit;
+sampler2D g_sParameters:register(s10);
+samplerCUBE g_sReflection:register(s12);
 
-ps_out_ds_mrt main(vs_out_refcube IN)
+//##########################################################################
+
+half4 g_vParam;
+half4 g_vNearFarLayers;
+
+//##########################################################################
+
+PSO_Gbuffer main(VSO_RefCube IN)
 {
-	ps_out_ds_mrt OUT; 
-	OUT.Color = tex2D(BaseTex,IN.TexUV);
-	
-	half3 NormalMicro = ((2.f * (tex2D(MRTex0, IN.TexUV).rgb)) - 1.f);
-	NormalMicro *= Param.z;
-	IN.Normal = normalize(IN.Normal);
-	half3 NormalPixel = normalize((IN.Normal+half3(NormalMicro.xy,IN.Normal.z)) * 0.5f);
+	IN.vNormal = normalize(IN.vNormal);
 	
-	OUT.Normal.xy = NormalEncode(NormalPixel);
-	OUT.Normal.w = NearFarIsUnlit.z;
-	OUT.Normal.z = NearFarIsUnlit.w;
+	half4 vColor = tex2D(g_sColor,IN.vTexUV);
+	half4 vParam = tex2D(g_sParameters,IN.vTexUV);
 	
-	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	//OUT.Param.w = NearFarIsUnlit.w;
+	half fLod = GetTexLod4Ref(saturate(vParam.r));
+	half4 vReflection = texCUBElod(g_sReflection, half4(IN.vCubePPos, fLod));
+	vColor.xyz = lerp(vColor.xyz, vReflection.xyz, vParam.y);
 	
-	half MipmapIndex = GetTexLod4Ref(saturate(OUT.Param.r - 0.1f));
-	half4 reflection = texCUBElod(ReflectTex, half4(IN.CubePPos,MipmapIndex));
-	OUT.Color.xyz = lerp(OUT.Color.xyz,reflection.xyz,OUT.Param.y);
-	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
+	half3 vNormal = MixNormalMicro(IN.vNormal, Color2Normal(tex2D(g_sNormals0, IN.vTexUV).rgb) * g_vParam.z);
 	
-	return OUT;
+	return CreateGbuffer(vColor, vNormal, vParam, IN.vPos, g_vNearFarLayers);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_water.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_water.ps
deleted file mode 100644
index 3b3ef866cbf754e20af43d49d97e2ff00113ab9a..0000000000000000000000000000000000000000
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_water.ps
+++ /dev/null
@@ -1,59 +0,0 @@
-
-/*
-mtrlgeom_water.ps
-Рендер воды (геометрии)
-*/
- 
-#include <../struct.h>
-#include <../mtrl.h>
-
-half2 WinSize;
-half4 Param;		
-//x - коэфициент смещения текстурных координат 
-//y - коэфициент прозрачности
-//z - коэфициент микрорельефа
-//w - коэфициент смешивания между отражением и основной текстурой (чем больше тем больше будет преобладать цвет основной текстуры, чем меньше тем больше будет преобладать цвет отражения)
-
-
-half4 NearFarIsUnlit;		//ближняя и дальнияя плоскости отсечения
-
-sampler2D BaseTex:register(s0);		//основная текстура
-sampler2D NormalTex:register(s6);	//карта нормалей
-sampler2D ParamTex:register(s10);	//параметры для освещения
-sampler2D DepthTex:register(s14);	//карта глубины
-
-ps_out_ds_mrt main(vs_out_water IN)
-{
-	ClipFar(IN.Pos.z,NearFarIsUnlit.y);
-	
-	ps_out_ds_mrt OUT;
-	IN.Normal = normalize(IN.Normal);
-	half Depth = IN.Pos.z;
-	half3 normal1 = 2.0f * tex2D(NormalTex, IN.Tex2.xy) - 1.0f;
-	half3 normal2 = 2.0f * tex2D(NormalTex, IN.Tex3.xy*0.5) - 1.0f;
-	normal1.z = IN.Normal.z;
-	normal2.z = IN.Normal.z;
-	normal1 *= Param.z;
-	normal2 *= Param.z;
-	half3 normal = normalize((normal1+normal2+IN.Normal));
-
-	half4 tmppsposnontr = mul(IN.Pos,MatrixRefraction);
-	half depth = tex2D(DepthTex, tmppsposnontr.xy/tmppsposnontr.w + half2(0.5/WinSize.x,0.5/WinSize.y)).r;
-	half intens = saturate(abs(((Depth/NearFarIsUnlit.y) - depth)*NearFarIsUnlit.y) / (Param.y * 100.f));
-
-	half4 colorbase = tex2D(BaseTex, IN.TexUV);
-
-	OUT.Color = colorbase;
-	OUT.Color.a = intens;
-	
-	OUT.Normal.xy = NormalEncode(normal);
-	OUT.Normal.w = NearFarIsUnlit.z;
-	OUT.Normal.z = NearFarIsUnlit.w;
-	
-	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	//OUT.Param.w = NearFarIsUnlit.w;
-	
-	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
-	
-	return OUT;
-}
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_water.vs b/build/gamesource/shaders/mtrlgeom/mtrlgeom_water.vs
index 5de01c738155c05cf2bc2c5fb48a3379782d012f..4c22fb0be19c04fa93e75d7e817d1751ea101b94 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_water.vs
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_water.vs
@@ -7,27 +7,34 @@ mtrlgeom_water.vs
 #include <../struct.h>
 #include <../mtrl.h>
 
-half4x4 WorldViewProjection;
-half2 TimeDelta;
-half4 Param;
-half4 PosCam;
-half4x4 World;	
+//##########################################################################
 
-vs_out_water main(vs_in_geom IN)
+half4x4 g_mWVP;
+half2 g_vTimeDelta;
+half4 g_vParam;
+half4 g_vPosCam;
+half4x4 g_mW;
+
+//##########################################################################
+
+VSO_WaterPlane main(VSI_Geometry IN)
 {
-	vs_out_water OUT;
-	OUT.Position = mul(half4(IN.Position,1.f),WorldViewProjection);
-	OUT.TexUV = IN.TexUV;
-	half4 WorldPos = mul(IN.Position,World);
-    OUT.ViewDir = PosCam - WorldPos;
-	OUT.Pos = OUT.Position;
+	VSO_WaterPlane OUT;
+	
+	OUT.vPosition = mul(half4(IN.vPosition,1.f),g_mWVP);
+	OUT.vTexUV = IN.vTexUV;
 	
-	OUT.Normal = mul(IN.Normal,World);
+	half4 WorldPos = mul(IN.vPosition,g_mW);
+    OUT.ViewDir = g_vPosCam - WorldPos;
+	OUT.vPos = OUT.vPosition;
+	
+	OUT.vNormal = mul(IN.vNormal,g_mW);
 
-	half2 tmptex = IN.TexUV * Param.z * 100.f;
-	OUT.Tex2.x = tmptex.x + sin(TimeDelta.x * Param.w*0.01)*Param.x;
-	OUT.Tex2.y = tmptex.y - cos(TimeDelta.x * Param.w*0.01)*Param.y;
-	OUT.Tex3.x = tmptex.x - sin(TimeDelta.x * Param.w*0.01)*Param.x;
-	OUT.Tex3.y = tmptex.y + cos(TimeDelta.x * Param.w*0.01)*Param.y;
+	half2 vTexUV = IN.vTexUV * g_vParam.z * 100.f;
+	OUT.vTexUV2.x = vTexUV.x + sin(g_vTimeDelta.x * g_vParam.w*0.01)*g_vParam.x;
+	OUT.vTexUV2.y = vTexUV.y - cos(g_vTimeDelta.x * g_vParam.w*0.01)*g_vParam.y;
+	OUT.vTexUV3.x = vTexUV.x - sin(g_vTimeDelta.x * g_vParam.w*0.01)*g_vParam.x;
+	OUT.vTexUV3.y = vTexUV.y + cos(g_vTimeDelta.x * g_vParam.w*0.01)*g_vParam.y;
+	
 	return OUT;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_water_opaque.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_water_opaque.ps
new file mode 100644
index 0000000000000000000000000000000000000000..42f294769be927d9837cf66572d7e3717e685c24
--- /dev/null
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_water_opaque.ps
@@ -0,0 +1,51 @@
+
+/*
+mtrlgeom_water_opaque.ps
+Рендер непрозрачной воды
+*/
+ 
+#include <../struct.h>
+#include <../mtrl.h>
+
+//##########################################################################
+
+half2 g_vWinSize;
+
+/*
+x - коэфициент смещения текстурных координат 
+z - коэфициент микрорельефа
+*/
+half4 g_vParam;		
+
+half4 g_vNearFarLayers;	
+
+//##########################################################################
+
+sampler2D g_sColor:register(s0);
+
+//!текстура DUDV смещений координат 
+sampler2D g_sDetails0:register(s2);
+sampler2D g_sNormals0:register(s6);
+sampler2D g_vParamTex:register(s10);
+sampler2D g_sDepth:register(s14);
+
+//##########################################################################
+
+PSO_Gbuffer main(VSO_WaterPlane IN)
+{
+	ClipFar(IN.vPos.z,g_vNearFarLayers.y);
+	
+	IN.vNormal = normalize(IN.vNormal);
+	half3 vNormal1 = Color2Normal(tex2D(g_sNormals0, IN.vTexUV2.xy).xyz) * g_vParam.z;
+	half3 vNormal2 = Color2Normal(tex2D(g_sNormals0, IN.vTexUV3.xy * 0.5).xyz) * g_vParam.z;
+	vNormal1.z = IN.vNormal.z;
+	vNormal2.z = IN.vNormal.z;
+	half3 vNormal = normalize(vNormal1+vNormal2+IN.vNormal);
+	
+	half3 vNormalOffset = normalize(Color2Normal(tex2D(g_sDetails0,IN.vTexUV2.xy)) + Color2Normal(tex2D(g_sDetails0,IN.Tex3.xy * 0.5)))*g_vParam.x;
+	
+	IN.vTexUV += vNormalOffset.xy*0.5;
+	half4 vColor = tex2D(g_sColor, IN.vTexUV);
+	
+	return CreateGbuffer(vColor, vNormal, tex2D(g_vParamTex,IN.vTexUV), IN.vPos, g_vNearFarLayers);
+}
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_water_reflect.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_water_reflect.ps
index fd55f7a01ebc72bdb4c185071011b5a6b3a796d3..31cdb81f7b989af5dc345e5c291cd075d5e2a145 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_water_reflect.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_water_reflect.ps
@@ -6,69 +6,75 @@ mtrlgeom_water_reflect.ps
 
 #include <../struct.h>
 #include <../mtrl.h>
+#include <../ps.h>
+
+//##########################################################################
  
-half2 WinSize;
-half4 Param;		
-//x - коэфициент смещения текстурных координат 
-//y - коэфициент прозрачности
-//z - коэфициент микрорельефа
-//w - коэфициент смешивания между отражением и основной текстурой (чем больше тем больше будет преобладать цвет основной текстуры, чем меньше тем больше будет преобладать цвет отражения)
+half2 g_vWinSize;
+
+/*
+x - коэфициент смещения текстурных координат 
+y - коэфициент прозрачности
+z - коэфициент микрорельефа
+w - коэфициент смешивания между отражением и основной текстурой (чем больше тем больше будет преобладать цвет основной текстуры, чем меньше тем больше будет преобладать цвет отражения)
+*/
+half4 g_vParam;	
+
+half3 g_vPosCam;
+half4 g_vNearFarLayers;
+
+//##########################################################################
 
-half4 NearFarIsUnlit;
+sampler2D g_sColor:register(s0);
 
-sampler2D BaseTex:register(s0);		//основная текстура
-sampler2D DUDVTex:register(s2);		//текстура смещений координат
-sampler2D NormalTex:register(s6);	//текстура нормалей
-sampler2D ParamTex:register(s10);	//параметры для освещения
-sampler2D ReflectTex:register(s12);	//текстура отражений того что над водой, рефлексия
-sampler2D DepthTex:register(s14);	//текстура глубины
+//!текстура DUDV смещений координат 
+sampler2D g_sDetails0:register(s2);		
 
-ps_out_ds_mrt main(vs_out_water IN)
+//! текстура каустики
+sampler2D g_sDetails1:register(s3);
+
+sampler2D g_sNormals0:register(s6);
+sampler2D g_sParameters:register(s10);
+sampler2D g_sReflection:register(s12);
+sampler2D g_sDepth:register(s14);
+
+//##########################################################################
+
+PSO_Gbuffer main(VSO_WaterPlane IN)
 {	
-	ClipFar(IN.Pos.z,NearFarIsUnlit.y);
-	
-	ps_out_ds_mrt OUT;
-	
-	IN.Normal = normalize(IN.Normal);
-	half3 normal1 = 2.0f * tex2D(NormalTex, IN.Tex2.xy) - 1.0f;
-	half3 normal2 = 2.0f * tex2D(NormalTex, IN.Tex3.xy*0.5) - 1.0f;
-	normal1.z = IN.Normal.z;
-	normal2.z = IN.Normal.z;
-	normal1 *= Param.z;
-	normal2 *= Param.z;
-	half3 normal = normalize((normal1+normal2+IN.Normal));
+	ClipFar(IN.vPos.z,g_vNearFarLayers.y);
 	
-	OUT.Normal.xy = NormalEncode(normal);
-	OUT.Normal.w = NearFarIsUnlit.z;
-	OUT.Normal.z = NearFarIsUnlit.w;
+	IN.vNormal = normalize(IN.vNormal);
+	half3 vNormal1 = Color2Normal(tex2D(g_sNormals0, IN.vTexUV2.xy).xyz) * g_vParam.z;
+	half3 vNormal2 = Color2Normal(tex2D(g_sNormals0, IN.vTexUV3.xy * 0.5).xyz) * g_vParam.z;
+	vNormal1.z = IN.vNormal.z;
+	vNormal2.z = IN.vNormal.z;
+	half3 vNormal = normalize(vNormal1+vNormal2+IN.vNormal);
 	
-	half3 tc_offset = 2.0f * tex2D(DUDVTex,IN.Tex2.xy) - 1.0f;
-	half3 tc_offset2= 2.0f * tex2D(DUDVTex,IN.Tex3.xy*0.5) - 1.0f;
-	half3 normaloffset = normalize(tc_offset+tc_offset2)*Param.x;
+	half3 vNormalOffset = normalize(Color2Normal(tex2D(g_sDetails1,IN.vTexUV2.xy)) + Color2Normal(tex2D(g_sDetails1,IN.vTexUV3.xy * 0.5)))*g_vParam.x;
 
-	half4 TexUVRefractProj = mul(IN.Pos,MatrixRefraction);
-	half depth = tex2D(DepthTex, TexUVRefractProj.xy/TexUVRefractProj.w + half2(0.5f/WinSize.x,0.5f/WinSize.y)).r;
-	half intens = saturate(abs(((IN.Pos.z/NearFarIsUnlit.y) - depth)*NearFarIsUnlit.y) / (Param.y * 100.f));
+	half4 vTexUVRefractProj = mul(IN.vPos, MatrixRefraction);
+	half fDepth = tex2D(g_sDepth, vTexUVRefractProj.xy/vTexUVRefractProj.w + half2(0.5/g_vWinSize.x,0.5/g_vWinSize.y)).r;
+	half fTransparency = saturate(abs(((IN.vPos.z/g_vNearFarLayers.y) - fDepth)*g_vNearFarLayers.y) / (g_vParam.y * 100.0));
 	
-	normaloffset *= intens;
+	vNormalOffset *= fTransparency;
 	
-	half4 tpos = IN.Pos;
-	tpos.xyz += normaloffset;
-	IN.TexUV += normaloffset.xy*0.1f;
-	half4 colorbase = tex2D(BaseTex, IN.TexUV);
+	IN.vTexUV += vNormalOffset.xy*0.5;
+	half4 vColor = tex2D(g_sColor, IN.vTexUV);
 	
-	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	//OUT.Param.w = NearFarIsUnlit.w;
+	half4 vParam = tex2D(g_sParameters,IN.vTexUV);
 	
-	half MipmapIndex = lerp(0.f, MTRL_REF_LOD_COUNT, saturate(OUT.Param.r - 0.1f));
-	half4 TexUVReflectProj = mul(tpos,MatrixReflection);
-	half4 reflection = tex2Dlod(ReflectTex, half4(TexUVReflectProj.xy/TexUVReflectProj.w,0,MipmapIndex));
-	colorbase = lerp(reflection,colorbase,Param.w);
+	half fLodReflection = GetTexLod4Ref(saturate(vParam.r - 0.1));
 	
-	OUT.Color.rgb = colorbase.rgb;
-	OUT.Color.a = intens;
+	half4 vPos4Ref = IN.vPos;
+	vPos4Ref.xyz += vNormalOffset;
+	half4 vTexUVReflectProj = mul(vPos4Ref,MatrixReflection);
+	half4 vReflection = tex2Dlod2(g_sReflection, vTexUVReflectProj.xy/vTexUVReflectProj.w, fLodReflection);
+	vColor = lerp(vReflection, vColor, g_vParam.w);
+	vColor.a = fTransparency;
 	
-	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
+	//half caustic = (tex2D(DetTex2, IN.vTexUV2.xy*0.5).r + tex2D(DetTex2, IN.vTexUV3.xy*2).r) * 0.5;
+	//vColor.rgba = lerp(vColor.rgba, half4(0.9,0.8,0.7, saturate(fTransparency * 4)), clamp(pow(saturate(1.f - (caustic)), 2), 0, 0.4) * (1.0 - fTransparency));
 	
-	return OUT;
+	return CreateGbuffer(vColor, vNormal, vParam, IN.vPos, g_vNearFarLayers);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlgreen/mtrlgreen_base.ps b/build/gamesource/shaders/mtrlgreen/mtrlgreen_base.ps
index 0f580b0dd851687eb8adc4f66b955c59533dacad..8e6753e0a1d662f92379c2242722fc27c4e3bad4 100644
--- a/build/gamesource/shaders/mtrlgreen/mtrlgreen_base.ps
+++ b/build/gamesource/shaders/mtrlgreen/mtrlgreen_base.ps
@@ -6,28 +6,23 @@ mtrlgreen_base.ps
 
 #include <../struct.h>
 #include <../mtrl.h>
+#include <../green.h>
 
-sampler2D BaseTex:register(s0);
-sampler2D ParamTex:register(s10);
+//##########################################################################
 
-half4 NearFarIsUnlit;
+sampler2D g_sColor:register(s0);
+sampler2D g_sParameters:register(s10);
 
-ps_out_ds_mrt main(vs_out_gcommon IN)
+//##########################################################################
+
+half4 g_vNearFarLayers;
+
+//##########################################################################
+
+PSO_Gbuffer main(VSO_SceneCommon IN)
 {
-	ClipFar(IN.Pos.z,NearFarIsUnlit.y);
-	ps_out_ds_mrt OUT; 
-	OUT.Color = tex2D(BaseTex,IN.TexUV);
-	clip(OUT.Color.a - GREEN_ALPHATEST_VALUE);
-	OUT.Color.a = 1.f;
-
-	OUT.Normal.xy = NormalEncode(IN.Normal);
-	OUT.Normal.w = NearFarIsUnlit.z;
-	OUT.Normal.z = NearFarIsUnlit.w;
-	
-	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	//OUT.Param.w = NearFarIsUnlit.w;
-	
-	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
+	ClipFar(IN.vPos.z,g_vNearFarLayers.y);
 	
-	return OUT;
+	half4 vColor = GreenAlphaTest(tex2D(g_sColor,IN.vTexUV));
+	return CreateGbuffer(vColor, IN.vNormal, tex2D(g_sParameters,IN.vTexUV), IN.vPos, g_vNearFarLayers);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlgreen/mtrlgreen_grass_base.vs b/build/gamesource/shaders/mtrlgreen/mtrlgreen_grass_base.vs
index 0ffd8cdd2605d74c982cc74c815bf30d7e9beb45..01b262721bb58aee39e5421645c0e3f8a68dba04 100644
--- a/build/gamesource/shaders/mtrlgreen/mtrlgreen_grass_base.vs
+++ b/build/gamesource/shaders/mtrlgreen/mtrlgreen_grass_base.vs
@@ -7,29 +7,33 @@ mtrlgreen_grass_base.ps
 #include <../struct.h>
 #include <../green.h>
 
-half4x4 WorldViewProjection;
+//##########################################################################
 
-half2 DistBeginEndLessening : register(GREEN_R_LESSENING);
-half3 ViewPos : register(GREEN_R_VIEWPOS);
-half4 BSphere : register(GREEN_R_BSPHERE);
-half3 BBMax : register(GREEN_R_BBMAX);
-half3 BBMin : register(GREEN_R_BBMIN);
+half4x4 g_mWVP;
 
-void main(in vs_in_green IN, out vs_out_gcommon OUT) 
+half2 g_vDistLessening	: register(GREEN_R_LESSENING);
+half3 g_vViewPos		: register(GREEN_R_VIEWPOS);
+half4 g_vBoundSphere	: register(GREEN_R_BSPHERE);
+half3 g_vBoundMax		: register(GREEN_R_BBMAX);
+half3 g_vBoundMin		: register(GREEN_R_BBMIN);
+
+//##########################################################################
+
+void main(in VSI_Green IN, out VSO_SceneCommon OUT) 
 {
-	OUT.Normal = GreenComRotation(IN.Normal,IN.InstanceSinCosRot);
+	OUT.vNormal = GreenComRotation(IN.vNormal, IN.vInstSinCosRot);
 	
-	OUT.Position = GreenTransformPos(
-						GreenComRotation(IN.Position,IN.InstanceSinCosRot),
-						IN.InstanceTrans.x,
-						GrassComMultiplier(IN.InstancePos,ViewPos,DistBeginEndLessening),
-						IN.InstancePos
+	OUT.vPosition = GreenTransformPos(
+						GreenComRotation(IN.vPosition, IN.vInstSinCosRot),
+						IN.vInstTrans.x,
+						GrassComMultiplier(IN.vInstPos, g_vViewPos, g_vDistLessening),
+						IN.vInstPos
 					);
 		
-	OUT.Position = mul(OUT.Position, WorldViewProjection);
+	OUT.vPosition = mul(OUT.vPosition, g_mWVP);
 	
-	OUT.Pos = OUT.Position;
-	OUT.Pos.w = length(BSphere.xyz - IN.Position.xyz)/BSphere.w;
-	OUT.Pos.w *= OUT.Pos.w;
-	OUT.TexUV = IN.TexUV;
+	OUT.vPos = OUT.vPosition;
+	OUT.vPos.w = length(g_vBoundSphere.xyz - IN.vPosition.xyz) / g_vBoundSphere.w;
+	OUT.vPos.w *= OUT.vPos.w;
+	OUT.vTexUV = IN.vTexUV;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlgreen/mtrlgreen_mrbase.ps b/build/gamesource/shaders/mtrlgreen/mtrlgreen_mrbase.ps
index 84a700d0aca09d026a37e4f9e65bf00205918c8a..1025a6e625ad7a6d74144a8e9db87b208698cf7e 100644
--- a/build/gamesource/shaders/mtrlgreen/mtrlgreen_mrbase.ps
+++ b/build/gamesource/shaders/mtrlgreen/mtrlgreen_mrbase.ps
@@ -6,34 +6,26 @@ mtrlgreen_mrbase.ps
 
 #include <../struct.h>
 #include <../mtrl.h>
+#include <../green.h>
 
-sampler2D BaseTex:register(s0);
-sampler2D MRTex:register(s6);
-sampler2D ParamTex:register(s10);
+//##########################################################################
 
-half4 Param;
-half4 NearFarIsUnlit;
+sampler2D g_sColor:register(s0);
+sampler2D g_sNormals0:register(s6);
+sampler2D g_sParameters:register(s10);
 
-ps_out_ds_mrt main(vs_out_gcommon IN)
+//##########################################################################
+
+half4 g_vParam;
+half4 g_vNearFarLayers;
+
+//##########################################################################
+
+PSO_Gbuffer main(VSO_SceneCommon IN)
 {
-	ClipFar(IN.Pos.z,NearFarIsUnlit.y);
-	ps_out_ds_mrt OUT; 
-	OUT.Color = tex2D(BaseTex,IN.TexUV);
-	clip(OUT.Color.a - GREEN_ALPHATEST_VALUE);
-	OUT.Color.a = 1.f;
-	
-	half3 NormalMicro = ((2.f * (tex2D(MRTex, IN.TexUV).rgb)) - 1.f);
-	NormalMicro *= Param.z;
-	half3 NormalPixel = normalize((IN.Normal+half3(NormalMicro.xy,IN.Normal.z)) * 0.5f);
-	
-	OUT.Normal.xy = NormalEncode(NormalPixel);
-	OUT.Normal.w = NearFarIsUnlit.z;
-	OUT.Normal.z = NearFarIsUnlit.w;
-	
-	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	//OUT.Param.w = NearFarIsUnlit.w;
-	
-	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
+	ClipFar(IN.vPos.z,g_vNearFarLayers.y);
 	
-	return OUT;
+	half4 vColor = GreenAlphaTest(tex2D(g_sColor,IN.vTexUV));
+	half3 vNormal = MixNormalMicro(IN.vNormal, Color2Normal(tex2D(g_sNormals0, IN.vTexUV).xyz) * g_vParam.z);
+	return CreateGbuffer(vColor, vNormal, tex2D(g_sParameters,IN.vTexUV), IN.vPos, g_vNearFarLayers);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlgreen/mtrlgreen_tree_base.vs b/build/gamesource/shaders/mtrlgreen/mtrlgreen_tree_base.vs
index 52023934057b5ca84971353d83375210e58cde8b..b7d370d95d8858f2c8a5bedb45061e3853e17093 100644
--- a/build/gamesource/shaders/mtrlgreen/mtrlgreen_tree_base.vs
+++ b/build/gamesource/shaders/mtrlgreen/mtrlgreen_tree_base.vs
@@ -7,22 +7,26 @@ mtrlgreen_tree_base.ps
 #include <../struct.h>
 #include <../green.h>
 
-half4x4 WorldViewProjection;
+//##########################################################################
 
-void main(in vs_in_green IN, out vs_out_gcommon OUT) 
+half4x4 g_mWVP;
+
+//##########################################################################
+
+void main(in VSI_Green IN, out VSO_SceneCommon OUT) 
 {
-	OUT.Normal = (GreenComRotation(IN.Normal,IN.InstanceSinCosRot));
+	OUT.vNormal = (GreenComRotation(IN.vNormal,IN.vInstSinCosRot));
 	
-	OUT.Position = GreenTransformPos(
-						GreenComRotation(IN.Position,IN.InstanceSinCosRot),
-						IN.InstanceTrans.x,
+	OUT.vPosition = GreenTransformPos(
+						GreenComRotation(IN.vPosition,IN.vInstSinCosRot),
+						IN.vInstTrans.x,
 						1,
-						IN.InstancePos
+						IN.vInstPos
 					);
 	
-	OUT.Position = mul(OUT.Position, WorldViewProjection);
+	OUT.vPosition = mul(OUT.vPosition, g_mWVP);
 	
-	OUT.Pos = OUT.Position;
+	OUT.vPos = OUT.vPosition;
 	
-	OUT.TexUV = IN.TexUV;
+	OUT.vTexUV = IN.vTexUV;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlskin/mtrlskin_base.ps b/build/gamesource/shaders/mtrlskin/mtrlskin_base.ps
index 4d3c6d20d811b82ce2ea14e2421c7946d72f0757..3c2ce1fd1ba5884bf752dbc4f29f10ca4b5d761a 100644
--- a/build/gamesource/shaders/mtrlskin/mtrlskin_base.ps
+++ b/build/gamesource/shaders/mtrlskin/mtrlskin_base.ps
@@ -7,27 +7,20 @@ mtrlskin_base.ps
 #include <../struct.h>
 #include <../mtrl.h>
 
-sampler2D BaseTex:register(s0);
-sampler2D ParamTex:register(s10);
+//##########################################################################
 
-half4 NearFarIsUnlit;
+sampler2D g_sColor:register(s0);
+sampler2D g_sParameters:register(s10);
 
-ps_out_ds_mrt main(vs_out_gcommon IN)
+//##########################################################################
+
+half4 g_vNearFarLayers;
+
+//##########################################################################
+
+PSO_Gbuffer main(VSO_SceneCommon IN)
 {
-	ClipFar(IN.Pos.z,NearFarIsUnlit.y);
-	ps_out_ds_mrt OUT; 
-	OUT.Color = tex2D(BaseTex,IN.TexUV);
-	
-	half3 NormalPixel = normalize(IN.Normal);
-	
-	OUT.Normal.xyz = NormalEncode(NormalPixel);
-	OUT.Normal.w = NearFarIsUnlit.z;
-	OUT.Normal.z = NearFarIsUnlit.w;
-	
-	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	//OUT.Param.w = NearFarIsUnlit.w;
-	
-	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
+	ClipFar(IN.vPos.z,g_vNearFarLayers.y);
 	
-	return OUT;
+	return CreateGbuffer(tex2D(g_sColor,IN.vTexUV), normalize(IN.vNormal), tex2D(g_sParameters,IN.vTexUV), IN.vPos, g_vNearFarLayers);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrlskin/mtrlskin_base.vs b/build/gamesource/shaders/mtrlskin/mtrlskin_base.vs
index ea943f8d270ddd57a2f5f8962e4bd0650793317b..61eafbbd4d5cd3971af3b4a769b8a931d37a7058 100644
--- a/build/gamesource/shaders/mtrlskin/mtrlskin_base.vs
+++ b/build/gamesource/shaders/mtrlskin/mtrlskin_base.vs
@@ -7,18 +7,22 @@ mtrlskin_base.vs
 #include <../struct.h>
 #include <../skin.h>
 
-half4x4	WorldViewProjection;
-half4x4	World;
+//##########################################################################
 
-vs_out_gcommon main(vs_in_anim input)
+half4x4	g_mWVP;
+half4x4	g_mW;
+
+//##########################################################################
+
+VSO_SceneCommon main(VSI_Animation IN)
 {
-	vs_out_gcommon Output = SkinAllTransform(input);
+	VSO_SceneCommon OUT = SkinAllTransform(IN);
 	
-	Output.Position = mul(Output.Position, WorldViewProjection);
-	Output.Normal = mul(Output.Normal, World);
-	Output.TexUV = input.Tex;
+	OUT.vPosition = mul(OUT.vPosition, g_mWVP);
+	OUT.vNormal = mul(OUT.vNormal, g_mW);
+	OUT.vTexUV = IN.vTexUV;
 	
-	Output.Pos = Output.Position;
+	OUT.vPos = OUT.vPosition;
     
-	return(Output);
+	return(OUT);
 }
diff --git a/build/gamesource/shaders/mtrlskin/mtrlskin_mrbase.ps b/build/gamesource/shaders/mtrlskin/mtrlskin_mrbase.ps
index da669290248943fe10c6cb474a2c7503f104e2ae..dcbb0480c2bab8d6b5f1dfd502ca97bef6101657 100644
--- a/build/gamesource/shaders/mtrlskin/mtrlskin_mrbase.ps
+++ b/build/gamesource/shaders/mtrlskin/mtrlskin_mrbase.ps
@@ -7,32 +7,23 @@ mtrlskin_mrbase.ps
 #include <../struct.h>
 #include <../mtrl.h>
 
-sampler2D BaseTex:register(s0);
-sampler2D MRTex:register(s6);
-sampler2D ParamTex:register(s10);
+//##########################################################################
 
-half4 Param;
-half4 NearFarIsUnlit;
+sampler2D g_sColor:register(s0);
+sampler2D g_sNormals0:register(s6);
+sampler2D g_sParameters:register(s10);
 
-ps_out_ds_mrt main(vs_out_gcommon IN)
+//##########################################################################
+
+half4 g_vParam;
+half4 g_vNearFarLayers;
+
+//##########################################################################
+
+PSO_Gbuffer main(VSO_SceneCommon IN)
 {
-	ClipFar(IN.Pos.z,NearFarIsUnlit.y);
-	ps_out_ds_mrt OUT; 
-	OUT.Color = tex2D(BaseTex,IN.TexUV);
-	
-	IN.Normal = normalize(IN.Normal);
-	half3 NormalMicro = ((2.f * (tex2D(MRTex, IN.TexUV).rgb)) - 1.f);
-	NormalMicro *= Param.z;
-	half3 NormalPixel = normalize((IN.Normal+half3(NormalMicro.xy,IN.Normal.z)) * 0.5f);
-	
-	OUT.Normal.xyz = NormalEncode(NormalPixel);
-	OUT.Normal.w = NearFarIsUnlit.z;
-	OUT.Normal.z = NearFarIsUnlit.w;
-	
-	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	//OUT.Param.w = NearFarIsUnlit.w;
-	
-	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
-	
-	return OUT;
+	ClipFar(IN.vPos.z,g_vNearFarLayers.y);
+
+	half3 vNormal = MixNormalMicro(normalize(IN.vNormal), Color2Normal(tex2D(g_sNormals0, IN.vTexUV).xyz) * g_vParam.z);
+	return CreateGbuffer(tex2D(g_sColor,IN.vTexUV), normalize(IN.vNormal), tex2D(g_sParameters,IN.vTexUV), IN.vPos, g_vNearFarLayers);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/particles/particles_main.ps b/build/gamesource/shaders/particles/particles_main.ps
index 4a79fcf00ce242cc84e89ed938e28b873a2487d8..55e49bd9d8424b77ae1d29fa313100370eb3d08d 100644
--- a/build/gamesource/shaders/particles/particles_main.ps
+++ b/build/gamesource/shaders/particles/particles_main.ps
@@ -7,31 +7,37 @@ particles_main.ps
 #include <../struct.h>
 #include <../mtrl.h>
 
+//##########################################################################
+
 sampler2D BaseSampler:register(s0);
 sampler2D DepthSampler:register(s1);
 sampler2D SceneSampler:register(s2);
 
+//##########################################################################
+
 half RefractCoef;
 half SoftCoef;
 half ColorCoef;
 half4 Color;
 half2 NearFar;
 
-half4 main(vs_out_particles IN):COLOR0
+//##########################################################################
+
+half4 main(VSO_Particles IN):COLOR0
 {
-	half4 color = tex2D(BaseSampler,IN.TexUV);
+	half4 color = tex2D(BaseSampler,IN.vTexUV);
 	color.rgb = lerp(color.rgb, Color.rgb, Color.a);
 	color.rgb *= ColorCoef;
 	color.a *= IN.Alpha.x;
 	#if defined(PART_SOFT) || defined(PART_REFRACTION)
-	half2 texuv = IN.Pos.xy / IN.Pos.w;
+	half2 texuv = IN.vPos.xy / IN.vPos.w;
 	texuv.x = texuv.x * 0.5f + 0.5f;
 	texuv.y = texuv.y * (-0.5f) + 0.5f;
 	#endif
 	
 	#if defined(PART_SOFT)
 	half depthmap = tex2D(DepthSampler,texuv).r;
-	half curdepth = IN.Pos.z / NearFar.y;
+	half curdepth = IN.vPos.z / NearFar.y;
 	
 	color.a *= saturate((depthmap - curdepth)*NearFar.y)*SoftCoef;
 	#endif
diff --git a/build/gamesource/shaders/particles/particles_main.vs b/build/gamesource/shaders/particles/particles_main.vs
index f26343a555d816d5523a93563f295698ff95f152..b3b78789212e812e86fc414fced8bbbae79c10d4 100644
--- a/build/gamesource/shaders/particles/particles_main.vs
+++ b/build/gamesource/shaders/particles/particles_main.vs
@@ -6,31 +6,35 @@ particles_main.vs
 
 #include <../struct.h>
 
+//##########################################################################
+
 half4x4 ViewProjection;
 half4x4 WorldViewProjection;
 half4x4 CamRot;
 
 half3 PosCam;
 
-void main(in vs_in_particles IN, out vs_out_particles OUT) 
+//##########################################################################
+
+void main(in VSI_Particles IN, out VSO_Particles OUT) 
 {
 	half2 tvec;
-	tvec.x = IN.Position.x * IN.InstanceRot1.y + IN.Position.y * IN.InstanceRot1.x;
-	tvec.y = -IN.Position.x * IN.InstanceRot1.x + IN.Position.y * IN.InstanceRot1.y;
-	IN.Position.xy = tvec;
+	tvec.x = IN.vPosition.x * IN.vInstRot1.y + IN.vPosition.y * IN.vInstRot1.x;
+	tvec.y = -IN.vPosition.x * IN.vInstRot1.x + IN.vPosition.y * IN.vInstRot1.y;
+	IN.vPosition.xy = tvec;
 	
-	IN.Position.xyz *= IN.InstanceSize;
+	IN.vPosition.xyz *= IN.vInstSize;
 	
-	IN.Position = mul(IN.Position, CamRot);
+	IN.vPosition = mul(IN.vPosition, CamRot);
 	
-	OUT.Position.xyz = IN.Position + IN.InstancePos;
-	OUT.Position.w = 1.f;
+	OUT.vPosition.xyz = IN.vPosition + IN.vInstPos;
+	OUT.vPosition.w = 1.f;
 	
-	OUT.Alpha = IN.InstanceAlpha;
-	OUT.Light = IN.InstanceLight;
+	OUT.Alpha = IN.vInstAlpha;
+	OUT.Light = IN.vInstLight;
 	
-	OUT.Position = mul(OUT.Position, WorldViewProjection);
-	OUT.Pos = OUT.Position;
-	OUT.TexUV2 = IN.TexUV;
-	OUT.TexUV = (IN.TexUV * IN.InstanceTex.xy)+IN.InstanceTex.zw;
+	OUT.vPosition = mul(OUT.vPosition, WorldViewProjection);
+	OUT.vPos = OUT.vPosition;
+	OUT.vTexUV2 = IN.vTexUV;
+	OUT.vTexUV = (IN.vTexUV * IN.vInstTex.xy)+IN.vInstTex.zw;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/particles/particles_track.ps b/build/gamesource/shaders/particles/particles_track.ps
index 2b3a92532e4f2490d5c6cd5eea59243dbf6a6f1b..fc3ab5d0a3527bd040122de320a83738af172d22 100644
--- a/build/gamesource/shaders/particles/particles_track.ps
+++ b/build/gamesource/shaders/particles/particles_track.ps
@@ -6,14 +6,20 @@ particles_main.ps
 
 #include <../struct.h>
 
+//##########################################################################
+
 sampler2D BaseSampler:register(s0);
 
+//##########################################################################
+
 half ColorCoef;
 half4 Color;
 
-half4 main(vs_out_particles IN):COLOR0
+//##########################################################################
+
+half4 main(VSO_Particles IN):COLOR0
 {
-	half4 color = tex2D(BaseSampler,IN.TexUV);
+	half4 color = tex2D(BaseSampler,IN.vTexUV);
 	color.rgb = lerp(color.rgb, Color.rgb, Color.a);
 	color.rgb *= ColorCoef;
 	color.a *= IN.Alpha.x;
diff --git a/build/gamesource/shaders/particles/particles_track.vs b/build/gamesource/shaders/particles/particles_track.vs
index 7a5aaeb4b049c43dbf446d067608694fc3b1afce..39a86beecf82df1fd1d8b75a5246f5a429e48a11 100644
--- a/build/gamesource/shaders/particles/particles_track.vs
+++ b/build/gamesource/shaders/particles/particles_track.vs
@@ -6,8 +6,12 @@ particles_main.vs
 
 #include <../struct.h>
 
+//##########################################################################
+
 half4x4 WorldViewProjection;
 
+//##########################################################################
+
 half3 RotateVec(half4 q, half3 p)
 {
 	half xxzz = q.x*q.x - q.z*q.z;
@@ -24,16 +28,18 @@ half3 RotateVec(half4 q, half3 p)
 	return(oout);
 }
 
-void main(in vs_in_particles IN, out vs_out_particles OUT) 
+//##########################################################################
+
+void main(in VSI_Particles IN, out VSO_Particles OUT) 
 {
 	half2 tvec;
-	IN.Position.xyz *= IN.InstanceSize;
-	IN.Position.xyz = RotateVec(IN.InstanceTex,IN.Position.xyz);
-	OUT.Position.xyz = IN.Position + IN.InstancePos;
-	OUT.Position.w = 1.f;
+	IN.vPosition.xyz *= IN.vInstSize;
+	IN.vPosition.xyz = RotateVec(IN.vInstTex,IN.vPosition.xyz);
+	OUT.vPosition.xyz = IN.vPosition + IN.vInstPos;
+	OUT.vPosition.w = 1.f;
 	
-	OUT.Position = mul(OUT.Position, WorldViewProjection);
-	OUT.Pos = OUT.Position;
-	OUT.TexUV = IN.TexUV;
-	OUT.Alpha = IN.InstanceAlpha;
+	OUT.vPosition = mul(OUT.vPosition, WorldViewProjection);
+	OUT.vPos = OUT.vPosition;
+	OUT.vTexUV = IN.vTexUV;
+	OUT.Alpha = IN.vInstAlpha;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/pp/pp_alpha_stencil_mark.ps b/build/gamesource/shaders/pp/pp_alpha_stencil_mark.ps
index 782827e938d82dccff8bc3318c2c9423af2cb2c8..77dfa75707dedb2909667aec4e84770b4faede80 100644
--- a/build/gamesource/shaders/pp/pp_alpha_stencil_mark.ps
+++ b/build/gamesource/shaders/pp/pp_alpha_stencil_mark.ps
@@ -1,25 +1,29 @@
 
 #include <../struct.h>
 
-half2 WinSize;
+//##########################################################################
 
-half4 main(vs_out_pp IN):COLOR0
+half2 g_vWinSize;
+
+//##########################################################################
+
+half4 main(VSO_PP IN):COLOR0
 {
 	#if defined(_COLUMN_)
-	if(frac(IN.TexUV.y*WinSize.y*0.5f) >= 0.5f)
+	if(frac(IN.vTexUV.y * g_vWinSize.y * 0.5) >= 0.5)
 		clip(-1);
 
-	clip(frac(IN.TexUV.x*WinSize.x*0.5f) - 0.5f);
+	clip(frac(IN.vTexUV.x * g_vWinSize.x * 0.5) - 0.5);
 	
 	#elif defined(_STR_)
-	clip(frac(IN.TexUV.y*WinSize.y*0.5f) - 0.5f);
+	clip(frac(IN.vTexUV.y * g_vWinSize.y * 0.5) - 0.5);
 	
-	[branch]if(frac(IN.TexUV.x*WinSize.x*0.5f) >= 0.5f)
+	[branch]if(frac(IN.vTexUV.x*g_vWinSize.x*0.5) >= 0.5)
 		clip(-1);
 	
 	#elif defined(_COLUMN_STR_)
-	clip(frac(IN.TexUV.y*WinSize.y*0.5f) - 0.5f);
-	clip(frac(IN.TexUV.x*WinSize.x*0.5f) - 0.5f);
+	clip(frac(IN.vTexUV.y * g_vWinSize.y * 0.5) - 0.5);
+	clip(frac(IN.vTexUV.x * g_vWinSize.x * 0.5) - 0.5);
 	
 	#else
 	#error unexpected operation
diff --git a/build/gamesource/shaders/pp/pp_blur_depth_based.ps b/build/gamesource/shaders/pp/pp_blur_depth_based.ps
index 5f139562e004d8793469d148ef26be0907300566..2239d7fa55d00ef819251a8c2c396cc193c0e5ae 100644
--- a/build/gamesource/shaders/pp/pp_blur_depth_based.ps
+++ b/build/gamesource/shaders/pp/pp_blur_depth_based.ps
@@ -7,37 +7,43 @@ pp_blur_depth_based.ps
 #include <../struct.h>
 #include <../mtrl.h>
 
-half4 PixelSize;
-half2 NearFar;
-sampler2D DepthMap:register(s0);
-sampler2D BlurMap:register(s1);
+//##########################################################################
 
-half4 main(vs_out_pp IN) : COLOR0
+sampler2D g_sDepth:register(s0);
+sampler2D g_sBlur:register(s1);
+
+//##########################################################################
+
+half4 g_vPixelSize;
+half2 g_vNearFar;
+
+//##########################################################################
+
+half4 main(VSO_PP IN) : COLOR0
 {
-	half2 BlurOffset = PixelSize;
-	half2 CenterTC = IN.TexUV;
+	half2 vCenterTC = IN.vTexUV;
 
-	half SumWeight = 0.125f;
-	half4 Color = tex2D(BlurMap,CenterTC) * SumWeight;
+	half fSumWeight = 0.125f;
+	half4 vColor = tex2D(g_sBlur, vCenterTC) * fSumWeight;
 
-	half CenterDepth = tex2D(DepthMap, CenterTC).r * NearFar.y;
+	half vCenterDepth = tex2D(g_sDepth, vCenterTC).r * g_vNearFar.y;
 
+	[unroll]
+	for(half x=-1; x<=1; x++)
+	{
 		[unroll]
-		for(half x=-1;x<=1;x++)
+		for(half y=-1; y<=1; y++)
 		{
-				[unroll]
-				for(half y=-1;y<=1;y++)
-				{
-					half2 SampleTC = CenterTC + half2(x * PixelSize.x,y * PixelSize.y);
-					half Depth = tex2D(DepthMap, SampleTC).r;
-					Depth *= NearFar.y;
-					half Diff = 9.0f*(1.0f - Depth/CenterDepth);
-					half Weight = saturate(0.5 - 0.75f*abs(Diff) - 0.25f*(Diff));
-					Color += tex2D(BlurMap,SampleTC) * Weight;
-					SumWeight += Weight;
-				}
+			half2 vSampleTC = vCenterTC + half2(x * g_vPixelSize.x,y * g_vPixelSize.y);
+			half fDepth = tex2D(g_sDepth, vSampleTC).r;
+			fDepth *= g_vNearFar.y;
+			half fDiff = 9.0f*(1.0f - fDepth/vCenterDepth);
+			half fWeight = saturate(0.5 - 0.75f*abs(fDiff) - 0.25f*(fDiff));
+			vColor += tex2D(g_sBlur, vSampleTC) * fWeight;
+			fSumWeight += fWeight;
 		}
+	}
 
-	Color /= SumWeight;
-	return Color;
+	vColor /= fSumWeight;
+	return vColor;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/pp/pp_blur_depth_based_noise.ps b/build/gamesource/shaders/pp/pp_blur_depth_based_noise.ps
index ba711c9e9134378fe6a99839a4ffd194da99db4e..84bce5b70a0f16829af22d64e1db8452af2ce4b4 100644
--- a/build/gamesource/shaders/pp/pp_blur_depth_based_noise.ps
+++ b/build/gamesource/shaders/pp/pp_blur_depth_based_noise.ps
@@ -7,48 +7,50 @@ pp_blur_depth_based_noise.ps
 #include <../struct.h>
 #include <../mtrl.h>
 
-half4 PixelSize;
+//##########################################################################
 
-sampler2D DepthMap:register(s0);
-sampler2D BlurMap:register(s1);
-sampler2D NoiseSampler:register(s2);
+half4 g_vPixelSize;
+half2 g_vNearFar;
 
-half2 NearFar;
+//##########################################################################
 
-half4 main(vs_out_pp IN) : COLOR0
+sampler2D g_sDepth:register(s0);
+sampler2D g_sBlur:register(s1);
+sampler2D g_sNoise:register(s2);
+
+//##########################################################################
+
+half4 main(VSO_PP IN) : COLOR0
 {
-	half2 jitter = ((tex2D( NoiseSampler , IN.TexUV.xy * 256.0f).xy * 2.0f - 1.0f )*PixelSize);
+	half2 vJitter = ((tex2D(g_sNoise , IN.vTexUV.xy * 256.0).xy * 2.0 - 1.0) * g_vPixelSize);
   
-	half4 Color = tex2D(BlurMap,IN.TexUV);
-	half CenterDepth = tex2D(DepthMap, IN.TexUV).r * NearFar.y;
+	half4 vColor = tex2D(g_sBlur,IN.vTexUV);
+	half vCenterDepth = tex2D(g_sDepth, IN.vTexUV).r * g_vNearFar.y;
 	
-	half4 sourcevals[8];
-	sourcevals[0] = tex2D( BlurMap , IN.TexUV.xy + half2(-PixelSize.x, 0.0) + jitter );
-	sourcevals[1] = tex2D( BlurMap , IN.TexUV.xy + half2(PixelSize.x, 0.0) + jitter );
-	sourcevals[2] = tex2D( BlurMap , IN.TexUV.xy + half2(0.0, PixelSize.y) + jitter  );
-	sourcevals[3] = tex2D( BlurMap , IN.TexUV.xy + half2(0.0, -PixelSize.y) + jitter  );
+	half4 aBlurs[8];
+	aBlurs[0] = tex2D(g_sBlur, IN.vTexUV.xy + half2(-g_vPixelSize.x, 0.0) + vJitter);
+	aBlurs[1] = tex2D(g_sBlur, IN.vTexUV.xy + half2(g_vPixelSize.x, 0.0) + vJitter);
+	aBlurs[2] = tex2D(g_sBlur, IN.vTexUV.xy + half2(0.0, g_vPixelSize.y) + vJitter);
+	aBlurs[3] = tex2D(g_sBlur, IN.vTexUV.xy + half2(0.0, -g_vPixelSize.y) + vJitter);
 	
-	sourcevals[4] = tex2D( BlurMap , IN.TexUV.xy + half2(-PixelSize.x, PixelSize.y) + jitter );
-	sourcevals[5] = tex2D( BlurMap , IN.TexUV.xy + half2(PixelSize.x, -PixelSize.y) + jitter );
-	sourcevals[6] = tex2D( BlurMap , IN.TexUV.xy + half2(PixelSize.x, PixelSize.y) + jitter  );
-	sourcevals[7] = tex2D( BlurMap , IN.TexUV.xy + half2(-PixelSize.x, -PixelSize.y) + jitter  );
+	aBlurs[4] = tex2D(g_sBlur, IN.vTexUV.xy + half2(-g_vPixelSize.x, g_vPixelSize.y) + vJitter);
+	aBlurs[5] = tex2D(g_sBlur, IN.vTexUV.xy + half2(g_vPixelSize.x, -g_vPixelSize.y) + vJitter);
+	aBlurs[6] = tex2D(g_sBlur, IN.vTexUV.xy + half2(g_vPixelSize.x, g_vPixelSize.y) + vJitter);
+	aBlurs[7] = tex2D(g_sBlur, IN.vTexUV.xy + half2(-g_vPixelSize.x, -g_vPixelSize.y) + vJitter);
 	
-	half depthsourcevals[8];
-	depthsourcevals[0] = tex2D( DepthMap , IN.TexUV.xy + half2(-PixelSize.x, 0.0) + jitter ).r * NearFar.y;
-	depthsourcevals[1] = tex2D( DepthMap , IN.TexUV.xy + half2(PixelSize.x, 0.0) + jitter ).r * NearFar.y;
-	depthsourcevals[2] = tex2D( DepthMap , IN.TexUV.xy + half2(0.0, PixelSize.y) + jitter  ).r * NearFar.y;
-	depthsourcevals[3] = tex2D( DepthMap , IN.TexUV.xy + half2(0.0, -PixelSize.y) + jitter  ).r * NearFar.y;
+	half aDepths[8];
+	aDepths[0] = tex2D(g_sDepth, IN.vTexUV.xy + half2(-g_vPixelSize.x, 0.0) + vJitter).r * g_vNearFar.y;
+	aDepths[1] = tex2D(g_sDepth, IN.vTexUV.xy + half2(g_vPixelSize.x, 0.0) + vJitter).r * g_vNearFar.y;
+	aDepths[2] = tex2D(g_sDepth, IN.vTexUV.xy + half2(0.0, g_vPixelSize.y) + vJitter).r * g_vNearFar.y;
+	aDepths[3] = tex2D(g_sDepth, IN.vTexUV.xy + half2(0.0, -g_vPixelSize.y) + vJitter).r * g_vNearFar.y;
 	
-	depthsourcevals[4] = tex2D( DepthMap , IN.TexUV.xy + half2(-PixelSize.x, PixelSize.y) + jitter ).r * NearFar.y;
-	depthsourcevals[5] = tex2D( DepthMap , IN.TexUV.xy + half2(PixelSize.x, -PixelSize.y) + jitter ).r * NearFar.y;
-	depthsourcevals[6] = tex2D( DepthMap , IN.TexUV.xy + half2(PixelSize.x, PixelSize.y) + jitter  ).r * NearFar.y;
-	depthsourcevals[7] = tex2D( DepthMap , IN.TexUV.xy + half2(-PixelSize.x, -PixelSize.y) + jitter  ).r * NearFar.y;
+	aDepths[4] = tex2D(g_sDepth, IN.vTexUV.xy + half2(-g_vPixelSize.x, g_vPixelSize.y) + vJitter).r * g_vNearFar.y;
+	aDepths[5] = tex2D(g_sDepth, IN.vTexUV.xy + half2(g_vPixelSize.x, -g_vPixelSize.y) + vJitter).r * g_vNearFar.y;
+	aDepths[6] = tex2D(g_sDepth, IN.vTexUV.xy + half2(g_vPixelSize.x, g_vPixelSize.y) + vJitter).r * g_vNearFar.y;
+	aDepths[7] = tex2D(g_sDepth, IN.vTexUV.xy + half2(-g_vPixelSize.x, -g_vPixelSize.y) + vJitter).r * g_vNearFar.y;
 	
-		for(int i=0;i<8;i++)
-		{
-			half coef = saturate(1.f - abs(depthsourcevals[i] - CenterDepth));
-			Color = lerp(Color,sourcevals[i],coef);
-		}
+	for(int i=0; i<8; i++)
+		vColor = lerp(vColor, aBlurs[i], saturate(1.0 - abs(aDepths[i] - vCenterDepth)));
 	
-	return Color;
+	return vColor;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/pp/pp_clip.ps b/build/gamesource/shaders/pp/pp_clip.ps
new file mode 100644
index 0000000000000000000000000000000000000000..410df4b0c1f6fc2fa817dfc017159e9f696d6e52
--- /dev/null
+++ b/build/gamesource/shaders/pp/pp_clip.ps
@@ -0,0 +1,14 @@
+
+#include <../struct.h>
+
+//##########################################################################
+
+sampler2D g_sTexture:register(s0);
+
+//##########################################################################
+
+half4 main(VSO_PP IN):COLOR0
+{
+	clip(tex2D(g_sTexture, IN.vTexUV).r - 0.01);
+	return 1;
+}
\ No newline at end of file
diff --git a/build/gamesource/shaders/pp/pp_depth_find_max9.ps b/build/gamesource/shaders/pp/pp_depth_find_max9.ps
index 3e205410c22137b20b432e3547397d27f2eb040e..63e30ea774b349fb2c1022e15c8270a5db7047b9 100644
--- a/build/gamesource/shaders/pp/pp_depth_find_max9.ps
+++ b/build/gamesource/shaders/pp/pp_depth_find_max9.ps
@@ -1,44 +1,51 @@
 
 #include <../struct.h>
 
-sampler2D DepthSampler:register(s0);
-half2 PixelSize;
+//##########################################################################
 
-half4 main(vs_out_pp IN) : COLOR0
+sampler2D g_sDepth:register(s0);
+
+//##########################################################################
+
+half2 g_vPixelSize;
+
+//##########################################################################
+
+half4 main(VSO_PP IN) : COLOR0
 {
-	half depth = max (
-						tex2D(DepthSampler, IN.TexUV),
-						tex2D(DepthSampler, IN.TexUV + half2(PixelSize.x, 0.0))
+	half fDepth = max (
+						tex2D(g_sDepth, IN.vTexUV),
+						tex2D(g_sDepth, IN.vTexUV + half2(g_vPixelSize.x, 0.0))
 					);
-	depth = max (
-						depth,
-						tex2D(DepthSampler, IN.TexUV + half2(0.0, PixelSize.y))
+	fDepth = max (
+						fDepth,
+						tex2D(g_sDepth, IN.vTexUV + half2(0.0, g_vPixelSize.y))
 					);
-	depth = max (
-						depth,
-						tex2D(DepthSampler, IN.TexUV + PixelSize)
+	fDepth = max (
+						fDepth,
+						tex2D(g_sDepth, IN.vTexUV + g_vPixelSize)
 					);
 				
 				
-	depth = max (
-						depth,
-						tex2D(DepthSampler, IN.TexUV - PixelSize)
+	fDepth = max (
+						fDepth,
+						tex2D(g_sDepth, IN.vTexUV - g_vPixelSize)
 					);
-	depth = max (
-						depth,
-						tex2D(DepthSampler, IN.TexUV + half2(0.0, -PixelSize.y))
+	fDepth = max (
+						fDepth,
+						tex2D(g_sDepth, IN.vTexUV + half2(0.0, -g_vPixelSize.y))
 					);
-	depth = max (
-						depth,
-						tex2D(DepthSampler, IN.TexUV + half2(PixelSize.x, -PixelSize.y))
+	fDepth = max (
+						fDepth,
+						tex2D(g_sDepth, IN.vTexUV + half2(g_vPixelSize.x, -g_vPixelSize.y))
 					);
-	depth = max (
-						depth,
-						tex2D(DepthSampler, IN.TexUV + half2(-PixelSize.x, 0.0))
+	fDepth = max (
+						fDepth,
+						tex2D(g_sDepth, IN.vTexUV + half2(-g_vPixelSize.x, 0.0))
 					);
-	depth = max (
-						depth,
-						tex2D(DepthSampler, IN.TexUV + half2(-PixelSize.x, PixelSize.y))
+	fDepth = max (
+						fDepth,
+						tex2D(g_sDepth, IN.vTexUV + half2(-g_vPixelSize.x, g_vPixelSize.y))
 					);
-	return depth;
+	return fDepth;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/pp/pp_quad_render.ps b/build/gamesource/shaders/pp/pp_quad_render.ps
index 6e147c139d4af0f57274ef5dfeed7d956a1016cf..c812672ccd4b3a2648a5ea67ebb7e04529d1f094 100644
--- a/build/gamesource/shaders/pp/pp_quad_render.ps
+++ b/build/gamesource/shaders/pp/pp_quad_render.ps
@@ -6,9 +6,13 @@ pp_quad_render.ps
 
 #include <../struct.h>
 
-sampler2D BaseSampler:register(s0);
+//##########################################################################
 
-half4 main(vs_out_pp IN):COLOR0
+sampler2D g_sTexture:register(s0);
+
+//##########################################################################
+
+half4 main(VSO_PP IN):COLOR0
 {
-	return tex2D(BaseSampler,IN.TexUV);
+	return tex2D(g_sTexture,IN.vTexUV);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/pp/pp_quad_render.vs b/build/gamesource/shaders/pp/pp_quad_render.vs
index 90a8ddb892a439c961e0af564396b6ed3bb2c108..cbc1f96f8db0f22f3ac90f56eb9d8da0c7923835 100644
--- a/build/gamesource/shaders/pp/pp_quad_render.vs
+++ b/build/gamesource/shaders/pp/pp_quad_render.vs
@@ -6,10 +6,12 @@ pp_quad_render.vs
 
 #include <../struct.h>
 
-vs_out_pp main(vs_in_pp IN)
+//##########################################################################
+
+VSO_PP main(VSI_PP IN)
 {
-	vs_out_pp OUT;
-	OUT.Position = IN.Position;
-	OUT.TexUV = IN.TexUV;
+	VSO_PP OUT;
+	OUT.vPosition = IN.vPosition;
+	OUT.vTexUV = IN.vTexUV;
 	return OUT;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/pp/pp_res_pos.vs b/build/gamesource/shaders/pp/pp_res_pos.vs
index 254ed514ace49457562a49aa0c04dc8b1cbceb42..6f13bfd725c761a150fb1681e26812fe6728be1d 100644
--- a/build/gamesource/shaders/pp/pp_res_pos.vs
+++ b/build/gamesource/shaders/pp/pp_res_pos.vs
@@ -6,23 +6,27 @@ pp_res_pos.vs
 
 #include <../struct.h>
 
-half4x4 ViewInv;
-half2 NearFar;
-half3 ParamProj;
+//##########################################################################
 
-vs_out_res_pos main(vs_out_pp IN)
+half4x4 g_mViewInv;
+half2 g_vNearFar;
+half3 g_vParamProj;
+
+//##########################################################################
+
+VSO_ResPos main(VSO_PP IN)
 {
-	vs_out_res_pos OUT;
-	OUT.Position = IN.Position;
-	OUT.TexUV = IN.TexUV.xy;
+	VSO_ResPos OUT;
+	OUT.vPosition = IN.vPosition;
+	OUT.vTexUV = IN.vTexUV.xy;
 	
-	half tanHalfFOV = tan( ParamProj.z * 0.5f) ; 
-	half aspectRatio = ParamProj.x / ParamProj.y; 
-	half farY = tanHalfFOV * NearFar.y; 
-	half farX = farY * aspectRatio; 
+	half fTanHalfFOV = tan(g_vParamProj.z * 0.5) ; 
+	half aspectRatio = g_vParamProj.x / g_vParamProj.y; 
+	half fFarY = fTanHalfFOV * g_vNearFar.y; 
+	half fFarX = fFarY * aspectRatio; 
 	
-	OUT.EyeRay = half3(sign(OUT.Position.x) * farX, sign(OUT.Position.y) * farY, NearFar.y); 
-	OUT.WorldRay = mul(half4(OUT.EyeRay, 0.0), ViewInv).xyz;
+	OUT.vEyeRay = half3(sign(OUT.vPosition.x) * fFarX, sign(OUT.vPosition.y) * fFarY, g_vNearFar.y); 
+	OUT.vWorldRay = mul(half4(OUT.vEyeRay, 0.0), g_mViewInv).xyz;
   
 	return OUT;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/pp/pp_union_alpha.ps b/build/gamesource/shaders/pp/pp_union_alpha.ps
index c3703b9a9bed821de3762427d915f3523d18b468..67df4517a5c11f5c73d35baeee441d2990f6da19 100644
--- a/build/gamesource/shaders/pp/pp_union_alpha.ps
+++ b/build/gamesource/shaders/pp/pp_union_alpha.ps
@@ -5,143 +5,160 @@ pp_union_alpha.ps
 */
 
 #include <../struct.h>
+
+//##########################################################################
  
-sampler2D SceneColor:register(s0);
-sampler2D SceneLighting:register(s1);
-sampler2D Depth:register(s2);
-sampler2D Normal:register(s3);
-sampler2D Param:register(s4);
+sampler2D g_sColor:register(s0);
+sampler2D g_sSceneLighting:register(s1);
+sampler2D g_sDepth:register(s2);
+sampler2D g_sNormal:register(s3);
+sampler2D g_sParameters:register(s4);
+
+//##########################################################################
+
+half4 g_vWinSize;
 
-half4 WinSize;
-half2 NearFar;
+static int g_aExistsIDs[4] = {-1,-1,-1,-1};
 
-static int ArrExistsIDs[4] = {-1,-1,-1,-1};
+//##########################################################################
 
 bool IsExists(int id)
 {
 	for(int i=0;i<4;++i)
 	{
-		[branch] if(ArrExistsIDs[i] == id)
+		[branch] if(g_aExistsIDs[i] == id)
 			return true;
 	}
 	return false;
 }
 
-ps_out_alpha_union main(vs_out_pp IN):COLOR0
+PSO_UnionAlpha main(VSO_PP IN):COLOR0
 {
-	ps_out_alpha_union OUT;
-	half4 ArrColor[4];
-	half ArrDepth[4];
-	int ArrSort[4];
-	int ArrSort2[4];
-	int ArrIsTransparency[4];
-	half4 ArrTexUV[4];
-	int ArrIDs[4];
-	
-	ArrTexUV[0] = half4(IN.TexUV,0,0);
-	ArrTexUV[1] = half4(IN.TexUV + half2(0,WinSize.w),0,0);
-	ArrTexUV[2] = half4(IN.TexUV+ half2(WinSize.z,0),0,0);
-	ArrTexUV[3] = half4(IN.TexUV+ half2(WinSize.z,WinSize.w),0,0);
-	
-	ArrColor[0] = tex2Dlod(SceneLighting, ArrTexUV[0]);
-	ArrColor[1] = tex2Dlod(SceneLighting, ArrTexUV[1]);
-	ArrColor[2] = tex2Dlod(SceneLighting, ArrTexUV[2]);
-	ArrColor[3] = tex2Dlod(SceneLighting, ArrTexUV[3]);
-	
-	ArrDepth[0] = tex2Dlod(Depth, ArrTexUV[0]).r;
-	ArrDepth[1] = tex2Dlod(Depth, ArrTexUV[1]).r;
-	ArrDepth[2] = tex2Dlod(Depth, ArrTexUV[2]).r;
-	ArrDepth[3] = tex2Dlod(Depth, ArrTexUV[3]).r;
-	
-	half4 normal1 = tex2Dlod(Normal, ArrTexUV[0]);
-	half4 normal2 = tex2Dlod(Normal, ArrTexUV[1]);
-	half4 normal3 = tex2Dlod(Normal, ArrTexUV[2]);
-	half4 normal4 = tex2Dlod(Normal, ArrTexUV[3]);
-	
-	ArrIDs[0] = int(normal1.z * 256.f);
-	ArrIDs[1] = int(normal2.z * 256.f);
-	ArrIDs[2] = int(normal3.z * 256.f);
-	ArrIDs[3] = int(normal4.z * 256.f);
-	
-	ArrIsTransparency[0] = normal1.w >= MTLTYPE_LAYER_TRANSPARENT_UNLIT ? 1 : 0;
-	ArrIsTransparency[1] = normal2.w >= MTLTYPE_LAYER_TRANSPARENT_UNLIT ? 1 : 0;
-	ArrIsTransparency[2] = normal3.w >= MTLTYPE_LAYER_TRANSPARENT_UNLIT ? 1 : 0;
-	ArrIsTransparency[3] = normal4.w >= MTLTYPE_LAYER_TRANSPARENT_UNLIT ? 1 : 0;
+	PSO_UnionAlpha OUT;
+	
+	half4 aColor[4];
+	half aDepth[4];
+	half4 aNormal[4];
+	int aSort[4];
+	int aSort2[4];
+	int aIsTransparency[4];
+	half4 aTexUV[4];
+	int aIdLayer[4];
+	
+	aTexUV[0] = half4(IN.vTexUV, 0, 0);
+	aTexUV[1] = half4(IN.vTexUV + half2(0, g_vWinSize.w), 0, 0);
+	aTexUV[2] = half4(IN.vTexUV + half2(g_vWinSize.z, 0), 0, 0);
+	aTexUV[3] = half4(IN.vTexUV + half2(g_vWinSize.z, g_vWinSize.w), 0, 0);
+	
+	aColor[0] = tex2Dlod(g_sSceneLighting, aTexUV[0]);
+	aColor[1] = tex2Dlod(g_sSceneLighting, aTexUV[1]);
+	aColor[2] = tex2Dlod(g_sSceneLighting, aTexUV[2]);
+	aColor[3] = tex2Dlod(g_sSceneLighting, aTexUV[3]);
+	
+	aDepth[0] = tex2Dlod(g_sDepth, aTexUV[0]).r;
+	aDepth[1] = tex2Dlod(g_sDepth, aTexUV[1]).r;
+	aDepth[2] = tex2Dlod(g_sDepth, aTexUV[2]).r;
+	aDepth[3] = tex2Dlod(g_sDepth, aTexUV[3]).r;
+	
+	aNormal[0] = tex2Dlod(g_sNormal, aTexUV[0]);
+	aNormal[1] = tex2Dlod(g_sNormal, aTexUV[1]);
+	aNormal[2] = tex2Dlod(g_sNormal, aTexUV[2]);
+	aNormal[3] = tex2Dlod(g_sNormal, aTexUV[3]);
+	
+	aIdLayer[0] = int(aNormal[0].z * LAYERS_COUNT_MAX);
+	aIdLayer[1] = int(aNormal[1].z * LAYERS_COUNT_MAX);
+	aIdLayer[2] = int(aNormal[2].z * LAYERS_COUNT_MAX);
+	aIdLayer[3] = int(aNormal[3].z * LAYERS_COUNT_MAX);
+	
+	aIsTransparency[0] = aNormal[0].w >= MTLTYPE_LAYER_TRANSPARENT_UNLIT ? 1 : 0;
+	aIsTransparency[1] = aNormal[1].w >= MTLTYPE_LAYER_TRANSPARENT_UNLIT ? 1 : 0;
+	aIsTransparency[2] = aNormal[2].w >= MTLTYPE_LAYER_TRANSPARENT_UNLIT ? 1 : 0;
+	aIsTransparency[3] = aNormal[3].w >= MTLTYPE_LAYER_TRANSPARENT_UNLIT ? 1 : 0;
 	
 	//в случае если у нас нет ппрозрачных слоев то возвращаем текущий цвет
-	[branch] if((ArrIsTransparency[0] == 0 && ArrIsTransparency[1] == 0 && ArrIsTransparency[2] == 0 && ArrIsTransparency[3] == 0))
+	[branch] if((aIsTransparency[0] == 0 && aIsTransparency[1] == 0 && aIsTransparency[2] == 0 && aIsTransparency[3] == 0))
 	{
-		OUT.Color = ArrColor[0];
-		OUT.Depth0 = ArrDepth[0];
-		OUT.Depth1 = ArrDepth[0];
+		OUT.vColor = aColor[0];
+		OUT.vDepth0 = aDepth[0];
+		OUT.vDepth1 = aDepth[0];
 		return OUT;
 	}
-	
-	[unroll]for(int i=0;i<4;++i){
-		ArrSort[i] = 0;
-		[unroll]for(int k=0;k<4;++k){
-			[branch] if(i != k && (ArrDepth[i] > ArrDepth[k] || (i > k && ArrDepth[i] == ArrDepth[k]))){
-				++(ArrSort[i]);
+	else
+	{
+		[unroll]
+		for(int i=0; i<4; ++i)
+		{
+			aSort[i] = 0;
+			
+			[unroll]
+			for(int k=0; k<4; ++k)
+			{
+				[branch]
+				if(i != k && (aDepth[i] > aDepth[k] || (i > k && aDepth[i] == aDepth[k])))
+				{
+					++(aSort[i]);
+				}
 			}
+			
+			//aSort2[aSort[i]] = i;
+			[branch] if(aSort[i] == 0)
+				aSort2[0] = i;
+			else [branch] if(aSort[i] == 1)
+				aSort2[1] = i;
+			else [branch] if(aSort[i] == 2)
+				aSort2[2] = i;
+			else
+				aSort2[3] = i;
 		}
 		
-		//ArrSort2[ArrSort[i]] = i;
-		[branch] if(ArrSort[i] == 0)
-			ArrSort2[0] = i;
-		else [branch] if(ArrSort[i] == 1)
-			ArrSort2[1] = i;
-		else [branch] if(ArrSort[i] == 2)
-			ArrSort2[2] = i;
-		else
-			ArrSort2[3] = i;
-	}
-	
-	half4 cc = ArrColor[ArrSort2[3]];
-	half tmpa = cc.a;
-	ArrExistsIDs[0] = ArrIDs[ArrSort2[3]];
-	half tmpa2 = 0;
-	
-	//если id текущей поверхности записан либо этот id это нулевая (непрозрачная) поверхность
-	//проверка на непрозрачную поверхность нужна для правильного смешивания нулевого слоя, иначе будет жуткий альясинг
-	[branch] if(!IsExists(ArrIDs[ArrSort2[2]]) || ArrIDs[ArrSort2[2]] == 0)
-	{
-		tmpa2 = ArrColor[ArrSort2[2]].a;
-		cc = ArrColor[ArrSort2[2]] * tmpa2 + cc * (1.f - tmpa2);
-		cc.a = max(tmpa2,tmpa);
-		tmpa = cc.a;
-		ArrExistsIDs[1] = ArrIDs[ArrSort2[2]];
-	}
-	
-	[branch] if(!IsExists(ArrIDs[ArrSort2[1]]) || ArrIDs[ArrSort2[1]] == 0)
-	{
-		tmpa2 = ArrColor[ArrSort2[1]].a;
-		cc = ArrColor[ArrSort2[1]] * tmpa2 + cc.rgba * (1.f - tmpa2);
-		cc.a = max(tmpa2,tmpa);
-		tmpa = cc.a;
-		ArrExistsIDs[2] = ArrIDs[ArrSort2[1]];
-	}
-	
-	[branch] if(!IsExists(ArrIDs[ArrSort2[0]]) || ArrIDs[ArrSort2[0]] == 0)
-	{
-		tmpa2 = ArrColor[ArrSort2[0]].a;
-		cc = ArrColor[ArrSort2[0]] * tmpa2 + cc * (1.f - tmpa2);
-		cc.a = max(tmpa2,tmpa);
+		half4 vCountColor = aColor[aSort2[3]];
+		g_aExistsIDs[0] = aIdLayer[aSort2[3]];
+		
+		half fAlpha = vCountColor.a;
+		half fAlpha2 = 0;
+		
+		//если id текущей поверхности записан либо этот id это нулевая (непрозрачная) поверхность
+		//проверка на непрозрачную поверхность нужна для правильного смешивания нулевого слоя, иначе будет жуткий альясинг
+		[branch] if(!IsExists(aIdLayer[aSort2[2]]) || aIdLayer[aSort2[2]] == 0)
+		{
+			fAlpha2 = aColor[aSort2[2]].a;
+			vCountColor = aColor[aSort2[2]] * fAlpha2 + vCountColor * (1.f - fAlpha2);
+			vCountColor.a = max(fAlpha2,fAlpha);
+			fAlpha = vCountColor.a;
+			g_aExistsIDs[1] = aIdLayer[aSort2[2]];
+		}
+		
+		[branch] if(!IsExists(aIdLayer[aSort2[1]]) || aIdLayer[aSort2[1]] == 0)
+		{
+			fAlpha2 = aColor[aSort2[1]].a;
+			vCountColor = aColor[aSort2[1]] * fAlpha2 + vCountColor.rgba * (1.f - fAlpha2);
+			vCountColor.a = max(fAlpha2,fAlpha);
+			fAlpha = vCountColor.a;
+			g_aExistsIDs[2] = aIdLayer[aSort2[1]];
+		}
+		
+		[branch] if(!IsExists(aIdLayer[aSort2[0]]) || aIdLayer[aSort2[0]] == 0)
+		{
+			fAlpha2 = aColor[aSort2[0]].a;
+			vCountColor = aColor[aSort2[0]] * fAlpha2 + vCountColor * (1.f - fAlpha2);
+			vCountColor.a = max(fAlpha2,fAlpha);
+		}
+		
+		OUT.vColor = vCountColor;
+		OUT.vDepth0 = aDepth[aSort2[0]];
+		OUT.vDepth1 = aDepth[aSort2[0]];
+		
+		//если есть хотя бы один не прозрачный материал
+		[branch] if(!aIsTransparency[0] || !aIsTransparency[1] || !aIsTransparency[2] || !aIsTransparency[3])
+			 OUT.vColor.a = 1;
+		
+		//если хотя бы один слой полупрозрачный
+		[branch] if(aIsTransparency[0] || aIsTransparency[1] || aIsTransparency[2] || aIsTransparency[3])
+			OUT.vDepth1 = 1;
+		
+		[branch] if(aDepth[aSort2[3]] >= 1 && vCountColor.a < 1.f)
+			OUT.vDepth0 = 1;
+		
+		return OUT;
 	}
-	
-	OUT.Color = cc;
-	OUT.Depth0 = ArrDepth[ArrSort2[0]];
-	OUT.Depth1 = ArrDepth[ArrSort2[0]];
-	
-	//если есть хотя бы один не прозрачный материал
-	[branch] if(!ArrIsTransparency[0] || !ArrIsTransparency[1] || !ArrIsTransparency[2] || !ArrIsTransparency[3])
-		 OUT.Color.a = 1;
-	
-	//если хотя бы один слой полупрозрачный
-	[branch] if(ArrIsTransparency[0] || ArrIsTransparency[1] || ArrIsTransparency[2] || ArrIsTransparency[3])
-		OUT.Depth1 = 1;
-	
-	[branch] if(ArrDepth[ArrSort2[3]] >= 1 && cc.a < 1.f)
-		OUT.Depth0 = 1;
-	
-	return OUT;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/ppe/ppe_black_white.ps b/build/gamesource/shaders/ppe/ppe_black_white.ps
index a4b669b8f4b536635fde7566c355e8bba47e2d56..72306e9aad2dc96a96592e2fde14c05b2f2a70e8 100644
--- a/build/gamesource/shaders/ppe/ppe_black_white.ps
+++ b/build/gamesource/shaders/ppe/ppe_black_white.ps
@@ -6,16 +6,21 @@ ppe_black_white.ps
 
 #include <../struct.h>
 
-half CountPassWB;
+//##########################################################################
 
-sampler2D FrameSampler:register(s0);
+half g_fCoef;
 
-half4 main(vs_out_pp IN):COLOR0
+//##########################################################################
+
+sampler2D g_sColor:register(s0);
+
+//##########################################################################
+
+half4 main(VSO_PP IN):COLOR0
 {
-	half4 color = tex2D(FrameSampler,IN.TexUV);
+	half4 vColor = tex2D(g_sColor,IN.vTexUV);
 	
-	half count_color = color.r + color.g + color.b;
-	count_color *= 0.333f;
+	half fCountColor = (vColor.r + vColor.g + vColor.b) / 3.0;
 	
-	return half4(lerp(color.rgb,count_color,CountPassWB),color.a);
+	return half4(lerp(vColor.rgb, fCountColor, g_fCoef), vColor.a);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/ppe/ppe_bloom_bp.ps b/build/gamesource/shaders/ppe/ppe_bloom_bp.ps
index 016c39e10bbf0c5e0acc0f41324f939b6511d3aa..afc9f5f3aaac5cb3f721af2015eab8442b3372ad 100644
--- a/build/gamesource/shaders/ppe/ppe_bloom_bp.ps
+++ b/build/gamesource/shaders/ppe/ppe_bloom_bp.ps
@@ -6,22 +6,28 @@ ppe_bloom_bp.ps
 
 #include <../struct.h>
 
-half3 Param;
+//##########################################################################
+
+half3 g_vParam;
 //x - во сколько раз увеличиваем цвет пикселя
 //y - минимальное значение цвета
 //z - во сколько раз увеличиваем цвет пикселя если он прошел тест 
 
-sampler2D BaseSampler:register(s0);
+//##########################################################################
+
+sampler2D g_sColor:register(s0);
+
+//##########################################################################
 
-half4 main(vs_out_pp IN) : COLOR0
+half4 main(VSO_PP IN) : COLOR0
 {
-	half4 color = tex2D(BaseSampler, IN.TexUV);
-	color.rgb *= Param.x;
-	color.a = 1.f;
-	[branch]if (color.r >= Param.y && color.g >= Param.y && color.b >= Param.y)
+	half4 vColor = tex2D(g_sColor, IN.vTexUV);
+	vColor.rgb *= g_vParam.x;
+	vColor.a = 1.f;
+	[branch]if (vColor.r >= g_vParam.y && vColor.g >= g_vParam.y && vColor.b >= g_vParam.y)
 	{
-		color.rgb *= Param.z;
-		return color;
+		vColor.rgb *= g_vParam.z;
+		return vColor;
 	}
 	else
 		return half4(0.0, 0.0, 0.0, 0.0);
diff --git a/build/gamesource/shaders/ppe/ppe_bloom_final.ps b/build/gamesource/shaders/ppe/ppe_bloom_final.ps
index aacb8dd4c8c0834cb54db80bf603dea38275f889..cbe1d3024f0adae33e1b532a937731b90236863e 100644
--- a/build/gamesource/shaders/ppe/ppe_bloom_final.ps
+++ b/build/gamesource/shaders/ppe/ppe_bloom_final.ps
@@ -5,15 +5,20 @@ ppe_bloom_final.ps
 */
 
 #include <../struct.h>
+#include <../ps.h>
 
-sampler2D BaseSampler:register(s0);
+//##########################################################################
 
-half4 main(vs_out_pp IN) : COLOR0
+sampler2D g_sColor:register(s0);
+
+//##########################################################################
+
+half4 main(VSO_PP IN) : COLOR0
 {
-	half4 color = tex2Dlod(BaseSampler, half4(IN.TexUV,0.f,0.f));
-	color += tex2Dlod(BaseSampler, half4(IN.TexUV,0.f,1.f));
-	color += tex2Dlod(BaseSampler, half4(IN.TexUV,0.f,2.f));
-	color += tex2Dlod(BaseSampler, half4(IN.TexUV,0.f,3.f));
-	color += tex2Dlod(BaseSampler, half4(IN.TexUV,0.f,4.f));
-	return color*0.2f;
+	half4 vColor = tex2Dlod2(g_sColor, IN.vTexUV, 0);
+	vColor += tex2Dlod2(g_sColor, IN.vTexUV, 1);
+	vColor += tex2Dlod2(g_sColor, IN.vTexUV, 2);
+	vColor += tex2Dlod2(g_sColor, IN.vTexUV, 3);
+	vColor += tex2Dlod2(g_sColor, IN.vTexUV, 4);
+	return vColor*0.2f;
 }
diff --git a/build/gamesource/shaders/ppe/ppe_count_cbg.ps b/build/gamesource/shaders/ppe/ppe_count_cbg.ps
index 1c4400106f6ac3363c2f2120ca62ee2c04f07255..b561376fbc9e353e331ecabe13ad0522cbd07d1f 100644
--- a/build/gamesource/shaders/ppe/ppe_count_cbg.ps
+++ b/build/gamesource/shaders/ppe/ppe_count_cbg.ps
@@ -6,20 +6,26 @@ ppe_count_cbg.ps
 
 #include <../struct.h>
 
-half3 Param;
+//##########################################################################
+
+half3 g_vParam;
 //x - contrast;
 //y - gamma;	
 //z - bright;
 
-sampler2D FrameSampler:register(s0);
+//##########################################################################
+
+sampler2D g_sColor:register(s0);
+
+//##########################################################################
 
-half4 main(vs_out_pp IN):COLOR0
+half4 main(VSO_PP IN):COLOR0
 {
-	half4 color = tex2D(FrameSampler,IN.TexUV);
+	half4 vColor = tex2D(g_sColor,IN.vTexUV);
 	
-	color.r = pow(((Param.x * color.r) + Param.z),(1.f/Param.y));
-	color.g = pow(((Param.x * color.g) + Param.z),(1.f/Param.y));
-	color.b = pow(((Param.x * color.b) + Param.z),(1.f/Param.y));
+	vColor.r = pow((g_vParam.x * vColor.r) + g_vParam.z, 1.0/g_vParam.y);
+	vColor.g = pow((g_vParam.x * vColor.g) + g_vParam.z, 1.0/g_vParam.y);
+	vColor.b = pow((g_vParam.x * vColor.b) + g_vParam.z, 1.0/g_vParam.y);
 
-	return color;
+	return vColor;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/ppe/ppe_depth_edge_detected.ps b/build/gamesource/shaders/ppe/ppe_depth_edge_detected.ps
new file mode 100644
index 0000000000000000000000000000000000000000..1becf1b20bf92f8c989f1a43bd50375ad7610120
--- /dev/null
+++ b/build/gamesource/shaders/ppe/ppe_depth_edge_detected.ps
@@ -0,0 +1,36 @@
+
+/*
+ppe_depth_edge_detected.ps
+выделение границ
+*/
+
+#include <../struct.h>
+
+//##########################################################################
+
+half2 g_vPixelSize;
+
+//##########################################################################
+
+sampler2D g_sDepth:register(s0);
+
+//##########################################################################
+
+half4 main(VSO_PP IN) : COLOR0
+{
+	half fDepthCenter = tex2D(g_sDepth, IN.vTexUV);
+	half fDepth0 = tex2D(g_sDepth, IN.vTexUV + half2(-1, -1) * g_vPixelSize);
+	half fDepth1 = tex2D(g_sDepth, IN.vTexUV + half2( 1, -1) * g_vPixelSize);
+	half fDepth2 = tex2D(g_sDepth, IN.vTexUV + half2(-1,  1) * g_vPixelSize);
+	half fDepth3 = tex2D(g_sDepth, IN.vTexUV + half2( 1,  1) * g_vPixelSize);
+	
+	half fDepth4 = tex2D(g_sDepth, IN.vTexUV + half2( 0,  1) * g_vPixelSize);
+	half fDepth5 = tex2D(g_sDepth, IN.vTexUV + half2( 1,  0) * g_vPixelSize);
+	half fDepth6 = tex2D(g_sDepth, IN.vTexUV + half2(-1,  0) * g_vPixelSize);
+	half fDepth7 = tex2D(g_sDepth, IN.vTexUV + half2(0,  -1) * g_vPixelSize);
+	
+	half fDiff		= abs(((fDepth0 + fDepth1 + fDepth2 + fDepth3 + fDepth4 + fDepth5 + fDepth6 + fDepth7) / 8) - (fDepthCenter));
+	half fEdgeMask	= step(0.00001 + (0.01 * (fDepthCenter)), fDiff);//step(lerp(0.00001, 0.001, fDepthCenter), fDiff);
+	
+	return half4(fEdgeMask, fEdgeMask, fEdgeMask, 1);
+}
diff --git a/build/gamesource/shaders/ppe/ppe_depth_of_field.ps b/build/gamesource/shaders/ppe/ppe_depth_of_field.ps
index 33d2371ce2485a4397c96eff529f6796490496a7..902d6bd184b0d7378d38c3df6827431a177767d2 100644
--- a/build/gamesource/shaders/ppe/ppe_depth_of_field.ps
+++ b/build/gamesource/shaders/ppe/ppe_depth_of_field.ps
@@ -6,40 +6,50 @@ ppe_depth_of_field.ps
 
 #include <../struct.h>
 #include <../mtrl.h>
+#include <../ps.h>
 
-half4 Param;
+//##########################################################################
+
+half4 g_vParam;
 //x - откуда начинается нормальное видиние
 //y - где оно заканчивается
 //z - постепенный переход на ближней плоскости
 //w - постепенный переход на дальней плоскости
-half SkyBlur;//на сколько блюрить небо
 
-half2 NearFar;
+//! на сколько блюрить небо
+half g_fSkyBlur;
+
+half2 g_vNearFar;
+
+//##########################################################################
 
-sampler2D FrameSampler:register(s0);
-sampler2D DepthSampler:register(s1);
-sampler2D BlurSampler:register(s2);
+sampler2D g_sColor:register(s0);
+sampler2D g_sDepth:register(s1);
+sampler2D g_sBlur:register(s2);
 
-half4 main(vs_out_pp IN) : COLOR0
+//##########################################################################
+
+half4 main(VSO_PP IN) : COLOR0
 {
-	half4 color = tex2D(FrameSampler,IN.TexUV);
-	half tmp_DOF_NearDist = Param.x / NearFar.y;
-	half tmp_DOF_FarDist = Param.y / NearFar.y;
-	half tmp_DOF_NearRange = Param.z / NearFar.y;
-	half tmp_DOF_FarRange = Param.w / NearFar.y;
+	half4 vColor = tex2Dlod2(g_sColor, IN.vTexUV, 0);
+	half fNearDist = g_vParam.x / g_vNearFar.y;
+	half fFarDist = g_vParam.y / g_vNearFar.y;
+	half fNearRange = g_vParam.z / g_vNearFar.y;
+	half fFarRange = g_vParam.w / g_vNearFar.y;
 
-	half Depth = tex2D(DepthSampler, IN.TexUV).r;
+	half fDepth = tex2Dlod2(g_sDepth, IN.vTexUV, 0).r;
 			
-	half4 BlurColor = tex2D(BlurSampler,IN.TexUV);
+	half4 vBlurColor = tex2Dlod2(g_sBlur, IN.vTexUV, 0);
 	
-    half Blur = max(
-						saturate(1.f - (Depth - tmp_DOF_NearDist) / tmp_DOF_NearRange),
-						saturate((Depth - (tmp_DOF_FarDist - tmp_DOF_FarRange)) / tmp_DOF_FarRange)
+    half fBlur = max(
+						saturate(1.f - (fDepth - fNearDist) / fNearRange),
+						saturate((fDepth - (fFarDist - fFarRange)) / fFarRange)
 					);
-	Blur = clamp(0.f, 1.f, Blur);
-	Blur = lerp(Blur, SkyBlur, clamp(sign(Depth - 0.99f)+1.f, 0.f, 1.f));
-		/*if(Depth >= 0.99)
-			Blur = SkyBlur;*/
+	fBlur = clamp(0.f, 1.f, fBlur);
+	fBlur = lerp(fBlur, g_fSkyBlur, clamp(sign(fDepth - 0.99f)+1.f, 0.f, 1.f));
+	
+	/*if(fDepth >= 0.99)
+		fBlur = g_fSkyBlur;*/
 
-	return lerp(color, BlurColor, Blur);
+	return lerp(vColor, vBlurColor, fBlur);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/ppe/ppe_dlaa_long.ps b/build/gamesource/shaders/ppe/ppe_dlaa_long.ps
index abe78b5772b938b9806b3bfe6c5e2b3d46db17bf..c0e3d6e72859d5b3ec29f84a6fbaacedaaea6133 100644
--- a/build/gamesource/shaders/ppe/ppe_dlaa_long.ps
+++ b/build/gamesource/shaders/ppe/ppe_dlaa_long.ps
@@ -7,76 +7,70 @@ Directionally Localized Anti Aliasing
 */
 
 #include <../struct.h>
+#include <../ps.h>
 
-#define DLAA_MUL_VAL 0.333f
+//##########################################################################
 
-sampler2D Tex0:register(s0);
-sampler2D Tex1:register(s1);
+#define DLAA_MUL_VAL 0.333
 
-half2 PixelSize;
+half2 g_vPixelSize;
 
-half4 main(vs_out_pp IN) : COLOR0
+//##########################################################################
+
+sampler2D g_sColor:register(s0);
+
+//##########################################################################
+
+half4 main(VSO_PP IN) : COLOR0
 {
-	half4 sampleCenter = tex2Dlod(Tex0, half4(IN.TexUV,0.f,0.f));
-	half fEdgeDetected = tex2Dlod(Tex1, half4(IN.TexUV,0.f,0.f));
-	
-	[branch]if(fEdgeDetected.x == 0.f)
-		return sampleCenter;
-
-	half4 sampleVertNeg1 = tex2Dlod(Tex0, half4(IN.TexUV + half2(0.0, -3.5) * PixelSize, 0.f, 0.f)); 
-	half4 sampleVertNeg2 = tex2Dlod(Tex0, half4(IN.TexUV + half2(0.0, -7.5) * PixelSize, 0.f, 0.f));
-	half4 sampleVertPos1 = tex2Dlod(Tex0, half4(IN.TexUV + half2(0.0, 3.5) * PixelSize, 0.f, 0.f)); 
-	half4 sampleVertPos2 = tex2Dlod(Tex0, half4(IN.TexUV + half2(0.0, 7.5) * PixelSize, 0.f, 0.f)); 
-
-	half4 sampleHorizNeg1 = tex2Dlod(Tex0, half4(IN.TexUV + half2(-3.5, 0.0) * PixelSize, 0.f, 0.f)); 
-	half4 sampleHorizNeg2 = tex2Dlod(Tex0, half4(IN.TexUV + half2(-7.5, 0.0) * PixelSize, 0.f, 0.f));
-	half4 sampleHorizPos1 = tex2Dlod(Tex0, half4(IN.TexUV + half2(3.5, 0.0) * PixelSize, 0.f, 0.f)); 
-	half4 sampleHorizPos2 = tex2Dlod(Tex0, half4(IN.TexUV + half2(7.5, 0.0) * PixelSize, 0.f, 0.f)); 
-
-	half pass1EdgeAvgHoriz = (sampleHorizNeg2.a + sampleHorizNeg1.a + sampleCenter.a + sampleHorizPos1.a + sampleHorizPos2.a) * 0.2f;
-	half pass1EdgeAvgVert = (sampleVertNeg2.a + sampleVertNeg1.a + sampleCenter.a + sampleVertPos1.a + sampleVertPos2.a ) * 0.2f;
-	pass1EdgeAvgHoriz = saturate(pass1EdgeAvgHoriz * 2.0f - 1.0f);
-	pass1EdgeAvgVert = saturate(pass1EdgeAvgVert * 2.0f - 1.0f);
-	half longEdge = max(pass1EdgeAvgHoriz, pass1EdgeAvgVert);
-
-	half4 aaResult = sampleCenter;
-	[branch]if (longEdge > 0)
-	{
-    	half4 avgHorizLong = (sampleHorizNeg2 + sampleHorizNeg1 + sampleCenter + sampleHorizPos1 + sampleHorizPos2) * 0.2f;
-    	half4 avgVertLong = (sampleVertNeg2 + sampleVertNeg1 + sampleCenter + sampleVertPos1 + sampleVertPos2) * 0.2f;
-    	half valueHorizLong = dot(avgHorizLong.xyz, DLAA_MUL_VAL);
-    	half valueVertLong = dot(avgVertLong.xyz, DLAA_MUL_VAL);
-
-    	half4 sampleLeft = tex2Dlod(Tex0, half4(IN.TexUV + half2(-1.0,  0.0) * PixelSize, 0.f, 0.f));
-    	half4 sampleRight = tex2Dlod(Tex0, half4(IN.TexUV + half2(1.0,  0.0) * PixelSize, 0.f, 0.f));
-    	half4 sampleUp = tex2Dlod(Tex0, half4(IN.TexUV + half2(0.0, -1.0) * PixelSize, 0.f, 0.f));
-    	half4 sampleDown = tex2Dlod(Tex0, half4(IN.TexUV + half2(0.0,  1.0) * PixelSize, 0.f, 0.f));
-
-    	half valueCenter = dot(sampleCenter.xyz, DLAA_MUL_VAL);
-    	half valueLeft = dot(sampleLeft.xyz, DLAA_MUL_VAL);
-    	half valueRight = dot(sampleRight.xyz, DLAA_MUL_VAL);
-    	half valueTop = dot(sampleUp.xyz, DLAA_MUL_VAL);
-    	half valueBottom = dot(sampleDown.xyz, DLAA_MUL_VAL);
-
-    	half4 diffToCenter = valueCenter - half4(valueLeft, valueTop, valueRight, valueBottom);   	
-    	half blurAmountLeft = saturate(0.0 + (valueVertLong - valueLeft) / diffToCenter.x);
-    	half blurAmountUp = saturate(0.0 + (valueHorizLong - valueTop) / diffToCenter.y);
-    	half blurAmountRight = saturate(1.0 + (valueVertLong - valueCenter) / diffToCenter.z);
-    	half blurAmountDown = saturate(1.0 + (valueHorizLong - valueCenter) / diffToCenter.w);  	
-
-    	half4 blurAmounts = half4( blurAmountLeft, blurAmountRight, blurAmountUp, blurAmountDown );
-    	blurAmounts = (blurAmounts == half4(0.f, 0.f, 0.f, 0.f)) ? half4(1.f, 1.f, 1.f, 1.f) : blurAmounts;
-
-    	half4 longBlurHoriz = lerp(sampleLeft, sampleCenter, blurAmounts.x);
-    	longBlurHoriz = lerp(sampleRight, longBlurHoriz, blurAmounts.y);
-    	half4 longBlurVert = lerp(sampleUp,	sampleCenter, blurAmounts.z);
-    	longBlurVert = lerp(sampleDown, longBlurVert, blurAmounts.w);
-
-    	aaResult = lerp(sampleCenter, longBlurHoriz, pass1EdgeAvgVert);
-    	aaResult = lerp(aaResult, longBlurVert, pass1EdgeAvgHoriz);
-   }
-
-   //return tex2Dlod(Tex1, half4(IN.TexUV,0.f,0.f));
-   return half4(aaResult.rgb, sampleCenter.a);
-   return lerp(half4(aaResult.rgb, sampleCenter.a), sampleCenter, 1-fEdgeDetected.x);
+	half4 vColorCenter = tex2Dlod2(g_sColor, IN.vTexUV, 0.0);
+
+	half4 vSampleVertNeg1 = tex2Dlod2(g_sColor, IN.vTexUV + half2(0.0, -3.5) * g_vPixelSize, 0.0); 
+	half4 vSampleVertNeg2 = tex2Dlod2(g_sColor, IN.vTexUV + half2(0.0, -7.5) * g_vPixelSize, 0.0);
+	half4 vSampleVertPos1 = tex2Dlod2(g_sColor, IN.vTexUV + half2(0.0, 3.5) * g_vPixelSize, 0.0); 
+	half4 vSampleVertPos2 = tex2Dlod2(g_sColor, IN.vTexUV + half2(0.0, 7.5) * g_vPixelSize, 0.0); 
+
+	half4 vSampleHorizNeg1 = tex2Dlod2(g_sColor, IN.vTexUV + half2(-3.5, 0.0) * g_vPixelSize, 0.0); 
+	half4 vSampleHorizNeg2 = tex2Dlod2(g_sColor, IN.vTexUV + half2(-7.5, 0.0) * g_vPixelSize, 0.0);
+	half4 vSampleHorizPos1 = tex2Dlod2(g_sColor, IN.vTexUV + half2(3.5, 0.0) * g_vPixelSize, 0.0); 
+	half4 vSampleHorizPos2 = tex2Dlod2(g_sColor, IN.vTexUV + half2(7.5, 0.0) * g_vPixelSize, 0.0); 
+
+	half4 vEdgeAvgH = (vSampleHorizNeg2 + vSampleHorizNeg1 + vColorCenter + vSampleHorizPos1 + vSampleHorizPos2) * 0.2;
+	half4 vEdgeAvgV = (vSampleVertNeg2 + vSampleVertNeg1 + vColorCenter + vSampleVertPos1 + vSampleVertPos2) * 0.2;
+	vEdgeAvgH.a = saturate(vEdgeAvgH.a * 2.0 - 1.0);
+	vEdgeAvgV.a = saturate(vEdgeAvgV.a * 2.0 - 1.0);
+
+	half4 vResult = vColorCenter;
+
+	half fValueLongH = dot(vEdgeAvgH.xyz, DLAA_MUL_VAL);
+	half fValueLongV = dot(vEdgeAvgV.xyz, DLAA_MUL_VAL);
+
+	half4 vSampleLeft = tex2Dlod2(g_sColor, IN.vTexUV + half2(-1.0,  0.0) * g_vPixelSize, 0.0);
+	half4 vSampleRight = tex2Dlod2(g_sColor, IN.vTexUV + half2(1.0,  0.0) * g_vPixelSize, 0.0);
+	half4 vSampleUp = tex2Dlod2(g_sColor, IN.vTexUV + half2(0.0, -1.0) * g_vPixelSize, 0.0);
+	half4 vSampleDown = tex2Dlod2(g_sColor, IN.vTexUV + half2(0.0,  1.0) * g_vPixelSize, 0.0);
+
+	half fDotCenter = dot(vColorCenter.xyz, DLAA_MUL_VAL);
+	half fDotLeft = dot(vSampleLeft.xyz, DLAA_MUL_VAL);
+	half fDotRight = dot(vSampleRight.xyz, DLAA_MUL_VAL);
+	half fDotTop = dot(vSampleUp.xyz, DLAA_MUL_VAL);
+	half fDotBottom = dot(vSampleDown.xyz, DLAA_MUL_VAL);
+
+	half4 vDiffToCenter = fDotCenter - half4(fDotLeft, fDotTop, fDotRight, fDotBottom);
+		
+	half4 vBlurAmounts;
+	vBlurAmounts.x = saturate(0.0 + (fValueLongV - fDotLeft) / vDiffToCenter.x);
+	vBlurAmounts.z = saturate(0.0 + (fValueLongH - fDotTop) / vDiffToCenter.y);
+	vBlurAmounts.y = saturate(1.0 + (fValueLongV - fDotCenter) / vDiffToCenter.z);
+	vBlurAmounts.w = saturate(1.0 + (fValueLongH - fDotCenter) / vDiffToCenter.w); 
+
+	half4 vLongBlurH = lerp(vSampleLeft, vColorCenter, vBlurAmounts.x);
+	vLongBlurH = lerp(vSampleRight, vLongBlurH, vBlurAmounts.y);
+	half4 vLongBlurV = lerp(vSampleUp, vColorCenter, vBlurAmounts.z);
+	vLongBlurV = lerp(vSampleDown, vLongBlurV, vBlurAmounts.w);
+
+	vResult = lerp(vColorCenter, vLongBlurH, vEdgeAvgV.a);
+	vResult = lerp(vResult, vLongBlurV, vEdgeAvgH.a);
+
+	return half4(vResult.rgb, vColorCenter.a);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/ppe/ppe_dlaa_small.ps b/build/gamesource/shaders/ppe/ppe_dlaa_small.ps
index d81b18c6f3f7a398d045a76fa0458ba9399d06de..00cfb58c011a1fc87030d0b13156ca5203575d46 100644
--- a/build/gamesource/shaders/ppe/ppe_dlaa_small.ps
+++ b/build/gamesource/shaders/ppe/ppe_dlaa_small.ps
@@ -7,51 +7,49 @@ Directionally Localized Anti Aliasing
 */
 
 #include <../struct.h>
+#include <../ps.h>
 
-#define DLAA_MUL_VAL 0.333f
+//##########################################################################
 
-sampler2D Tex0:register(s0);
-sampler2D Tex1:register(s1);
+#define DLAA_MUL_VAL 0.333
 
-half2 PixelSize;
+half2 g_vPixelSize;
 
-half4 main(vs_out_pp IN) : COLOR0
+//##########################################################################
+
+sampler2D g_sColor:register(s0);
+
+//##########################################################################
+
+half4 main(VSO_PP IN) : COLOR0
 {
-	half4 sampleCenter = tex2Dlod(Tex0, half4(IN.TexUV,0.f,0.f));
-	half fEdgeDetected = tex2Dlod(Tex1, half4(IN.TexUV,0.f,0.f));
-	
-	[branch]if(fEdgeDetected.x == 0.f)
-		return sampleCenter;
+	half4 vColorCenter = tex2Dlod2(g_sColor, IN.vTexUV, 0.0);
 
-	half4 sampleHorizNeg0 = tex2Dlod(Tex0, half4(IN.TexUV + half2(-1.5f, 0.f) * PixelSize, 0.f, 0.f));
-	half4 sampleHorizPos0 = tex2Dlod(Tex0, half4(IN.TexUV + half2( 1.5f, 0.f) * PixelSize, 0.f, 0.f)); 
-	half4 sampleVertNeg0 = tex2Dlod(Tex0, half4(IN.TexUV + half2(0.f, -1.5f) * PixelSize, 0.f, 0.f)); 
-	half4 sampleVertPos0 = tex2Dlod(Tex0, half4(IN.TexUV + half2(0.f, 1.5f) * PixelSize, 0.f, 0.f));
+	half4 vHorizNeg0 = tex2Dlod2(g_sColor, IN.vTexUV + half2(-1.5, 0.0) * g_vPixelSize, 0.0);
+	half4 vHorizPos0 = tex2Dlod2(g_sColor, IN.vTexUV + half2( 1.5, 0.0) * g_vPixelSize, 0.0); 
+	half4 vVertNeg0 = tex2Dlod2(g_sColor, IN.vTexUV + half2(0.0, -1.5) * g_vPixelSize, 0.0); 
+	half4 vVertPos0 = tex2Dlod2(g_sColor, IN.vTexUV + half2(0.0, 1.5) * g_vPixelSize, 0.0);
 
-	half4 sumHoriz = sampleHorizNeg0 + sampleHorizPos0;
-	half4 sumVert = sampleVertNeg0  + sampleVertPos0;
+	half4 vSumHoriz = vHorizNeg0 + vHorizPos0;
+	half4 vSumVert = vVertNeg0  + vVertPos0;
 
-	half4 diffToCenterHoriz = abs(sumHoriz - (2.f * sampleCenter)) * 0.5f;  
+	half4 vDiffToCenterH = abs(vSumHoriz - (2.0 * vColorCenter)) * 0.5;  
+	half4 vDiffToCenterV = abs(vSumVert - (2.0 * vColorCenter)) * 0.5;
 
-	half valueEdgeHoriz = dot(diffToCenterHoriz.xyz, DLAA_MUL_VAL);
-	half valueEdgeVert = dot(diffToCenterHoriz.xyz, DLAA_MUL_VAL);
+	half fEdgeH = dot(vDiffToCenterH.xyz, DLAA_MUL_VAL);
+	half fEdgeV = dot(vDiffToCenterV.xyz, DLAA_MUL_VAL);
 	
-	half edgeDetectHoriz = saturate((3.f * valueEdgeHoriz) - 0.1f);
-	half edgeDetectVert = saturate((3.f * valueEdgeVert)  - 0.1f);
-
-	half4 avgHoriz = (sumHoriz + sampleCenter) * 0.333f;
-	half4 avgVert = (sumVert + sampleCenter) * 0.333f;
+	half vEdgeDetectH = saturate((3.0 * fEdgeH) - 0.1);
+	half vEdgeDetectV = saturate((3.0 * fEdgeV)  - 0.1);
 
-	half valueHoriz = dot(avgHoriz.xyz, DLAA_MUL_VAL);
-	half valueVert = dot(avgVert.xyz, DLAA_MUL_VAL);
+	half4 vAvgH = (vSumHoriz + vColorCenter) * DLAA_MUL_VAL;
+	half4 vAvgV = (vSumVert + vColorCenter) * DLAA_MUL_VAL;
 
-	half blurAmountHoriz = saturate(edgeDetectHoriz / valueHoriz);
-	half blurAmountVert = saturate(edgeDetectVert / valueVert);
+	half fBlurAmountH = saturate(vEdgeDetectH / dot(vAvgH.xyz, DLAA_MUL_VAL));
+	half fBlurAmountV = saturate(vEdgeDetectV / dot(vAvgV.xyz, DLAA_MUL_VAL));
 
-	half4 aaResult = lerp(sampleCenter, avgHoriz, blurAmountHoriz);
-	aaResult = lerp(aaResult, avgVert, blurAmountVert);
+	half4 vResult = lerp(vColorCenter, vAvgH, fBlurAmountH);
+	vResult = lerp(vResult, vAvgV, fBlurAmountV);
 
-	//return tex2Dlod(Tex1, half4(IN.TexUV,0.f,0.f));
-	return half4(aaResult.rgb, sampleCenter.a);
-	return lerp(half4(aaResult.rgb, sampleCenter.a), sampleCenter, 1-fEdgeDetected.x);
+	return half4(vResult.rgb, vColorCenter.a);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/ppe/ppe_edge_detected.ps b/build/gamesource/shaders/ppe/ppe_edge_detected.ps
deleted file mode 100644
index be81bb88c149492f92bf110741459cae3a8abb71..0000000000000000000000000000000000000000
--- a/build/gamesource/shaders/ppe/ppe_edge_detected.ps
+++ /dev/null
@@ -1,38 +0,0 @@
-
-/*
-ppe_edge_detected.ps
-выделение границ
-*/
-
-#include <../struct.h>
-
-#define DLAA_MUL_VAL 0.333
-
-sampler2D Texture0:register(s0);
-
-half2 PixelSize;
-
-half4 main(vs_out_pp IN) : COLOR0
-{
-   /*half4 Center		= tex2D(Texture0, IN.TexUV);
-   half4 UpLeft		= tex2D(Texture0, IN.TexUV + half2(-0.5, -0.5) * PixelSize);
-   half4 UpRight	= tex2D(Texture0, IN.TexUV + half2( 0.5, -0.5) * PixelSize);
-   half4 DownLeft	= tex2D(Texture0, IN.TexUV + half2(-0.5,  0.5) * PixelSize);
-   half4 DownRight	= tex2D(Texture0, IN.TexUV + half2( 0.5,  0.5) * PixelSize);
- 
-   half4 diff		= abs(((UpLeft + UpRight + DownLeft + DownRight) * 4.0) - (Center * 16.0));
-   half edgeMask	= dot(diff.xyz, DLAA_MUL_VAL);
-
-   return half4(Center.rgb, edgeMask);*/
-   
-	half fDepthCenter = tex2D(Texture0, IN.TexUV);
-	half fDepthUpLeft		= tex2D(Texture0, IN.TexUV + half2(-1, -1) * PixelSize);
-	half fDepthUpRight		= tex2D(Texture0, IN.TexUV + half2( 1, -1) * PixelSize);
-	half fDepthDownLeft		= tex2D(Texture0, IN.TexUV + half2(-1,  1) * PixelSize);
-	half fDepthDownRight	= tex2D(Texture0, IN.TexUV + half2( 1,  1) * PixelSize);
-	
-	half diff		= abs(((fDepthUpLeft + fDepthUpRight + fDepthDownLeft + fDepthDownRight)*0.25f) - (fDepthCenter));
-	half edgeMask	= step(lerp(0.00001f, 0.001f, fDepthCenter), diff);//dot(diff.xyz, DLAA_MUL_VAL);
-
-	return edgeMask;
-}
diff --git a/build/gamesource/shaders/ppe/ppe_fog_linear.ps b/build/gamesource/shaders/ppe/ppe_fog_linear.ps
index 287ba02732f97b6b42c86db59f96a4686b015b7d..1e94b089d9b8379bcad2cf20f53505624d2e5066 100644
--- a/build/gamesource/shaders/ppe/ppe_fog_linear.ps
+++ b/build/gamesource/shaders/ppe/ppe_fog_linear.ps
@@ -7,9 +7,10 @@ ppe_fog_linear.ps
 #include <../struct.h>
 #include <../mtrl.h>
 
-half3 FogColor;
-half FogDenisty;
-//half2 NearFar;
+//##########################################################################
+
+half3 g_vFogColor;
+half g_fFogDenisty;
 /*half4 Param;
 //x - интенсивность тумана
 //y - на сколько небо в тумане
@@ -17,17 +18,21 @@ half FogDenisty;
 //w - максимальное значение тумана
 */
 
-sampler2D DepthMap:register(s0);
+//##########################################################################
+
+sampler2D g_sDepth:register(s0);
+
+//##########################################################################
 
-half4 main(vs_out_pp IN) : COLOR0
+half4 main(VSO_PP IN) : COLOR0
 {
-	half Depth = tex2D(DepthMap, IN.TexUV).r;
+	half fDepth = tex2D(g_sDepth, IN.vTexUV).r;
 	
-		[branch]if(Depth >= 1.f)
+		[branch]if(fDepth >= 1.0)
 			clip(-1);
 		
 	/*half tmp_alpha = clamp((Param.x * Depth),Param.z,Param.w);
 	half4 cc = half4(FogColor,tmp_alpha);*/
 	
-	return half4(FogColor,FogDenisty * Depth);
+	return half4(g_vFogColor, g_fFogDenisty * fDepth);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/ppe/ppe_free_blur_3x3.ps b/build/gamesource/shaders/ppe/ppe_free_blur_3x3.ps
index 5ae7ad09c062d10eed30bffbe0389a0195410730..c19314a039734c1fe1c290f6d22c11631fdea805 100644
--- a/build/gamesource/shaders/ppe/ppe_free_blur_3x3.ps
+++ b/build/gamesource/shaders/ppe/ppe_free_blur_3x3.ps
@@ -6,27 +6,33 @@ ppe_free_blur_3x3.ps
 
 #include <../struct.h>
 
-half2 PixelSize;
+//##########################################################################
 
-sampler2D BlurMap:register(s0);
+half2 g_vPixelSize;
 
-half4 main(vs_out_pp IN) : COLOR0
+//##########################################################################
+
+sampler2D g_sTexture:register(s0);
+
+//##########################################################################
+
+half4 main(VSO_PP IN) : COLOR0
 {
-	half4 CountColor = tex2D(BlurMap,IN.TexUV);
+	half4 vColor = tex2D(g_sTexture, IN.vTexUV);
 	
-	CountColor += tex2D(BlurMap,half2(IN.TexUV + half2(-PixelSize.x,0.f)));
-	CountColor += tex2D(BlurMap,half2(IN.TexUV + half2(PixelSize.x,0.f)));
+	vColor += tex2D(g_sTexture, half2(IN.vTexUV + half2(-g_vPixelSize.x, 0.0)));
+	vColor += tex2D(g_sTexture, half2(IN.vTexUV + half2(g_vPixelSize.x, 0.0)));
 	
-	CountColor += tex2D(BlurMap,half2(IN.TexUV + half2(0.f,-PixelSize.y)));
-	CountColor += tex2D(BlurMap,half2(IN.TexUV + half2(0.f,PixelSize.y)));
+	vColor += tex2D(g_sTexture, half2(IN.vTexUV + half2(0.0, -g_vPixelSize.y)));
+	vColor += tex2D(g_sTexture, half2(IN.vTexUV + half2(0.0, g_vPixelSize.y)));
 	
-	CountColor += tex2D(BlurMap,half2(IN.TexUV + half2(-PixelSize.x,PixelSize.y)));
-	CountColor += tex2D(BlurMap,half2(IN.TexUV + half2(PixelSize.x,PixelSize.y)));
+	vColor += tex2D(g_sTexture, half2(IN.vTexUV + half2(-g_vPixelSize.x, g_vPixelSize.y)));
+	vColor += tex2D(g_sTexture, half2(IN.vTexUV + half2(g_vPixelSize.x,g_vPixelSize.y)));
 	
-	CountColor += tex2D(BlurMap,half2(IN.TexUV + half2(-PixelSize.x,-PixelSize.y)));
-	CountColor += tex2D(BlurMap,half2(IN.TexUV + half2(PixelSize.x,-PixelSize.y)));
+	vColor += tex2D(g_sTexture, half2(IN.vTexUV + half2(-g_vPixelSize.x, -g_vPixelSize.y)));
+	vColor += tex2D(g_sTexture, half2(IN.vTexUV + half2(g_vPixelSize.x, -g_vPixelSize.y)));
 	
-	CountColor *= 0.333f;
+	vColor *= 0.333;
 
-	return CountColor;
+	return vColor;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/ppe/ppe_gauss_blur.ps b/build/gamesource/shaders/ppe/ppe_gauss_blur.ps
index e32105d81876482cf090528820153abd20596456..86ea621169d349a50db67ae04ced8b8625a1989e 100644
--- a/build/gamesource/shaders/ppe/ppe_gauss_blur.ps
+++ b/build/gamesource/shaders/ppe/ppe_gauss_blur.ps
@@ -6,40 +6,42 @@ ppe_gauss_blur.ps
 
 #include <../struct.h>
 
-half2	SizeMap;
+//##########################################################################
 
-sampler2D BaseSampler:register(s0);
+half2 g_vSizeMap;
+half g_fCoefBlur;
 
-half CoefBlur;
+//##########################################################################
 
-half4 main(vs_out_pp IN) : COLOR0
+sampler2D g_sTexture:register(s0);
+
+//##########################################################################
+
+half4 main(VSO_PP IN) : COLOR0
 {
-	half2 tx  = IN.TexUV;
-	
 	#ifdef _H_
-    half2 dx  = half2(0.f,1.f/SizeMap.y)*CoefBlur;
+    half2 vPixelOffset  = half2(0.0,1.0/g_vSizeMap.y)*g_fCoefBlur;
 	#else
-    half2 dx  = half2(1.f/SizeMap.x,0.f)*CoefBlur;
+    half2 vPixelOffset  = half2(1.0/g_vSizeMap.x,0.f)*g_fCoefBlur;
 	#endif
 	
-	half2 sdx = dx;
+	half2 vOffset = vPixelOffset;
 	
-    half4 color = tex2D(BaseSampler,tx) * 0.134598f;
-	//half alpha = color.a;
-    color += (tex2D(BaseSampler,tx+sdx) + tex2D(BaseSampler,tx-sdx))*0.127325f;
-    sdx += dx;
-    color += (tex2D(BaseSampler,tx+sdx) + tex2D(BaseSampler,tx-sdx))*0.107778f;
-    sdx += dx;
-    color += (tex2D(BaseSampler,tx+sdx) + tex2D(BaseSampler,tx-sdx))*0.081638f;
-    sdx += dx;
-    color += (tex2D(BaseSampler,tx+sdx) + tex2D(BaseSampler,tx-sdx))*0.055335f;
-    sdx += dx;
-    color += (tex2D(BaseSampler,tx+sdx) + tex2D(BaseSampler,tx-sdx))*0.033562f;
-    sdx += dx;
-    color += (tex2D(BaseSampler,tx+sdx) + tex2D(BaseSampler,tx-sdx))*0.018216f;
-    sdx += dx;
-    color += (tex2D(BaseSampler,tx+sdx) + tex2D(BaseSampler,tx-sdx))*0.008847f;
-    sdx += dx;
+    half4 vColor = tex2D(g_sTexture, IN.vTexUV) * 0.134598;
+    vColor += (tex2D(g_sTexture, IN.vTexUV + vOffset) + tex2D(g_sTexture, IN.vTexUV - vOffset)) * 0.127325;
+    vOffset += vPixelOffset;
+    vColor += (tex2D(g_sTexture, IN.vTexUV + vOffset) + tex2D(g_sTexture, IN.vTexUV - vOffset)) * 0.107778;
+    vOffset += vPixelOffset;
+    vColor += (tex2D(g_sTexture, IN.vTexUV + vOffset) + tex2D(g_sTexture, IN.vTexUV - vOffset)) * 0.081638;
+    vOffset += vPixelOffset;
+    vColor += (tex2D(g_sTexture, IN.vTexUV + vOffset) + tex2D(g_sTexture, IN.vTexUV - vOffset)) * 0.055335;
+    vOffset += vPixelOffset;
+    vColor += (tex2D(g_sTexture, IN.vTexUV + vOffset) + tex2D(g_sTexture, IN.vTexUV - vOffset)) * 0.033562;
+    vOffset += vPixelOffset;
+    vColor += (tex2D(g_sTexture, IN.vTexUV + vOffset) + tex2D(g_sTexture, IN.vTexUV - vOffset)) * 0.018216;
+    vOffset += vPixelOffset;
+    vColor += (tex2D(g_sTexture, IN.vTexUV + vOffset) + tex2D(g_sTexture, IN.vTexUV - vOffset)) * 0.008847;
+    vOffset += vPixelOffset;
 	
-	return color;
+	return vColor;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/ppe/ppe_lens_flare0.ps b/build/gamesource/shaders/ppe/ppe_lens_flare0.ps
index 9faac8db829797a5ad4cfc6bc3768050347b0b6d..b8f85d513f60b5b9bc6f69dcb867b9a0ce512e4b 100644
--- a/build/gamesource/shaders/ppe/ppe_lens_flare0.ps
+++ b/build/gamesource/shaders/ppe/ppe_lens_flare0.ps
@@ -8,22 +8,27 @@ TODO: возможно надо будет в первом проходе обн
 #include <../struct.h>
 #include <../mtrl.h>
 
-half4 LightPos;
-half2 SizeMap;
-half RadiusSun;
-half4 Color;
-//half2 NearFar;
+//##########################################################################
 
-sampler2D DepthSampler:register(s0);
+half4 g_vLightPos;
+half2 g_vSizeMap;
+half g_fRadiusSun;
+half4 g_vColor;
 
-half4 main(vs_out_pp IN) : COLOR0
+//##########################################################################
+
+sampler2D g_sDepth:register(s0);
+
+//##########################################################################
+
+half4 main(VSO_PP IN) : COLOR0
 {	
-	half2 SunPosProj = LightPos.xy;
-	half depth = tex2D(DepthSampler,IN.TexUV).r;
-	clip(depth - 0.999f);
-	half2 ntc = IN.TexUV;
-	ntc.y *= SizeMap.y/SizeMap.x;
-	SunPosProj.y *= SizeMap.y/SizeMap.x;
-	half tmpcolor = lerp(0.f,1.f,1.f-(saturate((distance(ntc, SunPosProj)) * (1.f / (((RadiusSun)/0.9f)/SizeMap.x))))) * 0.7f;// * saturate(depth);
-	return tmpcolor*Color;
+	half2 vSunPosProj = g_vLightPos.xy;
+	half fDepth = tex2D(g_sDepth, IN.vTexUV).r;
+	clip(fDepth - 0.999);
+	half2 vNewTC = IN.vTexUV;
+	vNewTC.y *= g_vSizeMap.y/g_vSizeMap.x;
+	vSunPosProj.y *= g_vSizeMap.y/g_vSizeMap.x;
+	half vColor = lerp(0.0, 1.0, 1.0 - (saturate((distance(vNewTC, vSunPosProj)) * (1.0 / (((g_fRadiusSun)/0.9)/g_vSizeMap.x))))) * 0.7;// * saturate(fDepth);
+	return vColor*g_vColor;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/ppe/ppe_lens_flare2.ps b/build/gamesource/shaders/ppe/ppe_lens_flare2.ps
index 2fb0e3d95105fd991b1542eb2a4f136341e884d4..99979ddd3fbeff26e6e5dd438de0a3124bc66e77 100644
--- a/build/gamesource/shaders/ppe/ppe_lens_flare2.ps
+++ b/build/gamesource/shaders/ppe/ppe_lens_flare2.ps
@@ -6,42 +6,53 @@ ppe_lens_flare2.ps
 
 #include <../struct.h>
 
-static int NumSamples = 8;
-static half3 FLARE_CHROMA_DISTORTION = half3(0.2f,0.4f,0.6f);
+//##########################################################################
 
-sampler2D SunSampler:register(s0);
+static int g_vCountSamples = 8;
+static half3 FLARE_CHROMA_DISTORTION = half3(0.2, 0.4, 0.6);
 
-half3 LensFlareParam;
+half3 g_vLensFlareParam;
 //x - FLARE_DISPERSAL
 //y - FLARE_HALO_WIDTH
 //z - интенсивность вспышки
 
-half3 TexDistored(sampler2D tex,half2 sample_center,half2 sample_vector,half3 distortion)
+//##########################################################################
+
+sampler2D g_sBright:register(s0);
+
+//##########################################################################
+
+half3 TexDistoring(half2 vSampleCenter, half2 vSampleVector, half3 vDistortion)
 {
 	return half3(
-					tex2D(tex, (sample_center + sample_vector * distortion.r)).r,
-					tex2D(tex, (sample_center + sample_vector * distortion.g)).g,
-					tex2D(tex, (sample_center + sample_vector * distortion.b)).b
+					tex2D(g_sBright, (vSampleCenter + vSampleVector * vDistortion.r)).r,
+					tex2D(g_sBright, (vSampleCenter + vSampleVector * vDistortion.g)).g,
+					tex2D(g_sBright, (vSampleCenter + vSampleVector * vDistortion.b)).b
 				);
 }
 
-half4 main(vs_out_pp IN):COLOR0
+//##########################################################################
+
+half4 main(VSO_PP IN):COLOR0
 {
-	half2 texcoord = 1.f - IN.TexUV;
-	half2 image_center = 0.5f;
-	half2 sample_vector = (image_center - texcoord) * LensFlareParam.x;
+	half2 vInvTexUV = 1.0 - IN.vTexUV;
+	half2 vSample = (g_vTexUVcenter - vInvTexUV) * g_vLensFlareParam.x;
+	
+	half2 vHalo = normalize(vSample) * g_vLensFlareParam.y;
 	
-	half2 halo_vector = normalize(sample_vector) * LensFlareParam.y;
+	half3 vDistortion = lerp(FLARE_CHROMA_DISTORTION, tex2D(g_sBright, IN.vTexUV), PP_LENS_FLARE_COUNT_DEST_COLOR);
 
-	half3 result = half3(0,0,0);
-	result = TexDistored(SunSampler, texcoord + halo_vector, halo_vector, FLARE_CHROMA_DISTORTION).rgb;
+	half3 vResult = half3(0, 0, 0);
+	vResult = TexDistoring(vInvTexUV + vHalo, vHalo, vDistortion).rgb;
 			
-		for (int i = 0; i < NumSamples; i++)
-		{
-			half2 offset = sample_vector * half(i);
-			result += TexDistored(SunSampler, texcoord + offset, offset, FLARE_CHROMA_DISTORTION).rgb;
-		}
-
-	result /= half(NumSamples)*(LensFlareParam.z);
-	return half4(result,0.0);
+	for (int i = 0; i < g_vCountSamples; i++)
+	{
+		half2 vOffset = vSample * half(i);
+		vResult += TexDistoring(vInvTexUV + vOffset, vOffset, vDistortion).rgb;
+	}
+
+	vResult /= half(g_vCountSamples);
+	vResult *= g_vLensFlareParam.z * 10.0;
+	
+	return half4(vResult, 0.0);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/ppe/ppe_motion_blur.ps b/build/gamesource/shaders/ppe/ppe_motion_blur.ps
index 531931873e073db9d5bc4bf8fc8fa5df90f972a1..10f1ff2391a8b0480fd0f92acb801b1fe960c0a0 100644
--- a/build/gamesource/shaders/ppe/ppe_motion_blur.ps
+++ b/build/gamesource/shaders/ppe/ppe_motion_blur.ps
@@ -7,51 +7,58 @@ ppe_motion_blur.ps
 #include <../struct.h>
 #include <../mtrl.h>
 
-half4x4 ViewProjectionPrev;
+//##########################################################################
 
-half3 ViewPos;
-half CoefBlur;
-half2 NearFar;
+half4x4 g_mVPprev;
 
-static int NumSam = 16;
+half3 g_vViewPos;
+half g_fCoefBlur;
+half2 g_vNearFar;
 
-sampler2D DepthMap:register(s1);
-sampler2D SceneMap:register(s0);
+static int g_vCountSamples = 16;
 
-half4 main(vs_out_res_pos IN) : COLOR0
+//##########################################################################
+
+sampler2D g_sDepth:register(s1);
+sampler2D g_sScene:register(s0);
+
+//##########################################################################
+
+half4 main(VSO_ResPos IN) : COLOR0
 {
-	half depth = tex2D(DepthMap, IN.TexUV).r; 
+	half fDepth = tex2D(g_sDepth, IN.vTexUV).r; 
 	
-	half4 vWorldPos = half4(ViewPos.xyz + IN.WorldRay * depth,1.f);
+	half4 vWorldPos = half4(g_vViewPos.xyz + IN.vWorldRay * fDepth, 1.0);
 	
-	[branch]if(depth*NearFar.y <= PP_MOTION_BLUR_DISTNOBLUR)
-		return tex2D(SceneMap, IN.TexUV);
+	[branch]if(fDepth * g_vNearFar.y <= PP_MOTION_BLUR_DISTNOBLUR)
+		return tex2D(g_sScene, IN.vTexUV);
 	
-	half4 currentPos = half4(IN.TexUV.x * 2.f - 1.f, (1.f-IN.TexUV.y) * 2.f - 1.f, vWorldPos.z, 1.f);
-	half4 previousPos = mul(vWorldPos,ViewProjectionPrev);
-	previousPos.xyz /= previousPos.w;
+	half4 vCurrentPos = half4(IN.vTexUV.x * 2.0 - 1.0, (1.0 - IN.vTexUV.y) * 2.0 - 1.0, vWorldPos.z, 1.0);
+	half4 vPrevPos = mul(vWorldPos, g_mVPprev);
+	vPrevPos.xyz /= vPrevPos.w;
 
-	half2 velocity = (currentPos.xy - previousPos.xy) * CoefBlur;
-	velocity.x = -velocity.x;
+	half2 vVelocity = (vCurrentPos.xy - vPrevPos.xy) * g_fCoefBlur;
+	vVelocity.x = -vVelocity.x;
 
-	half4 color = tex2D(SceneMap, IN.TexUV);
-	half4 original_color = color;
-	half2 SamplePoint = IN.TexUV + velocity;
-	half4 CurrentSample;
+	half4 vColor = tex2D(g_sScene, IN.vTexUV);
+	half4 vOriginColor = vColor;
+	half2 vSamplePoint = IN.vTexUV + vVelocity;
+	half4 vCurrentSample;
 		
-	for(int i = 1; i < NumSam+1; ++i)
+	for(int i = 1; i < g_vCountSamples + 1; ++i)
 	{   
-		SamplePoint = IN.TexUV + (velocity * i * (1.f - depth));
-		CurrentSample = tex2D(SceneMap, SamplePoint);
+		vSamplePoint = IN.vTexUV + (vVelocity * i * (1.0 - fDepth));
+		vCurrentSample = tex2D(g_sScene, vSamplePoint);
 		
-		depth = tex2D(DepthMap, SamplePoint).r;
+		fDepth = tex2D(g_sDepth, vSamplePoint).r;
 		
-		[branch]if(depth*NearFar.y > PP_MOTION_BLUR_DISTNOBLUR)
-			color += CurrentSample;
+		[branch]if(fDepth * g_vNearFar.y > PP_MOTION_BLUR_DISTNOBLUR)
+			vColor += vCurrentSample;
 		else 
-			color += original_color;
+			vColor += vOriginColor;
 	}
 		
-	color /= half(NumSam);
-	return half4(color.rgb,original_color.a);
+	vColor /= half(g_vCountSamples);
+	
+	return half4(vColor.rgb, vOriginColor.a);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/ppe/ppe_nfaa.ps b/build/gamesource/shaders/ppe/ppe_nfaa.ps
index 5a565cd5b631cabf9125ac789103cdda63e8df24..a006905233e0cbf930b08fee242e078a5f34d23c 100644
--- a/build/gamesource/shaders/ppe/ppe_nfaa.ps
+++ b/build/gamesource/shaders/ppe/ppe_nfaa.ps
@@ -2,68 +2,75 @@
 /*
 ppe_nfaa.ps
 Normal Filter Anti Aliasing
-����������� �� �������
+Сглаживание по нормали
 */
 
 #include <../struct.h>
+#include <../ps.h>
 
-half3 Param;
+//##########################################################################
+
+half3 g_vParam;
 //half Param.x - Strength;
 //half Param.y - Scale;
 //bool Param.z - IsNotmalMap
 
-half2 PixelSize;
+half2 g_vPixelSize;
+
+//##########################################################################
+
+sampler2D g_sColor:register(s0);
 
-sampler2D FrameSampler:register(s0);
-sampler2D EdgeDetectedSampler:register(s1);
+//##########################################################################
 
-half2 GetNormal(half2 texuv) 
+half2 GetNormal(half2 vTexUV) 
 {
-	half2 upOffset = half2(0, PixelSize.y) * Param.y;
-	half2 rightOffset = half2(PixelSize.x, 0) * Param.y;
-	half3 topHeight = saturate(tex2Dlod(FrameSampler, half4(texuv + upOffset, 0, 0)).rgb);
-	half3 bottomHeight = saturate(tex2Dlod(FrameSampler, half4(texuv - upOffset, 0, 0)).rgb);
-	half3 rightHeight = saturate(tex2Dlod(FrameSampler, half4(texuv + rightOffset, 0, 0)).rgb);
-	half3 leftHeight = saturate(tex2Dlod(FrameSampler, half4(texuv - rightOffset, 0, 0)).rgb);
-	half3 leftTopHeight = saturate(tex2Dlod(FrameSampler, half4(texuv - rightOffset + upOffset, 0, 0)).rgb);
-	half3 leftBottomHeight = saturate(tex2Dlod(FrameSampler, half4(texuv - rightOffset - upOffset, 0, 0)).rgb);
-	half3 rightBottomHeight = saturate(tex2Dlod(FrameSampler, half4(texuv + rightOffset + upOffset, 0, 0)).rgb);
-	half3 rightTopHeight = saturate(tex2Dlod(FrameSampler, half4(texuv + rightOffset - upOffset, 0, 0)).rgb);
-
-	half3 sum0 = rightTopHeight + bottomHeight + leftTopHeight;
-	half3 sum1 = leftBottomHeight + topHeight + rightBottomHeight;
-	half3 sum2 = leftTopHeight + rightHeight + leftBottomHeight;
-	half3 sum3 = rightBottomHeight + leftHeight + rightTopHeight;
-
-	half vec1 = length(sum0 - sum1) * Param.x;
-	half vec2 = length(sum3 - sum2) * Param.x;
-	half2 Vectors = half2(vec1,vec2);
-	return  Vectors;
+	half2 vUpOffset = half2(0, g_vPixelSize.y) * g_vParam.y;
+	half2 vRightOffset = half2(g_vPixelSize.x, 0) * g_vParam.y;
+	
+	half3 vTopHeight = tex2Dlod2(g_sColor, vTexUV + vUpOffset, 0).rgb;
+	half3 vBottomHeight = tex2Dlod2(g_sColor, vTexUV - vUpOffset, 0).rgb;
+	half3 vRightHeight = tex2Dlod2(g_sColor, vTexUV + vRightOffset, 0).rgb;
+	half3 vLeftHeight = tex2Dlod2(g_sColor, vTexUV - vRightOffset, 0).rgb;
+	
+	half3 vLeftTopHeight = tex2Dlod2(g_sColor, vTexUV - vRightOffset + vUpOffset, 0).rgb;
+	half3 vLeftBottomHeight = tex2Dlod2(g_sColor, vTexUV - vRightOffset - vUpOffset, 0).rgb;
+	half3 vRightBottomHeight = tex2Dlod2(g_sColor, vTexUV + vRightOffset + vUpOffset, 0).rgb;
+	half3 vRightTopHeight = tex2Dlod2(g_sColor, vTexUV + vRightOffset - vUpOffset, 0).rgb;
+
+	half3 vSum0 = vRightTopHeight + vBottomHeight + vLeftTopHeight;
+	half3 vSum1 = vLeftBottomHeight + vTopHeight + vRightBottomHeight;
+	half3 vSum2 = vLeftTopHeight + vRightHeight + vLeftBottomHeight;
+	half3 vSum3 = vRightBottomHeight + vLeftHeight + vRightTopHeight;
+
+	half2 vVectors;
+	vVectors.x = length(vSum0 - vSum1) * g_vParam.x;
+	vVectors.y = length(vSum3 - vSum2) * g_vParam.x;
+
+	return vVectors;
 }
 
-half4 main(vs_out_pp IN) : COLOR0 
+//##########################################################################
+
+half4 main(VSO_PP IN) : COLOR0 
 {
-	half4 Scene0 = tex2Dlod(FrameSampler, half4(IN.TexUV.xy, 0, 0));
-	half fEdgeDetected = tex2Dlod(EdgeDetectedSampler, half4(IN.TexUV,0.f,0.f));
-	
-	[branch]if(fEdgeDetected.x == 0.f)
-		return Scene0;
+	half4 vColor0= tex2Dlod2(g_sColor, IN.vTexUV.xy, 0);
 
-	half2 Normal = GetNormal(IN.TexUV.xy);			
+	half2 vNormal = GetNormal(IN.vTexUV.xy);			
 	
-	Normal = clamp(Normal, -1, 1) * PixelSize;
+	vNormal = clamp(vNormal, -1, 1) * g_vPixelSize;
 
-	half4 Scene1 = tex2Dlod(FrameSampler, half4(IN.TexUV.xy + Normal.xy, 0, 0));
-	half4 Scene2 = tex2Dlod(FrameSampler, half4(IN.TexUV.xy - Normal.xy, 0, 0));
-	half4 Scene3 = tex2Dlod(FrameSampler, half4(IN.TexUV.xy + half2(Normal.x, -Normal.y), 0, 0));
-	half4 Scene4 = tex2Dlod(FrameSampler, half4(IN.TexUV.xy - half2(Normal.x, -Normal.y), 0, 0));
-	half4 Scene5 = tex2Dlod(FrameSampler, half4(IN.TexUV.xy + half2(-Normal.x, Normal.y), 0, 0));
-	half4 Scene6 = tex2Dlod(FrameSampler, half4(IN.TexUV.xy - half2(-Normal.x, Normal.y), 0, 0));
+	half4 vColor1 = tex2Dlod2(g_sColor, IN.vTexUV.xy + vNormal.xy, 0);
+	half4 vColor2 = tex2Dlod2(g_sColor, IN.vTexUV.xy - vNormal.xy, 0);
+	half4 vColor3 = tex2Dlod2(g_sColor, IN.vTexUV.xy + half2(vNormal.x, -vNormal.y), 0);
+	half4 vColor4 = tex2Dlod2(g_sColor, IN.vTexUV.xy - half2(vNormal.x, -vNormal.y), 0);
+	half4 vColor5 = tex2Dlod2(g_sColor, IN.vTexUV.xy + half2(-vNormal.x, vNormal.y), 0);
+	half4 vColor6 = tex2Dlod2(g_sColor, IN.vTexUV.xy - half2(-vNormal.x, vNormal.y), 0);
 
-	half4 CountColor = (Scene0 + Scene1 + Scene2 + Scene3 + Scene4 + Scene5 + Scene6) / 7.f;
+	half4 vCountColor = (vColor0 + vColor1 + vColor2 + vColor3 + vColor4 + vColor5 + vColor6) / 7.0;
 
-		[branch]if (Param.z) 
-			CountColor.xyz = normalize(half3(Normal.xy, 1) * 0.1 + 0.1);
+	/*[branch]if (g_vParam.z) 
+		vCountColor.xyz = normalize(half3(vNormal.xy, 1) * 0.1 + 0.1);*/
 
-	return CountColor;
+	return vCountColor;
 }
diff --git a/build/gamesource/shaders/ppe/ppe_sepia.ps b/build/gamesource/shaders/ppe/ppe_sepia.ps
index 686acf8f46d3f90ef475c8f9471cd301e8312723..aaae79bded53e1be07c431a4c5d98f8f93bd7c7a 100644
--- a/build/gamesource/shaders/ppe/ppe_sepia.ps
+++ b/build/gamesource/shaders/ppe/ppe_sepia.ps
@@ -6,25 +6,31 @@ ppe_sepia.ps
 
 #include <../struct.h>
 
-half3 LightColor;
-half3 DarkColor;;
-half3 LumWeights;
+//##########################################################################
 
-half CountSepia;
+half3 g_vLightColor;
+half3 g_vDarkColor;;
+half3 g_vLumWeights;
 
-sampler2D FrameSampler:register(s0);
+half g_vCountSepia;
 
-half4 main(vs_out_pp IN):COLOR0
+//##########################################################################
+
+sampler2D g_sColor:register(s0);
+
+//##########################################################################
+
+half4 main(VSO_PP IN):COLOR0
 {
-	half4 color = tex2D(FrameSampler,IN.TexUV);
+	half4 vColor = tex2D(g_sColor, IN.vTexUV);
 	
-	half lum = dot(LumWeights,color);
-	half4 tmp_color = color;
-	tmp_color.rgb = DarkColor*(1.f-lum) + LightColor*lum;
-	tmp_color.rgb *= CountSepia * 2.f;
-	color.rgb *= 1.f + (1.f - (CountSepia * 2.f));
-	color += tmp_color;
-	color /= 2.f;
+	half fLum = dot(g_vLumWeights, vColor);
+	half4 vColor2 = vColor;
+	vColor2.rgb = g_vDarkColor * (1.0 - fLum) + g_vLightColor * fLum;
+	vColor2.rgb *= g_vCountSepia * 2.0;
+	vColor.rgb *= 1.0 + (1.0 - (g_vCountSepia * 2.0));
+	vColor += vColor2;
+	vColor *= 0.5;
 	
-	return color;
+	return vColor;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/ppe/ppe_ssao.ps b/build/gamesource/shaders/ppe/ppe_ssao.ps
index 178a98953b276ced8c5fbd57f291fc51e9368c55..7c4bd258ca18d1232d7c03ca3cdc009984526322 100644
--- a/build/gamesource/shaders/ppe/ppe_ssao.ps
+++ b/build/gamesource/shaders/ppe/ppe_ssao.ps
@@ -7,69 +7,76 @@ ppe_ssao.ps
 #include <../struct.h>
 #include <../mtrl.h>
 
-sampler2D DepthSampler:register(s0);
-sampler2D NormalSampler:register(s1);
-sampler2D RndSampler:register(s2);
+//##########################################################################
 
-half4 Params;
+sampler2D g_sDepth:register(s0);
+sampler2D g_sNormals:register(s1);
+sampler2D g_sNoise:register(s2);
+
+//##########################################################################
+
+half4 g_vParams;
 //x - радиус
 //y - минимально допустимая разница в глубине между пикселя для просчета затенения
 //z - освещенность пикселя по дефолту (если разница меньше минимальной)
 //w - допустимая разница для сравнения
 
-half2 NearFar;
-half2 Ratio;
-half3 ViewPos;
-half4x4 ViewProj;
+half2 g_vNearFar;
+half3 g_vViewPos;
+half4x4 g_vViewProj;
 
-half3 ArrRndVecSSAO[24];
+half3 g_aRndVectors[24];
 
 #if defined(SSAO_Q_3)
-static int NumSam = 24;
+static int g_fNumSam = 24;
 #elif defined(SSAO_Q_2)
-static int NumSam = 16;
+static int g_fNumSam = 16;
 #else
-static int NumSam = 8;
+static int g_fNumSam = 8;
 #endif
 
-half4 main(vs_out_res_pos IN):COLOR0
+//##########################################################################
+
+half4 main(VSO_ResPos IN):COLOR0
 {
-	half depth = tex2D(DepthSampler, IN.TexUV).r;
-	half3 random = normalize(2.f * tex2D(RndSampler, IN.TexUV*Ratio*96.f).rgb - 1.f);
+	half fDepth = tex2D(g_sDepth, IN.vTexUV).r;
+	half3 vRndVec = normalize(2.0 * tex2D(g_sNoise, IN.vTexUV).rgb - 1.0);
 	
-	[branch]if(depth >= 1.f)
-		return half4(1,1,1,1);
+	[branch]if(fDepth >= 1.0)
+		return half4(1, 1, 1, 1);
 	else
 	{
-		half3 position = half3(ViewPos + (IN.WorldRay) * (depth));
-		half3 normal = normalize(NormalDecode(tex2Dlod(NormalSampler, half4(IN.TexUV, 0, 0)).xy));
+		half3 vPosition = half3(g_vViewPos + IN.vWorldRay * fDepth);
+		half3 vNormal = normalize(NormalDecode(tex2Dlod(g_sNormals, half4(IN.vTexUV, 0, 0)).xy));
 		
-		half occlusion = 0.f;
-		for(int i=0; i < NumSam; i++)
+		half fOcclusion = 0.0;
+		for(int i=0; i < g_fNumSam; i++)
 		{
-			half3 ray = (reflect(ArrRndVecSSAO[i],random));
-			half3 hemi_ray = ray * sign(dot(ray,normal));
-			half4 newpos = half4(position + hemi_ray * Params.x,1);
+			half3 vRay = (reflect(g_aRndVectors[i], vRndVec));
+			half3 vHemiRay = vRay * sign(dot(vRay, vNormal));
+			half4 vNewPos = half4(vPosition + vHemiRay * g_vParams.x, 1);
 
-			newpos = mul(newpos,ViewProj);
-			newpos /= newpos.w;
-			newpos.x = newpos.x * 0.5f + 0.5f;
-			newpos.y = newpos.y * (-0.5f) + 0.5f;
+			vNewPos = mul(vNewPos, g_vViewProj);
+			vNewPos /= vNewPos.w;
+			vNewPos.x = vNewPos.x * 0.5 + 0.5;
+			vNewPos.y = vNewPos.y * (-0.5) + 0.5;
 
-			half newdepth = tex2Dlod(DepthSampler, half4(newpos.xy, 0, 0)).r;
-				[branch]if(newdepth >= 1.f)
-					occlusion += 1.f;
-			half difference = (newdepth - depth)*NearFar.y;
+			half newdepth = tex2Dlod(g_sDepth, half4(vNewPos.xy, 0, 0)).r;
+				[branch]if(newdepth >= 1.0)
+					fOcclusion += 1.0;
+			half fDifference = (newdepth - fDepth)*g_vNearFar.y;
 			
-			half distanceCheck = min(Params.z, (Params.x/abs(difference)));
-			[branch]if(abs(difference) < Params.y)
-				occlusion += Params.z;
+			half fDistanceCheck = min(g_vParams.z, (g_vParams.x/abs(fDifference)));
+			[branch]if(abs(fDifference) < g_vParams.y)
+				fOcclusion += g_vParams.z;
 			else
-				occlusion += 1-step(difference, Params.w)*distanceCheck;
+				fOcclusion += 1.0-step(fDifference, g_vParams.w) * fDistanceCheck;
 		}
-		occlusion = clamp(saturate(occlusion/NumSam)*1.2f,0.3f,1.f);
-		occlusion *= occlusion;
-	
-		return half4(occlusion,occlusion,occlusion,1.f);
+		fOcclusion = clamp(saturate(fOcclusion/g_fNumSam), 0.2, 1.0);
+		fOcclusion = lerp(1.0, fOcclusion, 0.6);
+		fOcclusion = pow(fOcclusion, 2);
+		fOcclusion = lerp(1.0, fOcclusion, saturate((fDepth * g_vNearFar.y)/PP_SSAO_DIST_EMERSION));
+		//fOcclusion = pow(fOcclusion, 2);
+		return half4(fOcclusion,fOcclusion,fOcclusion,1.0);
 	}
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/ppe/ppe_ssao_blur.ps b/build/gamesource/shaders/ppe/ppe_ssao_blur.ps
index d2b1f20ad26edd891c50f615520852abf58d66fd..345f3155d69ae8915985f0c7e26c8fc6e5177fb4 100644
--- a/build/gamesource/shaders/ppe/ppe_ssao_blur.ps
+++ b/build/gamesource/shaders/ppe/ppe_ssao_blur.ps
@@ -8,46 +8,50 @@ ppe_ssao_blur.ps
 #include <../struct.h>
 #include <../mtrl.h>
 
-half4 PixelSize;
+//##########################################################################
 
-sampler2D DepthMap:register(s0);
-sampler2D BlurMap:register(s1);
-sampler2D ScreenMap:register(s2);
+half4 g_vPixelSize;
+half2 g_vNearFar;
 
-half2 NearFar;
+//##########################################################################
 
-half4 main(vs_out_pp IN) : COLOR0
+sampler2D g_sDepth:register(s0);
+sampler2D g_sBlur:register(s1);
+sampler2D g_sColor:register(s2);
+
+//##########################################################################
+
+half4 main(VSO_PP IN) : COLOR0
 {
-	half2 BlurOffset = PixelSize;
-	half2 CenterTC = IN.TexUV;
+	half2 vCenterTC = IN.vTexUV;
 
-	half SumWeight = 0.125f;
-	half4 Color = tex2D(BlurMap,CenterTC) * SumWeight;
+	half fSumWeight = 0.125f;
+	half4 vColor = tex2D(g_sBlur, vCenterTC) * fSumWeight;
 
-	half CenterDepth = tex2D(DepthMap, CenterTC).r * NearFar.y;
+	half fCenterDepth = tex2D(g_sDepth, vCenterTC).r * g_vNearFar.y;
 
+	[unroll]
+	for(half x=-2;x<=2;x++)
+	{
 		[unroll]
-		for(half x=-1;x<=1;x++)
+		for(half y=-2;y<=2;y++)
 		{
-				[unroll]
-				for(half y=-1;y<=1;y++)
-				{
-					half2 SampleTC = CenterTC + half2(x * PixelSize.x,y * PixelSize.y);
-					half Depth = tex2D(DepthMap, SampleTC).r;
-					Depth *= NearFar.y;
-					half Diff = 9.f*(1.f - Depth/CenterDepth);
-					half Weight = saturate(0.5f - 0.75f*abs(Diff) - 0.25f*(Diff));
-					Color += tex2D(BlurMap,SampleTC) * Weight;
-					SumWeight += Weight;
-				}
+			half2 SampleTC = vCenterTC + half2(x * g_vPixelSize.x,y * g_vPixelSize.y);
+			half fDepth = tex2D(g_sDepth, SampleTC).r;
+			fDepth *= g_vNearFar.y;
+			half fDiff = 9.0 * (1.0 - fDepth/fCenterDepth);
+			half Weight = saturate(0.5 - 0.75 * abs(fDiff) - 0.25 * (fDiff));
+			vColor += tex2D(g_sBlur,SampleTC) * Weight;
+			fSumWeight += Weight;
 		}
+	}
 
-	Color /= SumWeight;
-	//return tex2D(BlurMap,IN.TexUV);//saturate(Color);
+	vColor /= fSumWeight;
+	
 	#if defined(_BLEND_COLOR_)
-	half4 ScreenColor = tex2D(ScreenMap,IN.TexUV);
-	return ScreenColor*saturate(Color);
+	half4 ScreenColor = tex2D(g_sColor,IN.vTexUV);
+	return ScreenColor * saturate(vColor.r);
 	#else
-	return saturate(Color);
+	return saturate(vColor);
 	#endif
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/ppe/ppe_sun_render.ps b/build/gamesource/shaders/ppe/ppe_sun_render.ps
index 8cd0d344c6b2d02bdcc6a6cbb369d30c1f450f12..7b048244583b99ce60faae905a24a19de234f38a 100644
--- a/build/gamesource/shaders/ppe/ppe_sun_render.ps
+++ b/build/gamesource/shaders/ppe/ppe_sun_render.ps
@@ -7,43 +7,39 @@ ppe_sun_render.ps
 #include <../struct.h>
 #include <../mtrl.h>
 
-sampler2D DepthSampler:register(s0);
-sampler2D SunSampler:register(s2);
-sampler2D BaseSampler:register(s3);
+//##########################################################################
 
-half4 LightPos;
-half2 SizeMap;
-half2 SizeTexSun;
-half4 LightColor;
-//half2 NearFar;
+sampler2D g_sDepth:register(s0);
+sampler2D g_sSun:register(s2);
+sampler2D g_sColor:register(s3);
 
-half4 main(vs_out_pp IN) : COLOR0
+//##########################################################################
+
+half4 g_vLightPos;
+half2 g_vSizeMap;
+half2 g_vSizeTexSun;
+half4 g_vLightColor;
+
+//##########################################################################
+
+half4 main(VSO_PP IN) : COLOR0
 {
-	half4 colorsun = 0.f;
-	half4 screen = tex2D(BaseSampler, IN.TexUV);
-	half2 SunPosProj = LightPos.xy;
+	half2 vSunPosProj = g_vLightPos.xy;
 	
-	half depth = tex2D(DepthSampler, IN.TexUV).r;
-	
-	clip(depth - 0.999f);
+	half fDepth = tex2D(g_sDepth, IN.vTexUV).r;
+	clip(fDepth - 0.999);
 
-	half2 ntc = IN.TexUV;
+	half2 vNewTC = IN.vTexUV;
 	
-	ntc.y *= SizeMap.y/SizeMap.x;
-	SunPosProj.y *= SizeMap.y/SizeMap.x;
+	vNewTC.y *= g_vSizeMap.y/g_vSizeMap.x;
+	vSunPosProj.y *= g_vSizeMap.y/g_vSizeMap.x;
 
-	half2 fSunTexUV = ((((ntc - SunPosProj)*SizeMap.x) + SizeTexSun*0.5f) / SizeTexSun);
+	half2 fSunTexUV = ((((vNewTC - vSunPosProj) * g_vSizeMap.x) + g_vSizeTexSun * 0.5) / g_vSizeTexSun);
 	
-	half4 texColor = tex2D(SunSampler, fSunTexUV);
-	//clip(texColor.a - 0.001f);
-	//screen.a *= 1.f - depth;
-
-	texColor.rgb *= saturate(LightColor.rgb*2);
-	texColor.rgb = lerp(texColor.rgb,LightColor.rgb,0.5f/*saturate(LightColor.a*2)*/);
-	//texColor.rgb = lerp(texColor.rgb,screen.rgb,1.f-texColor.a);
-	//colorsun.rgb = lerp(screen.rgb,texColor.rgb,1.f-screen.a);
+	half4 vTexColor = tex2D(g_sSun, fSunTexUV);
 
-	//texColor.a = screen.a;
+	vTexColor.rgb *= saturate(g_vLightColor.rgb * 2.0);
+	vTexColor.rgb = lerp(vTexColor.rgb, g_vLightColor.rgb, 0.5);
 
-	return texColor;
+	return vTexColor;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/ppgensm/ppgensm_direct.ps b/build/gamesource/shaders/ppgensm/ppgensm_direct.ps
index e46a7039fa1ac132f12a00207a1598ce94c3b565..a03ea2fb264d310b630f977343ce504d548d6a78 100644
--- a/build/gamesource/shaders/ppgensm/ppgensm_direct.ps
+++ b/build/gamesource/shaders/ppgensm/ppgensm_direct.ps
@@ -5,50 +5,52 @@ ppgensm_direct.ps
 */
 
 #include <../struct.h>
+#include <../shadow.h>
 #include <../mtrl.h>
+#include <../ps.h>
 
-half3 PosCam;
-//half2 NearFar;
-half2 PixelSize;
-half3 SizeMapBias;
+//##########################################################################
 
-sampler2D DepthLinearSampler:register(s0);
-sampler2D DepthSampler1:register(s1);
-sampler2D NoiseSampler:register(s2);
+half3 g_vPosCam;
+half2 g_vPixelSize;
+half3 g_vSizeMapBias;
+half4x4	g_mMatrixTexture;
 
-half4x4	MatrixTexture;
+//##########################################################################
 
-half4 main(vs_out_res_pos IN):COLOR0
+sampler2D g_sDepthView:register(s0);
+sampler2D g_sDepthShadow:register(s1);
+
+//##########################################################################
+
+half4 main(VSO_ResPos IN):COLOR0
 {
-	half ShadowTerm = 0.0f;
+	half fShadow = 0.0f;
 	
-	half tmpdepth = tex2D(DepthLinearSampler,IN.TexUV).r;
-	half4 Position = half4(PosCam + IN.WorldRay * tmpdepth,1.f);
-	half4 TexCoord1	= mul(Position, MatrixTexture);
+	half fDepth = tex2D(g_sDepthView,IN.vTexUV).r;
+	half4 vPixelPos = half4(g_vPosCam + IN.vWorldRay * fDepth,1.f);
+	half4 vTexCoord	= mul(vPixelPos, g_mMatrixTexture);
+	vTexCoord.xyz = vTexCoord.xyz / vTexCoord.w;
 	
-	half3 ShadowTexC;
-	ShadowTexC.xyz = TexCoord1.xyz / TexCoord1.w;
-	
-	[branch]if(!(ShadowTexC.x <= 1.f && ShadowTexC.y <= 1.f && ShadowTexC.x >= 0.f && ShadowTexC.y >= 0.f))
+	[branch]if(!(vTexCoord.x <= 1.f && vTexCoord.y <= 1.f && vTexCoord.x >= 0.f && vTexCoord.y >= 0.f))
 		clip(-1);
-		
-	half2 jitter = ((tex2D(NoiseSampler, ShadowTexC.xy * SHADOWGEN_JITTER_SCALE).xy * 2.0f - 1.0f) * PixelSize);
-	ShadowTerm += tex2D(DepthSampler1, ShadowTexC.xy + jitter).x									+ SizeMapBias.z < ShadowTexC.z ? 0.0f : 1.0f;
-	ShadowTerm += tex2D(DepthSampler1, ShadowTexC.xy + half2(0, PixelSize.y) + jitter).x			+ SizeMapBias.z < ShadowTexC.z ? 0.0f : 1.0f;
-	ShadowTerm += tex2D(DepthSampler1, ShadowTexC.xy + half2(PixelSize.x, 0) + jitter).x			+ SizeMapBias.z < ShadowTexC.z ? 0.0f : 1.0f;
-	ShadowTerm += tex2D(DepthSampler1, ShadowTexC.xy + half2(PixelSize.x, PixelSize.y) + jitter).x	+ SizeMapBias.z < ShadowTexC.z ? 0.0f : 1.0f;
+	
+	fShadow += ShadowCalcShading(tex2D(g_sDepthShadow, vTexCoord.xy).x, vTexCoord.z, g_vSizeMapBias.z);
+	fShadow += ShadowCalcShading(tex2D(g_sDepthShadow, vTexCoord.xy + half2(0, g_vPixelSize.y)).x, vTexCoord.z, g_vSizeMapBias.z);
+	fShadow += ShadowCalcShading(tex2D(g_sDepthShadow, vTexCoord.xy + half2(g_vPixelSize.x, 0)).x, vTexCoord.z, g_vSizeMapBias.z);
+	fShadow += ShadowCalcShading(tex2D(g_sDepthShadow, vTexCoord.xy + half2(g_vPixelSize.x, g_vPixelSize.y)).x, vTexCoord.z, g_vSizeMapBias.z);
 
 	#ifdef GSD_9
-	ShadowTerm += tex2D(DepthSampler1, ShadowTexC.xy + half2(-PixelSize.x, 0.0) + jitter).x				+ SizeMapBias.z < ShadowTexC.z ? 0.0f : 1.0f;
-	ShadowTerm += tex2D(DepthSampler1, ShadowTexC.xy + half2(PixelSize.x, -PixelSize.y) + jitter).x		+ SizeMapBias.z < ShadowTexC.z ? 0.0f : 1.0f;
-	ShadowTerm += tex2D(DepthSampler1, ShadowTexC.xy + half2(-PixelSize.x, PixelSize.y) + jitter).x		+ SizeMapBias.z < ShadowTexC.z ? 0.0f : 1.0f;
-	ShadowTerm += tex2D(DepthSampler1, ShadowTexC.xy + half2(0.0, -PixelSize.y) + jitter).x				+ SizeMapBias.z < ShadowTexC.z ? 0.0f : 1.0f;
-	ShadowTerm += tex2D(DepthSampler1, ShadowTexC.xy + half2(-PixelSize.x, -PixelSize.y) + jitter).x	+ SizeMapBias.z < ShadowTexC.z ? 0.0f : 1.0f;
+	fShadow += ShadowCalcShading(tex2D(g_sDepthShadow, vTexCoord.xy + half2(-g_vPixelSize.x, 0)).x, vTexCoord.z, g_vSizeMapBias.z);
+	fShadow += ShadowCalcShading(tex2D(g_sDepthShadow, vTexCoord.xy + half2(g_vPixelSize.x, -g_vPixelSize.y)).x, vTexCoord.z, g_vSizeMapBias.z);
+	fShadow += ShadowCalcShading(tex2D(g_sDepthShadow, vTexCoord.xy + half2(-g_vPixelSize.x, g_vPixelSize.y)).x, vTexCoord.z, g_vSizeMapBias.z);
+	fShadow += ShadowCalcShading(tex2D(g_sDepthShadow, vTexCoord.xy + half2(0, -g_vPixelSize.y)).x, vTexCoord.z, g_vSizeMapBias.z);
+	fShadow += ShadowCalcShading(tex2D(g_sDepthShadow, vTexCoord.xy + half2(-g_vPixelSize.x, -g_vPixelSize.y)).x, vTexCoord.z, g_vSizeMapBias.z);
 
-	ShadowTerm *= 0.111;
+	fShadow *= 0.111;
 	#else
-	ShadowTerm *= 0.25;
+	fShadow *= 0.25;
 	#endif
 
-	return saturate(ShadowTerm);
+	return saturate(fShadow);
 } 
\ No newline at end of file
diff --git a/build/gamesource/shaders/ppgensm/ppgensm_point.ps b/build/gamesource/shaders/ppgensm/ppgensm_point.ps
index bd143d9afb0619f0ceb1cb739f6243a6a43aa27c..ff854b456e9f1d2e5e83fa5ebf3dbe2e711c771f 100644
--- a/build/gamesource/shaders/ppgensm/ppgensm_point.ps
+++ b/build/gamesource/shaders/ppgensm/ppgensm_point.ps
@@ -5,38 +5,41 @@ ppgensm_point.ps
 */
 
 #include <../struct.h>
+#include <../shadow.h>
 #include <../mtrl.h>
+#include <../ps.h>
 
-half3 PosCam;
-//half2 NearFar;
-half2 SizeMapBias;
-half PixelSize;
-half3 LightPos;
+//##########################################################################
 
-sampler2D DepthLinearSampler:register(s0);
-samplerCUBE DepthSampler1:register(s1);
-sampler2D NoiseSampler:register(s2);
+half3 g_vPosCam;
+half2 g_vSizeMapBias;
+half g_fPixelSize;
+half3 g_vLightPos;
+half4x4	g_vMatrixTexture;
 
-half4x4	MatrixTexture;
+//##########################################################################
 
-half4 main(vs_out_res_pos IN):COLOR0
+sampler2D g_sDepthView:register(s0);
+samplerCUBE g_sDepthShadow:register(s1);
+
+//##########################################################################
+
+half4 main(VSO_ResPos IN):COLOR0
 {
-	half ShadowTerm = 0.0f;
+	half fShadow = 0.0;
 	
-	half tmpdepth = tex2Dlod(DepthLinearSampler,half4(IN.TexUV,0,0)).r;
+	half fDepth = tex2Dlod2(g_sDepthView, IN.vTexUV, 0).r;
 	
-	half4 Position = half4(PosCam + IN.WorldRay * (tmpdepth),1.f);
+	half4 vPosition = half4(g_vPosCam + IN.vWorldRay * fDepth, 1.0);
 	
-	half3 PLightDirection = 0.0f;
-    PLightDirection = LightPos - Position.xyz;
-    half distance = length(PLightDirection);
-	half ddist = 1.f/distance;
-
-	half3 jitter = half3(0,0,0);//(normalize(tex2D(NoiseSampler, -PLightDirection.xy*ddist * SHADOWGEN_JITTER_SCALE).xyz * 2.0 - 1.0 )*0.01);
-	half3 tmpcoord = PLightDirection.xyz;
-	tmpcoord.xyz += jitter;
+	half3 vDir = g_vLightPos - vPosition.xyz;
+    half fDistance = length(vDir);
+	half fDivDist = 1.0/fDistance;
+
+	half3 vTexUV = vDir.xyz;
 	
-	ShadowTerm = (texCUBE( DepthSampler1 , -(tmpcoord)*ddist ).x + SizeMapBias.y) > distance ? 1 : 0;
+	//fShadow = (texCUBE(g_sDepthShadow , -(vTexUV) * fDivDist ).x + g_vSizeMapBias.y) > fDistance ? 1 : 0;
+	fShadow = ShadowCalcShading(texCUBE(g_sDepthShadow , -(vTexUV) * fDivDist).x, fDistance, g_vSizeMapBias.y);
 	
 	#ifdef GSC_6
 	for(int x=0;x<=1;++x)
@@ -45,14 +48,15 @@ half4 main(vs_out_res_pos IN):COLOR0
 		{
 			for(int z=0;z<=1;++z)
 			{
-				tmpcoord = PLightDirection + half3(PixelSize*x, PixelSize*y,PixelSize*z) + jitter;
-				ShadowTerm += texCUBE(DepthSampler1, -(tmpcoord)*ddist).x + SizeMapBias.y < distance ? 0 : 1;
+				vTexUV = vDir + half3(g_fPixelSize * x, g_fPixelSize * y, g_fPixelSize * z);
+				//fShadow += texCUBE(g_sDepthShadow, -(vTexUV) * fDivDist).x + g_vSizeMapBias.y < fDistance ? 0 : 1;
+				fShadow += ShadowCalcShading(texCUBE(g_sDepthShadow , -(vTexUV) * fDivDist).x, fDistance, g_vSizeMapBias.y);
 			}
 		}
 	}
 	
-	ShadowTerm *= 0.125;
+	fShadow *= 0.125;
 	#endif
 
-	return saturate(ShadowTerm);
+	return saturate(fShadow);
 } 
\ No newline at end of file
diff --git a/build/gamesource/shaders/ppgensm/ppgensm_pssm.ps b/build/gamesource/shaders/ppgensm/ppgensm_pssm.ps
index fcf37111b2984720ca66e4bce9b885bf271ce674..56aa54a561758689df5081869190ac8029be8f1c 100644
--- a/build/gamesource/shaders/ppgensm/ppgensm_pssm.ps
+++ b/build/gamesource/shaders/ppgensm/ppgensm_pssm.ps
@@ -5,171 +5,127 @@ ppgensm_pssm.ps
 */
 
 #include <../struct.h>
+#include <../shadow.h>
 #include <../mtrl.h>
+#include <../ps.h>
 
-half3 PosCam;
-half4 DistSplit;
-half2 NearFar;
-half2 PixelSize;
+//##########################################################################
 
-sampler2D DepthLinearSampler:register(s0);
-sampler2D DepthSampler1:register(s1);
-sampler2D DepthSampler2:register(s2);
-sampler2D DepthSampler3:register(s3);
-sampler2D DepthSampler4:register(s4);
-sampler2D DepthSampler5:register(s5);
-sampler2D NoiseSampler:register(s6);
+//! позиция наблюдателя
+half3 g_vPosCam;
 
-half4x4 InvViewProj;
+//! дистанции до концов каждого сплита
+half4 g_vDistSplit;
 
-half4x4 MatrixTexture1;
-half4x4 MatrixTexture2;
-half4x4 MatrixTexture3;
-half4x4 MatrixTexture4;
-half4x4 MatrixTexture5;
+//! ближняя и дальняя плоскости
+half2 g_vNearFar;
 
+//! размеры пикселей
+half2 g_vPixelSize;
 
-half4 main(vs_out_res_pos IN):COLOR0
+half4x4 g_aMatrixTexture[5];
+
+//! позиция пикселя в пространстве света
+static half4 g_vTexCoord[5];
+
+//! смещение глубины для каждого сплита
+static half g_aBias[4] = {0.00001, 0.00009, 0.0003, 0.001};
+
+//##########################################################################
+
+sampler2D g_sDepthView:register(s0);
+sampler2D g_sNormals:register(s6);
+
+texture2D g_sDepthShadow0:register(s1);
+texture2D g_sDepthShadow1:register(s2);
+texture2D g_sDepthShadow2:register(s3);
+texture2D g_sDepthShadow3:register(s4);
+texture2D g_sDepthShadow4:register(s5);
+
+sampler2D g_aDepthShadow[5] = 
+{
+	sampler_state{Texture = <g_sDepthShadow0>;}, 
+	sampler_state{Texture = <g_sDepthShadow1>;},
+	sampler_state{Texture = <g_sDepthShadow2>;}, 
+	sampler_state{Texture = <g_sDepthShadow3>;},
+	sampler_state{Texture = <g_sDepthShadow4>;}
+};
+
+//##########################################################################
+
+//! считает есть ли тень для данного сплита текущего пикселя
+half GetShadow(int iSplit)
 {
-	half ShadowTerm = 0.0f;
-	half4 tmpcoord;
-	half Depth;
-	half tmpShadowTerm = 0;
-	half fDepth = tex2Dlod(DepthLinearSampler,half4(IN.TexUV,0,0)).r;;
+	half fShadow = 0.0;
+	half2 vTexUV = half2(0,0);
+	half fDepth;
 	
-	half4 Position = half4(PosCam + IN.WorldRay * (fDepth),1.f);
+	[unroll]for(int x=-1; x<=1; x++)
+	{
+		[unroll]for(int y=-1; y<=1; y++)
+		{
+			vTexUV = g_vTexCoord[iSplit].xy + half2(x * g_vPixelSize.x, y * g_vPixelSize.y);
+			fDepth = tex2Dlod2(g_aDepthShadow[iSplit], vTexUV, 0).r; 
+
+			fShadow += ShadowCalcShading(fDepth, g_vTexCoord[iSplit].z, g_aBias[iSplit]);
+		}
+	}
+
+	return (fShadow / 9.0);
+}
+
+//##########################################################################
 
-	half4 TexCoord1	= mul(Position, MatrixTexture1);
-	half4 TexCoord2	= mul(Position, MatrixTexture2);
-	half4 TexCoord3	= mul(Position, MatrixTexture3);
+half4 main(VSO_ResPos IN):COLOR0
+{
+	half fShadow = 0.0;
+	half fDepth = tex2Dlod(g_sDepthView, half4(IN.vTexUV,0,0)).r;
+	
+	half3 vNormal = Color2Normal(tex2Dlod(g_sNormals, half4(IN.vTexUV,0,0)).rgb);
+	
+	half4 vPosition = half4(g_vPosCam + IN.vWorldRay * fDepth, 1.0);
+	vPosition.xyz = ShadowPosScopeBias(vPosition.xyz, vNormal);
+	
+	g_vTexCoord[0]	= mul(vPosition, g_aMatrixTexture[0]);
+	g_vTexCoord[1]	= mul(vPosition, g_aMatrixTexture[1]);
+	g_vTexCoord[2]	= mul(vPosition, g_aMatrixTexture[2]);
 	
 	#if	!defined(SPLITS3)
-	half4 TexCoord4	= mul(Position, MatrixTexture4);
+	g_vTexCoord[3]	= mul(vPosition, g_aMatrixTexture[3]);
 	#endif
 	
-	half4 TexCoord5	= mul(Position, MatrixTexture5);
+	g_vTexCoord[4]	= mul(vPosition, g_aMatrixTexture[4]);
 	
-	half alphaskyclouds = 0;
+	//тень от облаков
+	half fShadowSky = 1.f - tex2Dlod2(g_aDepthShadow[4], g_vTexCoord[4].xy, 0).r;
+	fShadowSky = fShadowSky * fShadowSky * fShadowSky;
 	
-		for(int x=-1;x<=1;x++)
-		{
-				for(int y=-1;y<=1;y++)
-				{
-					tmpcoord = TexCoord5;
-					tmpcoord.xy += half2(x*PixelSize.x, y*PixelSize.y);
-					alphaskyclouds += 1.f-tex2Dlod(DepthSampler5, tmpcoord).r; 
-				}
-		}
-				
-	alphaskyclouds /= 9.f;
 	
-	half l = fDepth*NearFar.y;
+	half fDistance = fDepth * g_vNearFar.y;
 	
+	//затухание теней
 	half fAttenuation = 1.f;
 	
 	#ifdef SPLITS3
-	fAttenuation = saturate(l / DistSplit.z);
+	fAttenuation = saturate(fDistance / g_vDistSplit[2]);
 	#else
-	fAttenuation = saturate(l / DistSplit.w);
+	fAttenuation = saturate(fDistance / g_vDistSplit[3]);
 	#endif
-
-	half dx1 = max(abs(ddx(TexCoord1.z)),abs(ddy(TexCoord1.z)));
-	half dx2 = max(abs(ddx(TexCoord2.z)),abs(ddy(TexCoord2.z)));
-	half dx3 = max(abs(ddx(TexCoord3.z)),abs(ddy(TexCoord3.z)));
 	
+	[branch]if(fDistance >= 0.0 && fDistance < g_vDistSplit[0])
+		fShadow = GetShadow(0);
+	else [branch]if(fDistance >= 0.0 && fDistance < g_vDistSplit[1])
+		fShadow = GetShadow(1);
+	else [branch]if(fDistance >= 0.0 && fDistance < g_vDistSplit[2])
+		fShadow = GetShadow(2);
+		
 	#if	!defined(SPLITS3)
-	half dx4 = max(abs(ddx(TexCoord4.z)),abs(ddy(TexCoord4.z)));
+	else [branch]if(fDistance >= 0.0 && fDistance < g_vDistSplit[3])
+		fShadow = GetShadow(3);
 	#endif
 	
-		[branch]if(l >= 0.0 && l < DistSplit.x)
-		{
-				for(int x=-1;x<=1;x++)
-				{
-						for(int y=-1;y<=1;y++)
-						{
-							tmpcoord = TexCoord1;
-							tmpcoord.xy += half2(x*PixelSize.x, y*PixelSize.y);
-							Depth = tex2Dlod(DepthSampler1, tmpcoord).r; 
-							tmpShadowTerm = 1.f-((TexCoord1.z) - Depth);
-							tmpShadowTerm = pow(pow(pow(tmpShadowTerm,60),72),104);
-							tmpShadowTerm /= dx1*dx1;
-
-							ShadowTerm += ((Depth + tmpShadowTerm) < TexCoord1.z) ? 0.0f : 1.0f;
-						}
-				}
-			ShadowTerm /= 9.f;
-		}
-		else [branch]if(l >= 0.0 && l < DistSplit.y)
-		{
-				for(int x=-1;x<=1;x++)
-				{
-						for(int y=-1;y<=1;y++)
-						{
-							tmpcoord = TexCoord2;
-							tmpcoord.xy += half2(x*PixelSize.x, y*PixelSize.y);
-							Depth = tex2Dlod(DepthSampler2, tmpcoord).r; 
-							tmpShadowTerm = 1.f-((TexCoord2.z) - Depth);
-							tmpShadowTerm = pow(pow(pow(tmpShadowTerm,36),48),80);
-							tmpShadowTerm /= dx2*dx2;
-
-							ShadowTerm += ((Depth + tmpShadowTerm) < TexCoord2.z) ? 0.0f : 1.0f;
-						}
-				}
-			ShadowTerm /= 9.f;
-		}
-		else [branch]if(l >= 0.0 && l < DistSplit.z)
-		{
-				for(int x=-1;x<=1;x++)
-				{
-						for(int y=-1;y<=1;y++)
-						{
-							tmpcoord = TexCoord3;
-							tmpcoord.xy += half2(x*PixelSize.x, y*PixelSize.y);
-							Depth = tex2Dlod(DepthSampler3, tmpcoord).r; 
-							tmpShadowTerm = 1.f-((TexCoord3.z) - Depth);
-							tmpShadowTerm = pow(pow(pow(tmpShadowTerm,24),36),68);
-							tmpShadowTerm /= dx3*dx3;
-
-							ShadowTerm += ((Depth + tmpShadowTerm) < TexCoord3.z) ? 0.0f : 1.0f;
-						}
-				}
-			ShadowTerm /= 9.f;
-			
-			/*#ifdef SPLITS3
-			half coefz = (l - DistSplit.y) / (DistSplit.z - DistSplit.y);
-			ShadowTerm = lerp(ShadowTerm,PSSM_SHADING_LAST,coefz);
-			#endif*/
-			
-			//ShadowTerm = 0;
-		}
-		
-		#if	!defined(SPLITS3)
-		else [branch]if(l >= 0.0 && l < DistSplit.w)
-		{
-			for(int x=-1;x<=1;x++)
-				{
-						for(int y=-1;y<=1;y++)
-						{
-							tmpcoord = TexCoord4;
-							tmpcoord.xy += half2(x*PixelSize.x, y*PixelSize.y);
-							Depth = tex2Dlod(DepthSampler4, tmpcoord).r; 
-							tmpShadowTerm = 1.f-((TexCoord4.z) - Depth);
-							tmpShadowTerm = pow(pow(pow(tmpShadowTerm,12),24),56);
-							tmpShadowTerm /= dx4*dx4;
-
-							ShadowTerm += ((Depth + tmpShadowTerm) < TexCoord4.z) ? 0.0f : 1.0f;
-						}
-				}
-			ShadowTerm /= 9.f;
-
-			/*half coefz = (l - DistSplit.z) / (DistSplit.w - DistSplit.z);
-			ShadowTerm = lerp(saturate(ShadowTerm),PSSM_SHADING_LAST,coefz);*/
-		}
-		#endif
-		else
-		{
-			ShadowTerm = PSSM_SHADING_LAST;
-		}
+	else
+		fShadow = PSSM_SHADING_LAST;
 			
-	return (saturate(alphaskyclouds*(ShadowTerm * (1.f - fAttenuation))));
+	return saturate(fShadowSky*(fShadow * (1.f - fAttenuation)));
 } 
\ No newline at end of file
diff --git a/build/gamesource/shaders/pptm/pptm_calc_adapted_lum.ps b/build/gamesource/shaders/pptm/pptm_calc_adapted_lum.ps
index 7ff1094ae2cdb51c44fde19db1ce2ab18a0e1103..69cd278336cf569cbd49e27da3f29a502ad87a2c 100644
--- a/build/gamesource/shaders/pptm/pptm_calc_adapted_lum.ps
+++ b/build/gamesource/shaders/pptm/pptm_calc_adapted_lum.ps
@@ -7,21 +7,27 @@ pptm_calc_adapted_lum.ps
 #include <../struct.h>
 #include <pptm_common.h>
 
-sampler2D s0:register(s0);
-sampler2D s1:register(s1);
+//##########################################################################
 
-half ElapsedTime;
+//! предыдущее значение адаптации глаза к свету
+sampler2D g_sPrevAdapted:register(s0);
 
-half4 main(vs_out_pp IN) : COLOR0
+//! текущее значение общей освещенности
+sampler2D g_sCurrLum:register(s1);
+
+//##########################################################################
+
+//! текущее время кадра * facor привыкания к освещению, в секундах
+half g_fElapsedTime;
+
+//##########################################################################
+
+half4 main(VSO_PP IN) : COLOR0
 {
-	half AdaptedLum = (tex2D(s0, TexUV_Center));
-	half CurrLum = sqrt(HDRLumFloor + tex2D(s1, TexUV_Center));
+	half g_fAdaptedLum = (tex2D(g_sPrevAdapted, g_vTexUVcenter));
+	half g_fCurrLum = sqrt(g_sLumFloor + tex2D(g_sCurrLum, g_vTexUVcenter));
 	
-	return half4(pow( 
-				pow(
-					AdaptedLum, 0.25f) + ( 
-											pow(CurrLum, 0.25f) - pow(AdaptedLum, 0.25f) 
-										) * 
-					(1.f - pow(0.9785f, ElapsedTime)), 
-				4.f),0.f,0.f,1.f);
+	return half4(
+				pow(pow(g_fAdaptedLum, 0.25) + (pow(g_fCurrLum, 0.25) - pow(g_fAdaptedLum, 0.25)) * (1.f - pow(0.9785, g_fElapsedTime)), 4.0),
+				0.0, 0.0, 1.0);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/pptm/pptm_common.h b/build/gamesource/shaders/pptm/pptm_common.h
index 7b651eccf64d62985b07f685310b9ce58151c61a..3b03303f2fa4efb92db8d55c22d9f9d14ab69158 100644
--- a/build/gamesource/shaders/pptm/pptm_common.h
+++ b/build/gamesource/shaders/pptm/pptm_common.h
@@ -4,8 +4,13 @@ pptm_common.h
 Основные данные для tone mapping
 */
 
-static const half3 HDRLumsWeights = half3(0.298f, 0.585f, 0.117f);
-static half HDRLumFloor = 0.05f * 0.05f;
+//! веса с которыми будут браться цвета сцены для выявления общей освещенности
+static const half3 g_sLumsWeights = half3(0.298, 0.585, 0.117);
 
-static const int HDR_MAX_SAMPLES = 16;
-half2 ArrOffsets[HDR_MAX_SAMPLES];
\ No newline at end of file
+//! значение добавляемое к текущей общей освещенности, чем меньше тем светлее, и наоборот, (0, 1)
+static half g_sLumFloor = 0.0025;
+
+#define HDR_MAX_SAMPLES 16
+
+//! смещения для выборки
+half2 g_aOffsets[HDR_MAX_SAMPLES];
\ No newline at end of file
diff --git a/build/gamesource/shaders/pptm/pptm_lum_init.ps b/build/gamesource/shaders/pptm/pptm_lum_init.ps
index efec2f278c8ace6c2143a704dedeef0a7d49cdc3..8b35fdbf9d92ed4a6470f7748e651651efbeda4c 100644
--- a/build/gamesource/shaders/pptm/pptm_lum_init.ps
+++ b/build/gamesource/shaders/pptm/pptm_lum_init.ps
@@ -1,28 +1,30 @@
 
 /*
 pptm_lum_init.ps
-ѕервоначальное заполнение текстуры данными дл¤ tone mapping
+первоначальное заполнение текстуры данными для tone mapping
 */
 
 #include <../struct.h>
 #include <pptm_common.h>
 
-sampler2D s0:register(s0);
+//##########################################################################
 
-half4 main(vs_out_pp IN) : COLOR0
+sampler2D g_sColor:register(s0);
+
+//##########################################################################
+
+half4 main(VSO_PP IN) : COLOR0
 {
-    half3 color = 0.0f;
-    half res = 0.0f;
-	half tmpcolor;
+    half3 vColor = 0.0f;
+    half vResult = 0.0f;
 
     for(int i = 0; i < 16; ++i)
     {
-        color = tex2D(s0, IN.TexUV+ArrOffsets[i]).rgb;
-		tmpcolor =  dot(color, HDRLumsWeights);
-        res += tmpcolor * tmpcolor;
+        vColor = tex2D(g_sColor, IN.vTexUV + g_aOffsets[i]).rgb;
+		vResult += pow(dot(vColor, g_sLumsWeights), 2);
     }
     
-    res *= 0.0625f;
+    vResult *= 0.0625;
 	
-    return half4(res,0.f,0.f,1.f);
+    return half4(vResult, 0.0, 0.0, 1.0);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/pptm/pptm_lum_iterative.ps b/build/gamesource/shaders/pptm/pptm_lum_iterative.ps
index 21280eaa2542c590a2d3e9b88e32c3dccb8c9651..c049a3a49bc20d8745a8e50e33530fff104c03be 100644
--- a/build/gamesource/shaders/pptm/pptm_lum_iterative.ps
+++ b/build/gamesource/shaders/pptm/pptm_lum_iterative.ps
@@ -7,15 +7,19 @@ pptm_lum_iterative.ps
 #include <../struct.h>
 #include <pptm_common.h>
 
+//##########################################################################
+
 sampler2D s0:register(s0);
 
-half4 main(vs_out_pp IN) : COLOR0
+//##########################################################################
+
+half4 main(VSO_PP IN) : COLOR0
 {
 	half res = 0.0f;
     
     for(int i = 0; i < 16; ++i)
     {
-		res += tex2D(s0, IN.TexUV+ArrOffsets[i]);
+		res += tex2D(s0, IN.vTexUV + g_aOffsets[i]);
     }
 	
     res *= 0.0625;
diff --git a/build/gamesource/shaders/ps.h b/build/gamesource/shaders/ps.h
new file mode 100644
index 0000000000000000000000000000000000000000..9115419f9c04168d814cbdeb954cc5b22596c07f
--- /dev/null
+++ b/build/gamesource/shaders/ps.h
@@ -0,0 +1,6 @@
+
+//! обертка tex2Dlod
+half4 tex2Dlod2(sampler2D oSampler, half2 vTexUV, int iLod)
+{
+	return tex2Dlod(oSampler, half4(vTexUV,0.f,iLod));
+}
\ No newline at end of file
diff --git a/build/gamesource/shaders/shadow.h b/build/gamesource/shaders/shadow.h
new file mode 100644
index 0000000000000000000000000000000000000000..7ebc953f44fe4b70be9f432e50e4c5a80518dfec
--- /dev/null
+++ b/build/gamesource/shaders/shadow.h
@@ -0,0 +1,33 @@
+
+/*
+shadow.h
+функции для теней
+*/
+
+//! альфа тест при записи глубины для теней
+half4 ShadowDepthAlphaTest(half4 vColor)
+{
+	clip(vColor.a - SHADOW_DEPTH_ALPHATEST_VALUE);
+	vColor.a = 1.f;
+	return vColor;
+}
+
+//! смещение позиции по нормали
+half3 ShadowPosScopeBias(half3 vPosition, half3 vNormal)
+{
+	return (vPosition.xyz + vNormal * SHADOW_SCOPE_BIAS);
+}
+
+/*! смещение на основании slope, источник: https://gamedev.stackexchange.com/questions/65739/use-depth-bias-for-shadows-in-deferred-shading
+надо будет посмотреть http://developer.amd.com/wordpress/media/2012/10/Isidoro-ShadowMapping.pdf
+*/
+half3 ShadowSlopeBias(half fDepth)
+{
+	return max(abs(ddx(fDepth)),abs(ddy(fDepth))) * SHADOW_SLOPE_SCALE + SHADOW_SLOPE_BIAS;
+}
+
+//! расчет тени
+half ShadowCalcShading(half fDepth0, half fDepth1, half fBias)
+{
+	return (((fDepth0 + fBias) < fDepth1) ? 0.0f : 1.0f);
+}
\ No newline at end of file
diff --git a/build/gamesource/shaders/skin.h b/build/gamesource/shaders/skin.h
index cd7aee7f80614df26c59c0756ff5b8e220a02281..30f6c5b68e6cd1eeaa0befbf8896529352c5af26 100644
--- a/build/gamesource/shaders/skin.h
+++ b/build/gamesource/shaders/skin.h
@@ -22,53 +22,53 @@ half3 SkinRotateVec(half4 q, half3 p)
 	return(oout);
 }
 
-vs_out_gcommon SkinBoneTransform(uint iBone, half weight, vs_in_anim v)
+VSO_SceneCommon SkinBoneTransform(uint iBone, half weight, VSI_Animation v)
 {
-	vs_out_gcommon Output = (vs_out_gcommon)0;
+	VSO_SceneCommon Output = (VSO_SceneCommon)0;
 	iBone *= 2;
 	half4 bpos = g_BufferBoneWorld[iBone];
 	half4 q = g_BufferBoneWorld[iBone + 1];
-	Output.Position = half4((SkinRotateVec(q, v.Pos) + bpos) * weight, 1.0);
-	Output.Normal = SkinRotateVec(q, v.Norm) * weight;
+	Output.vPosition = half4((SkinRotateVec(q, v.vPosition) + bpos) * weight, 1.0);
+	Output.vNormal = SkinRotateVec(q, v.vNormal) * weight;
 
 	return(Output);
 }
 
 
-vs_out_gcommon SkinAllTransform(vs_in_anim v)
+VSO_SceneCommon SkinAllTransform(VSI_Animation v)
 {
-	vs_out_gcommon Output = (vs_out_gcommon)0;
-	vs_out_gcommon o = (vs_out_gcommon)0;
+	VSO_SceneCommon Output = (VSO_SceneCommon)0;
+	VSO_SceneCommon o = (VSO_SceneCommon)0;
 	
 	//Bone0
-    uint iBone = v.Bones.x;
-    float fWeight = v.Weights.x;
+    uint iBone = v.vBones.x;
+    float fWeight = v.vWeights.x;
 	o = SkinBoneTransform(iBone, fWeight, v);
-	Output.Position += o.Position;
-	Output.Normal += o.Normal;
+	Output.vPosition += o.vPosition;
+	Output.vNormal += o.vNormal;
     
     //Bone1
-    iBone = v.Bones.y;
-    fWeight = v.Weights.y;
+    iBone = v.vBones.y;
+    fWeight = v.vWeights.y;
 	o = SkinBoneTransform(iBone, fWeight, v);
-	Output.Position += o.Position;
-	Output.Normal += o.Normal;
+	Output.vPosition += o.vPosition;
+	Output.vNormal += o.vNormal;
     
     //Bone2
-    iBone = v.Bones.z;
-    fWeight = v.Weights.z;
+    iBone = v.vBones.z;
+    fWeight = v.vWeights.z;
 	o = SkinBoneTransform(iBone, fWeight, v);
-	Output.Position += o.Position;
-	Output.Normal += o.Normal;
+	Output.vPosition += o.vPosition;
+	Output.vNormal += o.vNormal;
     
     //Bone3
-    iBone = v.Bones.w;
-    fWeight = v.Weights.w;
+    iBone = v.vBones.w;
+    fWeight = v.vWeights.w;
 	o = SkinBoneTransform(iBone, fWeight, v);
-	Output.Position += o.Position;
-	Output.Normal += o.Normal;
+	Output.vPosition += o.vPosition;
+	Output.vNormal += o.vNormal;
 
-	Output.Position.w = 1.0;
+	Output.vPosition.w = 1.0;
 	
 	return(Output);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/sky/sky_box.ps b/build/gamesource/shaders/sky/sky_box.ps
index 6571d5998a3bcbe23d82d0dd8e57493b9a8a3202..f99a95ef5b2ed0060333d5dfed181c33560b4a33 100644
--- a/build/gamesource/shaders/sky/sky_box.ps
+++ b/build/gamesource/shaders/sky/sky_box.ps
@@ -6,17 +6,23 @@ sky_box.ps
 
 #include <../struct.h>
 
-samplerCUBE BaseSkyTexture: register(s0);
-samplerCUBE SecondSkyTexture: register(s1);
+//##########################################################################
 
-half BlendFactor;
-half4 Color;
+samplerCUBE g_sCurrent: register(s0);
+samplerCUBE g_sNext: register(s1);
 
-half4 main(vs_out_skybox IN):COLOR0
+//##########################################################################
+
+half g_fBlendFactor;
+half4 g_vColor;
+
+//##########################################################################
+
+half4 main(VSO_SkyBox IN):COLOR0
 {
-	half4 Color1 = texCUBE(BaseSkyTexture, IN.TexUV);
-	half4 Color2 = texCUBE(SecondSkyTexture, IN.TexUV);
-	half4 FinalColor = lerp(Color1,Color2,BlendFactor);
-	FinalColor.rgb = lerp(FinalColor.rgb,Color.rgb,Color.a);
-	return FinalColor;
+	half4 vColor1 = texCUBE(g_sCurrent, IN.vTexUV);
+	half4 vColor2 = texCUBE(g_sNext, IN.vTexUV);
+	half4 vFinalColor = lerp(vColor1, vColor2, g_fBlendFactor);
+	vFinalColor.rgb = lerp(vFinalColor.rgb, g_vColor.rgb, g_vColor.a);
+	return vFinalColor;
 }
diff --git a/build/gamesource/shaders/sky/sky_box.vs b/build/gamesource/shaders/sky/sky_box.vs
index 86bb6ca6fef031ba520d6f8d72ff9c7ee0dd55c1..7116c7df12de021f971dbc6e9cd97b8bd5747982 100644
--- a/build/gamesource/shaders/sky/sky_box.vs
+++ b/build/gamesource/shaders/sky/sky_box.vs
@@ -6,12 +6,16 @@ sky_box.vs
 
 #include <../struct.h>
 
-half4x4 WorldViewProjection;
+//##########################################################################
 
-vs_out_skybox main(vs_in_skybox IN)
+half4x4 g_mWVP;
+
+//##########################################################################
+
+VSO_SkyBox main(VSI_SkyBox IN)
 {
-	vs_out_skybox OUT = (vs_out_skybox)0;
-	OUT.Position = mul(half4(IN.Position.xyz,1),WorldViewProjection);
-	OUT.TexUV = IN.TexUV;
+	VSO_SkyBox OUT = (VSO_SkyBox)0;
+	OUT.vPosition = mul(half4(IN.vPosition.xyz,1), g_mWVP);
+	OUT.vTexUV = IN.vTexUV;
 	return OUT;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/sky/sky_clouds.ps b/build/gamesource/shaders/sky/sky_clouds.ps
index e99ae798143dd3a100232144a3f59760c1a4018e..293bcb7c9ed2129ca09b3778bb833d1a374f571b 100644
--- a/build/gamesource/shaders/sky/sky_clouds.ps
+++ b/build/gamesource/shaders/sky/sky_clouds.ps
@@ -6,32 +6,38 @@ sky_clouds.ps
 
 #include <../struct.h>
 
-sampler2D BaseCloudsTexture: register(s0);
-sampler2D SecondCloudsTexture: register(s1);
+//##########################################################################
 
-half2 BlendFactorBias;
-half4 Color;
-half Alpha;
+sampler2D g_sCurrent: register(s0);
+sampler2D g_sNext: register(s1);
 
-half4 main(vs_out_skyclouds IN):COLOR0
+//##########################################################################
+
+half2 g_vBlendFactorBias;
+half4 g_vColor;
+half g_fAlpha;
+
+//##########################################################################
+
+half4 main(VSO_SkyClouds IN):COLOR0
 {
-	half dist = (1.f)-distance(IN.TexUV,half2(1.f,1.f));
-	IN.TexUV.x += BlendFactorBias.y;
+	half fDist = 1.0 - distance(IN.vTexUV, half2(1.f,1.f));
+	IN.vTexUV.x += g_vBlendFactorBias.y;
 	
-	half4 Color1 = tex2D(BaseCloudsTexture, IN.TexUV);
-	half4 Color2 = tex2D(SecondCloudsTexture, IN.TexUV);
-	half4 FinalColor = lerp(Color1,Color2,BlendFactorBias.x);
-	dist *= 1.f + dist;
-	FinalColor.a *= saturate(dist);
+	half4 vColor1 = tex2D(g_sCurrent, IN.vTexUV);
+	half4 vColor2 = tex2D(g_sNext, IN.vTexUV);
+	half4 vFinalColor = lerp(vColor1, vColor2, g_vBlendFactorBias.x);
+	fDist *= 1.f + fDist;
+	vFinalColor.a *= saturate(fDist);
 	
 	#ifndef SHADOW
-	FinalColor.rgb = lerp(FinalColor.rgb,Color.rgb,Color.a);
+	vFinalColor.rgb = lerp(vFinalColor.rgb, g_vColor.rgb, g_vColor.a);
 	#endif
-	FinalColor.a *= Alpha;
+	vFinalColor.a *= g_fAlpha;
 	
 	#ifdef SHADOW
-	return FinalColor.a;
+	return vFinalColor.a;
 	#else
-	return FinalColor;
+	return vFinalColor;
 	#endif
 }
diff --git a/build/gamesource/shaders/sky/sky_clouds.vs b/build/gamesource/shaders/sky/sky_clouds.vs
index a09998de79be6d7513eb9e892b8cefc4f7b80cde..17fec229f2ab0e995c0d5a4d30938f400a385eb2 100644
--- a/build/gamesource/shaders/sky/sky_clouds.vs
+++ b/build/gamesource/shaders/sky/sky_clouds.vs
@@ -6,12 +6,16 @@ sky_clouds.vs
 
 #include <../struct.h>
 
-half4x4 WorldViewProjection;
+//##########################################################################
 
-vs_out_skyclouds main(vs_in_skyclouds IN)
+half4x4 g_mWVP;
+
+//##########################################################################
+
+VSO_SkyClouds main(VSI_SkyClouds IN)
 {
-	vs_out_skyclouds OUT = (vs_out_skyclouds)0;
-	OUT.Position = mul(half4(IN.Position.xyz,1),WorldViewProjection);
-	OUT.TexUV = IN.TexUV;
+	VSO_SkyClouds OUT = (VSO_SkyClouds)0;
+	OUT.vPosition = mul(half4(IN.vPosition.xyz,1), g_mWVP);
+	OUT.vTexUV = IN.vTexUV;
 	return OUT;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/sm/sm_depth_geom_cube.ps b/build/gamesource/shaders/sm/sm_depth_geom_cube.ps
index eee4669969eb075c9c2301f186307c97e7a2e600..3f83228435739c818ad02690d588b34b9a1fae59 100644
--- a/build/gamesource/shaders/sm/sm_depth_geom_cube.ps
+++ b/build/gamesource/shaders/sm/sm_depth_geom_cube.ps
@@ -5,14 +5,20 @@ sm_depth_geom_cube.ps
 */
 
 #include <../struct.h>
+#include <../shadow.h>
 
-sampler2D BaseSampler:register(s0);
+//##########################################################################
 
-half4 main(vs_out_gcommon IN):COLOR0
+sampler2D g_sColor:register(s0);
+
+//##########################################################################
+
+half4 main(VSO_SceneCommon IN):COLOR0
 {
-	half4 tmpColor = tex2D(BaseSampler,IN.TexUV);
-	clip(tmpColor.a - GREEN_ALPHATEST_VALUE);
-	tmpColor.a = 1.f;
+	ShadowDepthAlphaTest(tex2D(g_sColor,IN.vTexUV));
+	
+	half fDepth = length(IN.vPos);
+	half fBias = ShadowSlopeBias(fDepth);
 	
-	return length(IN.Pos);
+	return fDepth + fBias;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/sm/sm_depth_geom_cube.vs b/build/gamesource/shaders/sm/sm_depth_geom_cube.vs
index 5bad81df7592a967371b3de40a1ad679cf02d93d..e739cc58d0c09fc1f7d0a3ec82d76b9579fbaf72 100644
--- a/build/gamesource/shaders/sm/sm_depth_geom_cube.vs
+++ b/build/gamesource/shaders/sm/sm_depth_geom_cube.vs
@@ -5,19 +5,24 @@ sm_depth_geom_cube.vs
 */
 
 #include <../struct.h>
+#include <../shadow.h>
 
-half4x4 WorldViewProjection;
-half4x4 World;
-half3 LightPos;
+//##########################################################################
 
-vs_out_gcommon main(vs_in_geom IN)
+half4x4 g_mWVP;
+half4x4 g_mW;
+half3 g_vLightPos;
+
+//##########################################################################
+
+VSO_SceneCommon main(VSI_Geometry IN)
 {
-	vs_out_gcommon OUT;
+	VSO_SceneCommon OUT;
 	
-	OUT.Position= mul(half4(IN.Position.xyz,1.f),WorldViewProjection);
-	OUT.TexUV = IN.TexUV;
-	OUT.Pos = mul(half4(IN.Position.xyz,1.f),World);
-	OUT.Pos = half4(LightPos - OUT.Pos.xyz,1.f);
+	OUT.vPosition= mul(half4(IN.vPosition.xyz, 1.0),g_mWVP);
+	OUT.vTexUV = IN.vTexUV;
+	OUT.vPos = mul(half4(IN.vPosition.xyz, 1.0),g_mW);
+	OUT.vPos = half4(g_vLightPos - OUT.vPos.xyz, 1.0);
 
 	return OUT;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/sm/sm_depth_geom_pssm_direct.ps b/build/gamesource/shaders/sm/sm_depth_geom_pssm_direct.ps
index 849a71f325a7178aecad9c3628466bee4e77bd1d..33cdd3d486b3c2868a16d4bdc155881d00544afe 100644
--- a/build/gamesource/shaders/sm/sm_depth_geom_pssm_direct.ps
+++ b/build/gamesource/shaders/sm/sm_depth_geom_pssm_direct.ps
@@ -5,14 +5,20 @@ sm_depth_geom_pssm_direct.ps
 */
 
 #include <../struct.h>
+#include <../shadow.h>
 
-sampler2D BaseSampler:register(s0);
+//##########################################################################
 
-half4 main(vs_out_gcommon IN):COLOR0
+sampler2D g_sColor:register(s0);
+
+//##########################################################################
+
+half4 main(VSO_SceneCommon IN):COLOR0
 {
-	half4 tmpColor = tex2D(BaseSampler,IN.TexUV);
-	clip(tmpColor.a - GREEN_ALPHATEST_VALUE);
-	tmpColor.a = 1.f;
+	ShadowDepthAlphaTest(tex2D(g_sColor,IN.vTexUV));
+	
+	half fDepth = IN.vPos.z / IN.vPos.w;
+	half fBias = ShadowSlopeBias(fDepth);
 	
-	return IN.Pos.z/IN.Pos.w;
+	return fDepth + fBias;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/sm/sm_depth_geom_pssm_direct.vs b/build/gamesource/shaders/sm/sm_depth_geom_pssm_direct.vs
index cc91ff82d035fdfba88918f273cad7e7b2200e82..0778a844f29e518921de3c0cc3557cf8b18c949e 100644
--- a/build/gamesource/shaders/sm/sm_depth_geom_pssm_direct.vs
+++ b/build/gamesource/shaders/sm/sm_depth_geom_pssm_direct.vs
@@ -5,15 +5,22 @@ sm_depth_geom_pssm_direct.vs
 */
 
 #include <../struct.h>
+#include <../shadow.h>
 
-half4x4 WorldViewProjection:register(c0);
+//##########################################################################
 
-vs_out_gcommon main(vs_in_geom IN)
+half4x4 g_mWVP:register(c0);
+half3 g_vLigthPos;
+
+//##########################################################################
+
+VSO_SceneCommon main(VSI_Geometry IN)
 {
-	vs_out_gcommon OUT;
-	OUT.Position = mul(half4(IN.Position.xyz,1.0),WorldViewProjection);
-	OUT.TexUV = IN.TexUV;
-	OUT.Pos = OUT.Position;
+	VSO_SceneCommon OUT;
+
+	OUT.vPosition = mul(half4(IN.vPosition.xyz /*- vVertexToLigth * 1*/, 1.0),g_mWVP);
+	OUT.vTexUV = IN.vTexUV;
+	OUT.vPos = OUT.vPosition;
 
 	return OUT;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/sm/sm_depth_green_cube.ps b/build/gamesource/shaders/sm/sm_depth_green_cube.ps
index 1f49b8b25834df88dfec81c74fa571eba62aaedc..6e4d1fd9c56c54e7cb18e48aac86ed45ce3f1155 100644
--- a/build/gamesource/shaders/sm/sm_depth_green_cube.ps
+++ b/build/gamesource/shaders/sm/sm_depth_green_cube.ps
@@ -5,14 +5,20 @@ sm_depth_green_cube.ps
 */
 
 #include <../struct.h>
+#include <../shadow.h>
 
-sampler2D BaseSampler:register(s0);
+//##########################################################################
 
-half4 main(vs_out_gcommon IN):COLOR0
+sampler2D g_sColor:register(s0);
+
+//##########################################################################
+
+half4 main(VSO_SceneCommon IN):COLOR0
 { 
-	half4 tmpColor = tex2D(BaseSampler,IN.TexUV);
-	clip(tmpColor.a - GREEN_ALPHATEST_VALUE);
-	tmpColor.a = 1.f;
+	ShadowDepthAlphaTest(tex2D(g_sColor,IN.vTexUV));
+	
+	half fDepth = length(IN.vPos);
+	half fBias = ShadowSlopeBias(fDepth);
 	
-	return length(IN.Pos);
+	return fDepth + fBias;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/sm/sm_depth_green_cube.vs b/build/gamesource/shaders/sm/sm_depth_green_cube.vs
index 3eb74aab3f6f89f43e8e50feb84a8b7011cb7f85..cf25fe0f8903bffaf8ea8e7b54acfbebaa662fab 100644
--- a/build/gamesource/shaders/sm/sm_depth_green_cube.vs
+++ b/build/gamesource/shaders/sm/sm_depth_green_cube.vs
@@ -6,35 +6,46 @@ sm_depth_green_cube.vs
 
 #include <../struct.h>
 #include <../green.h>
+#include <../shadow.h>
 
-half4x4 WorldViewProjection;
-half3 LightPos;
+//##########################################################################
+
+half4x4 g_mWVP;
+half3 g_vLightPos;
 
 #if defined(_GRASS_)
-half2 DistBeginEndLessening : register(GREEN_R_LESSENING);
-half3 ViewPos : register(GREEN_R_VIEWPOS);
-half4 BSphere : register(GREEN_R_BSPHERE);
-half3 BBMax : register(GREEN_R_BBMAX);
-half3 BBMin : register(GREEN_R_BBMIN);
+
+half2 g_vDistLessening	: register(GREEN_R_LESSENING);
+half3 g_vViewPos		: register(GREEN_R_VIEWPOS);
+half4 g_vBoundSphere	: register(GREEN_R_BSPHERE);
+half3 g_vBoundMax		: register(GREEN_R_BBMAX);
+half3 g_vBoundMin		: register(GREEN_R_BBMIN);
+
 #endif
 
-void main( in vs_in_green IN, out vs_out_gcommon OUT ) 
+//##########################################################################
+
+VSO_SceneCommon main( in VSI_Green IN) 
 {
-	half multiplier = 1;
+	VSO_SceneCommon OUT;
+	
+	half fMultiplier = 1.0;
 	
 	#if defined(_GRASS_)
-	multiplier = GrassComMultiplier(IN.InstancePos,ViewPos,DistBeginEndLessening);
+	fMultiplier = GrassComMultiplier(IN.vInstPos,g_vViewPos,g_vDistLessening);
 	#endif
 	
-	OUT.Position = GreenTransformPos(
-						GreenComRotation(IN.Position,IN.InstanceSinCosRot),
-						IN.InstanceTrans.x,
-						multiplier,
-						IN.InstancePos
+	OUT.vPosition = GreenTransformPos(
+						GreenComRotation(IN.vPosition,IN.vInstSinCosRot),
+						IN.vInstTrans.x,
+						fMultiplier,
+						IN.vInstPos
 					);
 					
-	OUT.Pos	= half4(LightPos - OUT.Position,1);
-	OUT.Position = mul(OUT.Position, WorldViewProjection);
-	OUT.Normal = IN.Normal;
-	OUT.TexUV = IN.TexUV;
+	OUT.vPos	= half4(g_vLightPos - OUT.vPosition,1);
+	OUT.vPosition = mul(OUT.vPosition, g_mWVP);
+	OUT.vNormal = IN.vNormal;
+	OUT.vTexUV = IN.vTexUV;
+	
+	return OUT;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/sm/sm_depth_green_pssm_direct.ps b/build/gamesource/shaders/sm/sm_depth_green_pssm_direct.ps
index 3d12d6490b0fa23868143fcaa89b7dc4eb4a7396..6ea6a6b498efb9a45e7373fd5652cfad83ad4698 100644
--- a/build/gamesource/shaders/sm/sm_depth_green_pssm_direct.ps
+++ b/build/gamesource/shaders/sm/sm_depth_green_pssm_direct.ps
@@ -1,18 +1,24 @@
 
 /*
 sm_depth_green_pssm_direct.ps
-������ ������� ����� (��������������) � ������� �������������/����������� ��������� �����
+Рендер глубины сцены (растительность) с позиции направленного/глобального источника света
 */
 
 #include <../struct.h>
+#include <../shadow.h>
 
-sampler2D BaseSampler:register(s0);
+//##########################################################################
 
-half4 main(vs_out_gcommon IN):COLOR0
+sampler2D g_sColor:register(s0);
+
+//##########################################################################
+
+half4 main(VSO_SceneCommon IN):COLOR0
 { 
-	half4 tmpColor = tex2D(BaseSampler,IN.TexUV);
-	clip(tmpColor.a - GREEN_ALPHATEST_VALUE);
-	tmpColor.a = 1.f;
+	ShadowDepthAlphaTest(tex2D(g_sColor,IN.vTexUV));
+	
+	half fDepth = IN.vPos.z/IN.vPos.w;
+	half fBias = ShadowSlopeBias(fDepth);
 	
-	return IN.Pos.z/IN.Pos.w;
+	return fDepth + fBias;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/sm/sm_depth_green_pssm_direct.vs b/build/gamesource/shaders/sm/sm_depth_green_pssm_direct.vs
index 6688eacd7ce2fc42e16ece54547aac75f7dd5271..73e9cc12e3e61e18eb6795f1a630bb2678b0bac6 100644
--- a/build/gamesource/shaders/sm/sm_depth_green_pssm_direct.vs
+++ b/build/gamesource/shaders/sm/sm_depth_green_pssm_direct.vs
@@ -6,36 +6,47 @@ sm_depth_green_pssm_direct.vs
 
 #include <../struct.h>
 #include <../green.h>
+#include <../shadow.h>
 
-float4x4 WorldViewProjection;
+//##########################################################################
+
+float4x4 g_mWVP;
 
 #if defined(_GRASS_)
-half2 DistBeginEndLessening : register(GREEN_R_LESSENING);
-half3 ViewPos : register(GREEN_R_VIEWPOS);
-half4 BSphere : register(GREEN_R_BSPHERE);
-half3 BBMax : register(GREEN_R_BBMAX);
-half3 BBMin : register(GREEN_R_BBMIN);
+
+half2 g_vDistLessening	: register(GREEN_R_LESSENING);
+half3 g_vViewPos		: register(GREEN_R_VIEWPOS);
+half4 g_vBoundSphere	: register(GREEN_R_BSPHERE);
+half3 g_vBoundMax		: register(GREEN_R_BBMAX);
+half3 g_vBoundMin		: register(GREEN_R_BBMIN);
+
 #endif
 
-void main(in vs_in_green IN, out vs_out_gcommon OUT) 
+//##########################################################################
+
+VSO_SceneCommon main(in VSI_Green IN) 
 {
-	half multiplier = 1.f;
+	VSO_SceneCommon OUT;
+	
+	half fMultiplier = 1.0;
 	
 	#if defined(_GRASS_)
-	multiplier = GrassComMultiplier(IN.InstancePos,ViewPos,DistBeginEndLessening);
+	fMultiplier = GrassComMultiplier(IN.vInstPos,g_vViewPos,g_vDistLessening);
 	#endif
 	
-	OUT.Position = GreenTransformPos(
-						GreenComRotation(IN.Position,IN.InstanceSinCosRot),
-						IN.InstanceTrans.x,
-						multiplier,
-						IN.InstancePos
+	OUT.vPosition = GreenTransformPos(
+						GreenComRotation(IN.vPosition,IN.vInstSinCosRot),
+						IN.vInstTrans.x,
+						fMultiplier,
+						IN.vInstPos
 					);
 					
-	OUT.Position = mul(OUT.Position, WorldViewProjection);
+	OUT.vPosition = mul(OUT.vPosition, g_mWVP);
 	
-	OUT.Normal = IN.Normal;
-	OUT.Pos = OUT.Position;
+	OUT.vNormal = IN.vNormal;
+	OUT.vPos = OUT.vPosition;
 
-	OUT.TexUV = IN.TexUV;
+	OUT.vTexUV = IN.vTexUV;
+	
+	return OUT;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/sm/sm_depth_skin_cube.ps b/build/gamesource/shaders/sm/sm_depth_skin_cube.ps
index c6307220a61bd7149dda6661fe26655f16b96ebd..8d87c8f7d97bce6ece26ee3f881fa217eb9b7221 100644
--- a/build/gamesource/shaders/sm/sm_depth_skin_cube.ps
+++ b/build/gamesource/shaders/sm/sm_depth_skin_cube.ps
@@ -5,14 +5,20 @@ sm_depth_skin_cube.ps
 */
 
 #include <../struct.h>
+#include <../shadow.h>
 
-sampler2D BaseSampler:register(s0);
+//##########################################################################
 
-half4 main(vs_out_gcommon IN) : COLOR0
+sampler2D g_sColor:register(s0);
+
+//##########################################################################
+
+half4 main(VSO_SceneCommon IN) : COLOR0
 {
-	half4 tmpColor = tex2D(BaseSampler,IN.TexUV);
-	clip(tmpColor.a - GREEN_ALPHATEST_VALUE);
-	tmpColor.a = 1.f;
+	ShadowDepthAlphaTest(tex2D(g_sColor,IN.vTexUV));
+
+	half fDepth = length(IN.vPos);
+	half fBias = ShadowSlopeBias(fDepth);
 	
-	return length(IN.Pos);
+	return fDepth + fBias;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/sm/sm_depth_skin_cube.vs b/build/gamesource/shaders/sm/sm_depth_skin_cube.vs
index 44a1d054b7cb905599652b403fbfcf7b9b99a201..e3ee7141fdf019a07abd8ee0d09e7c361b61ae39 100644
--- a/build/gamesource/shaders/sm/sm_depth_skin_cube.vs
+++ b/build/gamesource/shaders/sm/sm_depth_skin_cube.vs
@@ -6,18 +6,23 @@ sm_depth_skin_cube.vs
 
 #include <../struct.h>
 #include <../skin.h>
+#include <../shadow.h>
 
-half4x4	WorldViewProjection;
-half4x4	World;
-half3 LightPos;
+//##########################################################################
 
-vs_out_gcommon main(vs_in_anim input)
+half4x4	g_mWVP;
+half4x4	g_mW;
+half3 g_vLightPos;
+
+//##########################################################################
+
+VSO_SceneCommon main(VSI_Animation IN)
 {
-	vs_out_gcommon Output = SkinAllTransform(input);
+	VSO_SceneCommon OUT = SkinAllTransform(IN);
 	
-	Output.Pos = half4(LightPos - mul(Output.Position, World).xyz,1);
-	Output.Position = mul(Output.Position, WorldViewProjection);
-	Output.TexUV = input.Tex;
+	OUT.vPos = half4(g_vLightPos - mul(OUT.vPosition, g_mW).xyz, 1);
+	OUT.vPosition = mul(OUT.vPosition, g_mWVP);
+	OUT.vTexUV = IN.vTexUV;
 	
-	return(Output);
+	return(OUT);
 }
diff --git a/build/gamesource/shaders/sm/sm_depth_skin_pssm_direct.ps b/build/gamesource/shaders/sm/sm_depth_skin_pssm_direct.ps
index 109cf662f9f15204a08a8d97615a34124a520a4f..1a7ea5b7c50b0be91cac9bf4be1f42d215ce3a81 100644
--- a/build/gamesource/shaders/sm/sm_depth_skin_pssm_direct.ps
+++ b/build/gamesource/shaders/sm/sm_depth_skin_pssm_direct.ps
@@ -5,14 +5,20 @@ sm_depth_skin_pssm_direct.ps
 */
 
 #include <../struct.h>
+#include <../shadow.h>
 
-sampler2D BaseSampler:register(s0);
+//##########################################################################
 
-half4 main(vs_out_gcommon IN) : COLOR0
+sampler2D g_sColor:register(s0);
+
+//##########################################################################
+
+half4 main(VSO_SceneCommon IN) : COLOR0
 {
-	half4 tmpColor = tex2D(BaseSampler,IN.TexUV);
-	clip(tmpColor.a - GREEN_ALPHATEST_VALUE);
-	tmpColor.a = 1.f;
+	ShadowDepthAlphaTest(tex2D(g_sColor,IN.vTexUV));
+	
+	half fDepth = IN.vPos.z/IN.vPos.w;
+	half fBias = ShadowSlopeBias(fDepth);
 	
-	return IN.Pos.z/IN.Pos.w;
+	return fDepth + fBias;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/sm/sm_depth_skin_pssm_direct.vs b/build/gamesource/shaders/sm/sm_depth_skin_pssm_direct.vs
index 9109e68cb2b17c0f330893ee9640353016c1b065..4e638dd25814f282195dbb3ef3baf0a3678db64d 100644
--- a/build/gamesource/shaders/sm/sm_depth_skin_pssm_direct.vs
+++ b/build/gamesource/shaders/sm/sm_depth_skin_pssm_direct.vs
@@ -6,18 +6,22 @@ sm_depth_skin_pssm_direct.vs
 
 #include <../struct.h>
 #include <../skin.h>
+#include <../shadow.h>
 
-half4x4	WorldViewProjection;
-half4x4	World;
+//##########################################################################
 
-vs_out_gcommon main(vs_in_anim input)
+half4x4	g_mWVP;
+
+//##########################################################################
+
+VSO_SceneCommon main(VSI_Animation IN)
 {
-	vs_out_gcommon Output = SkinAllTransform(input);
+	VSO_SceneCommon OUT = SkinAllTransform(IN);
 	
-	Output.Position = mul(Output.Position, WorldViewProjection);
-	Output.TexUV = input.Tex;
+	OUT.vPosition = mul(OUT.vPosition, g_mWVP);
+	OUT.vTexUV = IN.vTexUV;
 	
-	Output.Pos = Output.Position;
+	OUT.vPos = OUT.vPosition;
     
-	return(Output);
+	return(OUT);
 }
diff --git a/build/gamesource/shaders/stdr/stdr_geom.ps b/build/gamesource/shaders/stdr/stdr_geom.ps
index e24f53e456322c2479cf2007b1e4a4c6b7cbe59a..9cc8abc1605e83ba1c59bb357ca207aec827e5f8 100644
--- a/build/gamesource/shaders/stdr/stdr_geom.ps
+++ b/build/gamesource/shaders/stdr/stdr_geom.ps
@@ -7,18 +7,24 @@ stdr_geom.ps
 
 #include <../struct.h>
 
-sampler2D BaseSampler:register(s0);
+//##########################################################################
+
+sampler2D g_sColor:register(s0);
+
+//##########################################################################
 
 #ifdef _CLIP_PLANE_
-half3 PlaneNormal;
-half3 PlanePoint;
+half3 g_vPlaneNormal;
+half3 g_vPlanePoint;
 #endif
 
-half4 main(vs_out_gcommon IN) : COLOR0
+//##########################################################################
+
+half4 main(VSO_SceneCommon IN) : COLOR0
 {
 #ifdef _CLIP_PLANE_
-	clip(dot(IN.Pos.xyz - PlanePoint, PlaneNormal));
+	clip(dot(IN.vPos.xyz - g_vPlanePoint, g_vPlaneNormal));
 #endif
 	
-	return tex2D(BaseSampler,IN.TexUV);
+	return tex2D(g_sColor,IN.vTexUV);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/stdr/stdr_geom.vs b/build/gamesource/shaders/stdr/stdr_geom.vs
index d30629a4b18f5295034e92b6f10a83ceabbf2997..4488f69bd12e34bd4624ae3ea0a05f72c1d6ab61 100644
--- a/build/gamesource/shaders/stdr/stdr_geom.vs
+++ b/build/gamesource/shaders/stdr/stdr_geom.vs
@@ -6,17 +6,21 @@ stdr_geom.vs
 
 #include <../struct.h>
 
-half4x4	WorldViewProjection;
-half4x4	World;
+//##########################################################################
 
-vs_out_gcommon main(vs_in_geom IN)
+half4x4	g_mWVP;
+half4x4	g_mW;
+
+//##########################################################################
+
+VSO_SceneCommon main(VSI_Geometry IN)
 {
-	vs_out_gcommon OUT;
+	VSO_SceneCommon OUT;
 
-	OUT.Position = mul(half4(IN.Position,1.f),WorldViewProjection);
-	OUT.Normal = IN.Normal;
-	OUT.TexUV = IN.TexUV;
-	OUT.Pos = mul(half4(IN.Position,1.f),World);
+	OUT.vPosition = mul(half4(IN.vPosition,1.f), g_mWVP);
+	OUT.vNormal = IN.vNormal;
+	OUT.vTexUV = IN.vTexUV;
+	OUT.vPos = mul(half4(IN.vPosition,1.f), g_mW);
 
 	return OUT;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/stdr/stdr_green.ps b/build/gamesource/shaders/stdr/stdr_green.ps
index 0595d5c4253bd1d6542d0d9fcd9532d0d26c6c0e..09287abda91f347415e3e8ac434757c674a4d090 100644
--- a/build/gamesource/shaders/stdr/stdr_green.ps
+++ b/build/gamesource/shaders/stdr/stdr_green.ps
@@ -6,22 +6,26 @@ stdr_green.ps
 */
 
 #include <../struct.h>
+#include <../green.h>
 
-sampler2D BaseSampler:register(s0);
+//##########################################################################
+
+sampler2D g_sColor:register(s0);
+
+//##########################################################################
 
 #ifdef _CLIP_PLANE_
-half3 PlaneNormal;
-half3 PlanePoint;
+half3 g_vPlaneNormal;
+half3 g_vPlanePoint;
 #endif
 
-half4 main(vs_out_gcommon IN) : COLOR0
+//##########################################################################
+
+half4 main(VSO_SceneCommon IN) : COLOR0
 {
 #ifdef _CLIP_PLANE_
-	clip(dot(IN.Pos.xyz - PlanePoint, PlaneNormal));
+	clip(dot(IN.vPos.xyz - g_vPlanePoint, g_vPlaneNormal));
 #endif
 
-	half4 Color = tex2D(BaseSampler,IN.TexUV);
-	clip(Color.a - 0.5);
-	Color.a = 1.f;
-	return Color;
+	return GreenAlphaTest(tex2D(g_sColor,IN.vTexUV));
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/stdr/stdr_green.vs b/build/gamesource/shaders/stdr/stdr_green.vs
index b89060144cae2baf7edd4623c9a034bddec4f5c2..c3ec4ab1ee7719e54e0c279350be39d44c322365 100644
--- a/build/gamesource/shaders/stdr/stdr_green.vs
+++ b/build/gamesource/shaders/stdr/stdr_green.vs
@@ -7,34 +7,44 @@ stdr_green.vs
 #include <../struct.h>
 #include <../green.h>
 
-half4x4 WorldViewProjection;
-half4x4 World;
+//##########################################################################
+
+half4x4 g_mWVP;
+half4x4 g_mW;
 
 #if defined(_GRASS_)
-half2 DistBeginEndLessening : register(GREEN_R_LESSENING);
-half3 ViewPos : register(GREEN_R_VIEWPOS);
-half4 BSphere : register(GREEN_R_BSPHERE);
-half3 BBMax : register(GREEN_R_BBMAX);
-half3 BBMin : register(GREEN_R_BBMIN);
+
+half2 g_vDistLessening	: register(GREEN_R_LESSENING);
+half3 g_vViewPos		: register(GREEN_R_VIEWPOS);
+half4 g_vBoundSphere	: register(GREEN_R_BSPHERE);
+half3 g_vBoundMax		: register(GREEN_R_BBMAX);
+half3 g_vBoundMin		: register(GREEN_R_BBMIN);
+
 #endif
 
-void main(in vs_in_green IN, out vs_out_gcommon OUT) 
+//##########################################################################
+
+VSO_SceneCommon main(in VSI_Green IN) 
 {
+	VSO_SceneCommon OUT;
+
 	half multiplier = 1;
 	
 	#if defined(_GRASS_)
-	multiplier = GrassComMultiplier(IN.InstancePos,ViewPos,DistBeginEndLessening);
+	multiplier = GrassComMultiplier(IN.vInstPos, g_vViewPos, g_vDistLessening);
 	#endif
 	
-	OUT.Position = GreenTransformPos(
-						GreenComRotation(IN.Position,IN.InstanceSinCosRot),
-						IN.InstanceTrans.x,
+	OUT.vPosition = GreenTransformPos(
+						GreenComRotation(IN.vPosition, IN.vInstSinCosRot),
+						IN.vInstTrans.x,
 						multiplier,
-						IN.InstancePos
+						IN.vInstPos
 					);
 					
-	OUT.Pos = mul(OUT.Position, World);
-	OUT.Position = mul(OUT.Position, WorldViewProjection);
+	OUT.vPos = mul(OUT.vPosition, g_mW);
+	OUT.vPosition = mul(OUT.vPosition, g_mWVP);
 
-	OUT.TexUV = IN.TexUV;
+	OUT.vTexUV = IN.vTexUV;
+	
+	return OUT;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/stdr/stdr_skin.ps b/build/gamesource/shaders/stdr/stdr_skin.ps
index 1fe60042cc0ccbd57e829be4ee88d304b0c81a8c..04c401521f2cc12ab1009e96f4b064555185a523 100644
--- a/build/gamesource/shaders/stdr/stdr_skin.ps
+++ b/build/gamesource/shaders/stdr/stdr_skin.ps
@@ -7,18 +7,24 @@ stdr_skin.ps
 
 #include <../struct.h>
 
-sampler2D BaseSampler:register(s0);
+//##########################################################################
+
+sampler2D g_sColor:register(s0);
+
+//##########################################################################
 
 #ifdef _CLIP_PLANE_
-half3 PlaneNormal;
-half3 PlanePoint;
+half3 g_vPlaneNormal;
+half3 g_vPlanePoint;
 #endif
 
-half4 main(vs_out_gcommon IN) : COLOR0
+//##########################################################################
+
+half4 main(VSO_SceneCommon IN) : COLOR0
 {
 #ifdef _CLIP_PLANE_
-	clip(dot(IN.Pos.xyz - PlanePoint, PlaneNormal));
+	clip(dot(IN.vPos.xyz - g_vPlanePoint, g_vPlaneNormal));
 #endif
 	
-	return tex2D(BaseSampler,IN.TexUV);
+	return tex2D(g_sColor,IN.vTexUV);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/stdr/stdr_skin.vs b/build/gamesource/shaders/stdr/stdr_skin.vs
index dd5ccb4f4c32b3fe7e7966a606dc85653e622624..ddb84485ab8a638759db46503c60c072017d68c5 100644
--- a/build/gamesource/shaders/stdr/stdr_skin.vs
+++ b/build/gamesource/shaders/stdr/stdr_skin.vs
@@ -7,17 +7,21 @@ stdr_skin.vs
 #include <../struct.h>
 #include <../skin.h>
 
-half4x4	WorldViewProjection;
-half4x4	World;
+//##########################################################################
 
-vs_out_gcommon main(vs_in_anim input)
+half4x4	g_mWVP;
+half4x4	g_mW;
+
+//##########################################################################
+
+VSO_SceneCommon main(VSI_Animation IN)
 {
-	vs_out_gcommon Output = SkinAllTransform(input);
+	VSO_SceneCommon OUT = SkinAllTransform(IN);
 	
-	Output.Pos = mul(Output.Position, World);
-	Output.Position = mul(Output.Position, WorldViewProjection);
-	Output.Normal = mul(Output.Normal, World);
-	Output.TexUV = input.Tex;
+	OUT.vPos = mul(OUT.vPosition, g_mW);
+	OUT.vPosition = mul(OUT.vPosition, g_mWVP);
+	OUT.vNormal = mul(OUT.vNormal, g_mW);
+	OUT.vTexUV = IN.vTexUV;
 	
-	return(Output);
+	return(OUT);
 }
diff --git a/build/gamesource/shaders/struct.h b/build/gamesource/shaders/struct.h
index 191a6f0b14ee3f8c472ddc95518304f0e8180a85..852280977ebbdfb24280c28b9338ff4b666a80bd 100644
--- a/build/gamesource/shaders/struct.h
+++ b/build/gamesource/shaders/struct.h
@@ -7,201 +7,222 @@ struct.h
 
 #include <../gdefines.h>
 
-//ПОСТПРОЦЕСС
-//{
-//выходная структура вершинного шейдера, восстановление позиции по глубине
-struct vs_out_res_pos
-{
-	half4 Position	:POSITION0;
-	half2 TexUV		:TEXCOORD0;
-	
-	half3 EyeRay	:TEXCOORD1;
-	half3 WorldRay	:TEXCOORD2;
-};
+/* \name ПОСТПРОЦЕСС
+@{*/
 
-struct vs_out_res_pos_nl
+//! выходная структура вершинного шейдера, восстановление позиции по глубине
+struct VSO_ResPos
 {
-	half4 Position	:POSITION0;
-	half2 TexUV		:TEXCOORD0;
+	half4 vPosition	:POSITION0;
+	half2 vTexUV	:TEXCOORD0;
 	
-	half2 ScreenPos	:TEXCOORD1;
+	half3 vEyeRay	:TEXCOORD1;
+	half3 vWorldRay	:TEXCOORD2;
 };
 
-//стандартная структура постпроцесса, на вход врешинному шейдеру
-struct vs_in_pp
+//! стандартная структура постпроцесса, на вход врешинному шейдеру
+struct VSI_PP
 {
-	half4 Position	:POSITION;
-	half2 TexUV	:TEXCOORD0;
+	half4 vPosition	:POSITION;
+	half2 vTexUV	:TEXCOORD0;
 };
 
-//стандартная структура постпроцесса, на выход врешинного шейдера и на вход пиксельному
-struct vs_out_pp
+//! стандартная структура постпроцесса, на выход врешинного шейдера и на вход пиксельному
+struct VSO_PP
 {
-	half4 Position	:POSITION0;
-	half2 TexUV	:TEXCOORD0;
+	half4 vPosition	:POSITION0;
+	half2 vTexUV	:TEXCOORD0;
 };
-//}
 
-//UNION ALPHA, структура результата работы объединения полупрозрачных слоев
-//{
-struct ps_out_alpha_union
+//!@}
+
+
+//! union alpha, структура результата работы объединения полупрозрачных слоев
+struct PSO_UnionAlpha
 {
-	half4 Color		: COLOR0;
-	half4 Depth0	: COLOR1;
-	half4 Depth1	: COLOR2;
+	half4 vColor	: COLOR0;
+	half4 vDepth0	: COLOR1;
+	half4 vDepth1	: COLOR2;
 };
-//}
 
-//РАСТИТЕЛЬНОСТЬ
-struct vs_in_green 
+
+//! растительность
+struct VSI_Green 
 {
-	half3 Position	:POSITION0;
-	half3 Normal	:NORMAL0;
-	half2 TexUV		:TEXCOORD0;
-	half3 InstancePos	:TEXCOORD1;
-	half3 InstanceTrans	:TEXCOORD2;
-	half2 InstanceSinCosRot	:TEXCOORD3;
+	half3 vPosition		:POSITION0;
+	half3 vNormal		:NORMAL0;
+	half2 vTexUV		:TEXCOORD0;
+	half3 vInstPos		:TEXCOORD1;
+	half3 vInstTrans	:TEXCOORD2;
+	half2 vInstSinCosRot:TEXCOORD3;
 };
 
-//СТАТИЧЕСКАЯ ГЕОМЕТРИЯ
-struct vs_in_geom
+
+//! статическая геометрия
+struct VSI_Geometry
 {
-	half3 Position	:POSITION0;
-	half2 TexUV		:TEXCOORD0;
-	half3 Normal	:NORMAL0;
+	half3 vPosition	:POSITION0;
+	half2 vTexUV	:TEXCOORD0;
+	half3 vNormal	:NORMAL0;
 };
 
-//АНИМАЦИОННАЯ МОДЕЛЬ
-struct vs_in_anim
+
+//! анимационная модель
+struct VSI_Animation
 {
-	half3 Pos : POSITION0;
-	half2 Tex : TEXCOORD0;
-	half3 Norm : NORMAL0;
-	uint4 Bones : BLENDINDICES0;
-	half4 Weights : BLENDWEIGHT0;
+	half3 vPosition	: POSITION0;
+	half2 vTexUV	: TEXCOORD0;
+	half3 vNormal	: NORMAL0;
+	uint4 vBones	: BLENDINDICES0;
+	half4 vWeights	: BLENDWEIGHT0;
 };
 
-//ВОДА
-struct vs_out_water
+
+//! вода
+struct VSO_WaterPlane
 {
-	half4 Position:	POSITION;
-	half2 Tex2:		TEXCOORD0;			//текстурные координаты для bump карты
-	half2 Tex3:		TEXCOORD1;			//текстурные координаты для du/dv карты
-	half4 Pos:		TEXCOORD2;			//позиция (для расчета координат отражения)
-	half3 ViewDir:	TEXCOORD3;
-	half2 TexUV:	TEXCOORD4;			//нормальные текстурные координаты для текстуры мусора
-	half3 Normal:	TEXCOORD5;
+	half4 vPosition:	POSITION;
+	
+	//! текстурные координаты для bump карты
+	half2 vTexUV2:		TEXCOORD0;			
+	
+	//! текстурные координаты для du/dv карты
+	half2 vTexUV3:		TEXCOORD1;			
+	
+	//! позиция (для расчета координат отражения)
+	half4 vPos:			TEXCOORD2;			
+	half3 ViewDir:		TEXCOORD3;
+	
+	//! нормальные текстурные координаты
+	half2 vTexUV:		TEXCOORD4;			
+	half3 vNormal:		TEXCOORD5;
 };
 
-//ОБЩАЯ СТРУКТУРА ВЫДАВАЕМАЯ ВЕРШИННЫМ ШЕЙДЕРОМ (И ПЕРЕДАВАЕМАЯ В ПИКСЕЛЬНЫЙ)
-struct vs_out_gcommon 
+
+//! общая структура выдаваемая вершинным шейдером (и передаваемая в пиксельный)
+struct VSO_SceneCommon 
 {
-	half4 Position	:POSITION0;
-	half2 TexUV		:TEXCOORD0;
-	half3 Normal	:TEXCOORD1;
-	half4 Pos		:TEXCOORD2;
+	half4 vPosition	:POSITION0;
+	half2 vTexUV	:TEXCOORD0;
+	half3 vNormal	:TEXCOORD1;
+	half4 vPos		:TEXCOORD2;
 };
 
-struct vs_out_refcube 
+
+//! выходная структура с для кубического отражения
+struct VSO_RefCube 
 {
-	half4 Position	:POSITION0;
-	half2 TexUV		:TEXCOORD0;
-	half3 Normal	:TEXCOORD1;
-	half4 Pos		:TEXCOORD2;
-	half3 CubePPos	:TEXCOORD3;
+	half4 vPosition	:POSITION0;
+	half2 vTexUV	:TEXCOORD0;
+	half3 vNormal	:TEXCOORD1;
+	half4 vPos		:TEXCOORD2;
+	half3 vCubePPos	:TEXCOORD3;
 };
 
-//СТРУКТУРА ВЫВОДА ВСЕХ ДАННЫХ ДЛЯ ОТЛОЖЕННОГО ОСВЕЩЕНИЯ ПРИ MRT
-struct ps_out_ds_mrt 
+
+//! структура вывода всех данных для отложенного освещения при mrt
+struct PSO_Gbuffer 
 {
-	half4 Color		:COLOR0;
-	half4 Normal	:COLOR1;
-	half4 Param		:COLOR2;
-	half4 Depth		:COLOR3;
+	half4 vColor	:COLOR0;
+	half4 vNormal	:COLOR1;
+	half4 vParam	:COLOR2;
+	half4 vDepth	:COLOR3;
 };
 
-//СТРУКТУРА ВЫВОДА БАЗОВОЙ ИНФОМРАЦИИ ПРИ ПРОСЧЕТАХ ОСВЕЩЕНИЯ (ДАННЫЕ ИЗ ps_out_ds_mrt)
-struct ps_out_com_lighting
+
+//! структура вывода базовой инфомрации при просчетах освещения (данные из #PSO_Gbuffer)
+struct PSO_Lbuffer
 {
-	half4 Amdient	:COLOR0;
-	half4 Spec		:COLOR1;
+	half4 vAmdient	:COLOR0;
+	half4 vSpecular	:COLOR1;
 };
 
 
-//SKYBOX
-//{
-struct vs_in_skybox
+/*! \name SkyBox
+@{*/
+
+struct VSI_SkyBox
 {
-	half4 Position	:POSITION0;
-	half3 TexUV		:TEXCOORD0;
+	half4 vPosition	:POSITION0;
+	half3 vTexUV	:TEXCOORD0;
 };
 
-struct vs_out_skybox
+struct VSO_SkyBox
 {
-	half4 Position	:POSITION0;
-	half3 TexUV		:TEXCOORD0;
+	half4 vPosition	:POSITION0;
+	half3 vTexUV	:TEXCOORD0;
 };
-//}
 
-//SKYCLOUDS
-//{
-struct vs_in_skyclouds
+//!@}
+
+
+/*! \name SkyClouds
+@{*/
+
+struct VSI_SkyClouds
 {
-	half4 Position	:POSITION0;
-	half2 TexUV		:TEXCOORD0;
+	half4 vPosition	:POSITION0;
+	half2 vTexUV	:TEXCOORD0;
 };
 
-struct vs_out_skyclouds
+struct VSO_SkyClouds
 {
-	half4 Position	:POSITION;
-	half2 TexUV		:TEXCOORD0;
+	half4 vPosition	:POSITION;
+	half2 vTexUV	:TEXCOORD0;
 };
-//}
 
-//PARTICLES
-//{
-struct vs_in_particles 
+//!@}
+
+
+/*! \name Particles
+@{*/
+
+struct VSI_Particles 
 {
-	half3 Position	:POSITION0;
-	half2 TexUV 	:TEXCOORD0;
+	half3 vPosition	:POSITION0;
+	half2 vTexUV 	:TEXCOORD0;
 	
-	half3 InstancePos	:TEXCOORD1;
-	half4 InstanceTex	:TEXCOORD2;
-	half InstanceSize	:TEXCOORD3;
-	half InstanceAlpha	:TEXCOORD4;
+	half3 vInstPos	:TEXCOORD1;
+	half4 vInstTex	:TEXCOORD2;
+	half vInstSize	:TEXCOORD3;
+	half vInstAlpha	:TEXCOORD4;
 	
-	half2 InstanceRot1	:TEXCOORD5;
-	half InstanceLight	:TEXCOORD6;
+	half2 vInstRot1	:TEXCOORD5;
+	half vInstLight	:TEXCOORD6;
 };
 
-struct vs_out_particles 
+struct VSO_Particles 
 {
-	half4 Position	:POSITION0;
-	half2 TexUV 	:TEXCOORD0;
+	half4 vPosition	:POSITION0;
+	half2 vTexUV 	:TEXCOORD0;
 	half Alpha		:TEXCOORD1;
-	half4 Pos		:TEXCOORD2;
+	half4 vPos		:TEXCOORD2;
 	half Light		:TEXCOORD3;
-	half2 TexUV2	:TEXCOORD4;
+	half2 vTexUV2	:TEXCOORD4;
 };
-//}
 
-//AIGRID
-//{
-struct vs_input_aigrid 
+//!@}
+
+
+/*! \name AI grid
+@{*/
+
+struct VSI_AIgrid 
 {
-	half3 Position		:POSITION0;
-	half2 TexUV 		:TEXCOORD0;
+	half3 vPosition	:POSITION0;
+	half2 vTexUV 	:TEXCOORD0;
 	
-	half3 InstancePos	:TEXCOORD1;
-	half4 InstanceTex	:TEXCOORD2;
-	half4 InstanceCol	:COLOR0;
+	half3 vInstPos	:TEXCOORD1;
+	half4 vInstTex	:TEXCOORD2;
+	half4 vInstColor:COLOR0;
 };
 
-struct vs_output_aigrid 
+struct VSO_AIgrid 
 {
-	half4 Position	:POSITION0;
-	half2 TexUV		:TEXCOORD0;
-	half4 Pos		:TEXCOORD1;
-	half4 Color		:TEXCOORD2;
+	half4 vPosition	:POSITION0;
+	half2 vTexUV	:TEXCOORD0;
+	half4 vPos		:TEXCOORD1;
+	half4 vColor	:TEXCOORD2;
 };
-//}
+
+//!@}
diff --git a/source/SkyXEngine_Build/SkyXEngine_Build.cpp b/source/SkyXEngine_Build/SkyXEngine_Build.cpp
index 0d974e5c565532c9b3cf54de86d5d9b380f293d3..af45cbfd529cc1c749500b534163deded7d360db 100644
--- a/source/SkyXEngine_Build/SkyXEngine_Build.cpp
+++ b/source/SkyXEngine_Build/SkyXEngine_Build.cpp
@@ -17,7 +17,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLin
 
 	SGCore_SkyBoxLoadTex("sky_2_cube.dds");
 	SGCore_SkyCloudsLoadTex("sky_oblaka.dds");
-	SGCore_SkyCloudsSetWidthHeightPos(2000, 2000, &float3(0, 0, 0));
+	SGCore_SkyCloudsSetWidthHeightPos(1000, 1000, &float3(0, 0, 0));
 
 	SLevel_Load("stalker_atp", true);
 
diff --git a/source/aigrid/aigrid.cpp b/source/aigrid/aigrid.cpp
index 2e175dace5bb47f6853073b054d71aa952ecdc4d..41cbf464f5bb7162dbfd01d758623a7b91ca74c3 100644
--- a/source/aigrid/aigrid.cpp
+++ b/source/aigrid/aigrid.cpp
@@ -2629,7 +2629,7 @@ void CAIGrid::renderQuads(const IFrustum * frustum, const float3 * viewpos, floa
 		float4x4 wvp = SMMatrixIdentity() * float4x4(tmpview) * float4x4(tmpproj);
 		wvp = SMMatrixTranspose(wvp);
 
-		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, m_idVS, "WorldViewProjection", &wvp);
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, m_idVS, "g_mWVP", &wvp);
 
 		m_pDXDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 4, 0, 2);
 
diff --git a/source/gcore/shader.cpp b/source/gcore/shader.cpp
index 3ebc81c1d6d7c4a19c6b9e45b54f8bac322a6b22..a99b3601409d7f488f97fbf86c8c2dd7c0e7fa26 100644
--- a/source/gcore/shader.cpp
+++ b/source/gcore/shader.cpp
@@ -215,7 +215,12 @@ void LoadVertexShader(const char *szPath, CShaderVS *pShader, D3DXMACRO *aMacro)
 	}
 
 #ifndef _DEBUG
-	if (g_useCache && FileExistsFile(szFullPathCache) && GetTimeShaderFileCache(szFullPathCache) == FileGetTimeLastModify(szFullPath))
+	if (
+		//���� ����� ��� � ���� ���� ����������
+		(g_useCache && FileExistsFile(szFullPathCache)) && 
+		//���� ����� ��������� ���� ����� �� ��� � ����� ��������� ����� ������� ��� ����� ������� ���
+		(GetTimeShaderFileCache(szFullPathCache) == FileGetTimeLastModify(szFullPath) || !FileExistsFile(szFullPath))
+		)
 	{
 		CShaderFileCache *pSFC = CreateShaderFileCacheFormFile(szFullPathCache);
 
@@ -333,7 +338,12 @@ void LoadPixelShader(const char *szPath, CShaderPS *pShader,D3DXMACRO *aMacro)
 	}
 
 #ifndef _DEBUG
-	if (g_useCache && FileExistsFile(szFullPathCache) && GetTimeShaderFileCache(szFullPathCache) == FileGetTimeLastModify(szFullPath))
+	if (
+		//���� ����� ��� � ���� ���� ����������
+		(g_useCache && FileExistsFile(szFullPathCache)) &&
+		//���� ����� ��������� ���� ����� �� ��� � ����� ��������� ����� ������� ��� ����� ������� ���
+		(GetTimeShaderFileCache(szFullPathCache) == FileGetTimeLastModify(szFullPath) || !FileExistsFile(szFullPath))
+		)
 	{
 		CShaderFileCache *pSFC = CreateShaderFileCacheFormFile(szFullPathCache);
 
diff --git a/source/gcore/sky.cpp b/source/gcore/sky.cpp
index 9c978cc97c2867316d53986f67581df01614e959..4c980a118cd76b7b325b501705e553e4632db188 100644
--- a/source/gcore/sky.cpp
+++ b/source/gcore/sky.cpp
@@ -219,9 +219,9 @@ void CSkyBox::render(float timeDelta, const float3* pos,bool is_shadow)
 		g_pDXDevice->SetTexture(1, SGCore_LoadTexGetTexCube(m_idTex2));
 	}
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, m_idVS, "WorldViewProjection", &WVP);
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, m_idPS, "Color", &m_vColor);
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, m_idPS, "BlendFactor", &m_fFactorBlend);
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, m_idVS, "g_mWVP", &WVP);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, m_idPS, "g_vColor", &m_vColor);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, m_idPS, "g_fBlendFactor", &m_fFactorBlend);
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, m_idVS);
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, m_idPS);
 
@@ -471,10 +471,10 @@ void CSkyClouds::render(DWORD timeDelta, const float3* pos,bool is_shadow)
 
 		WVP = SMMatrixTranspose(WVP);
 
-		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, m_idVS, "WorldViewProjection", &WVP);
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, m_idPS, "BlendFactorBias", &float2(m_fFactorBlend, m_fBias));
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, m_idPS, "Color", &m_vColor);
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, m_idPS, "Alpha", &m_fAlpha);
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, m_idVS, "g_mWVP", &WVP);
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, m_idPS, "g_vBlendFactorBias", &float2(m_fFactorBlend, m_fBias));
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, m_idPS, "g_vColor", &m_vColor);
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, m_idPS, "g_fAlpha", &m_fAlpha);
 		SGCore_ShaderBind(SHADER_TYPE_VERTEX, m_idVS);
 		SGCore_ShaderBind(SHADER_TYPE_PIXEL, m_idPS);
 	}
@@ -486,9 +486,9 @@ void CSkyClouds::render(DWORD timeDelta, const float3* pos,bool is_shadow)
 
 		WVP = SMMatrixTranspose(WVP);
 
-		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, m_idVS, "WorldViewProjection", &WVP);
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, m_idPS_Shadow, "BlendFactorBias", &float2(m_fFactorBlend, m_fBias));
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, m_idPS_Shadow, "Alpha", &m_fAlpha);
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, m_idVS, "g_mWVP", &WVP);
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, m_idPS_Shadow, "g_vBlendFactorBias", &float2(m_fFactorBlend, m_fBias));
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, m_idPS_Shadow, "g_fAlpha", &m_fAlpha);
 		SGCore_ShaderBind(SHADER_TYPE_VERTEX, m_idVS);
 		SGCore_ShaderBind(SHADER_TYPE_PIXEL, m_idPS_Shadow);
 	}
diff --git a/source/gcore/sxgcore.cpp b/source/gcore/sxgcore.cpp
index 001de58d50105729150dfd123357eabca8b3be10..f0e0fac8f748a7c15f1a6c1e92b2eb70b6fbd382 100644
--- a/source/gcore/sxgcore.cpp
+++ b/source/gcore/sxgcore.cpp
@@ -588,7 +588,7 @@ SX_LIB_API void SGCore_OC_Update(ID idDepthMap, const IFrustum *pFrustum)
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, VS_ScreenOut);
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PS_FindMax9);
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PS_FindMax9, "PixelSize", (&float2(1.f / float(g_oD3DAPP.BackBufferWidth), 1.f / float(g_oD3DAPP.BackBufferHeight))));
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PS_FindMax9, "g_vPixelSize", (&float2(1.f / float(g_oD3DAPP.BackBufferWidth), 1.f / float(g_oD3DAPP.BackBufferHeight))));
 
 	SGCore_ScreenQuadDraw();
 
diff --git a/source/mtllight/light.cpp b/source/mtllight/light.cpp
index acd4c344bb4a63ded826c9a0f18fd0e112694fe4..bb8055222d30422112308bdfd023051800522621 100644
--- a/source/mtllight/light.cpp
+++ b/source/mtllight/light.cpp
@@ -812,25 +812,25 @@ void CLights::initShaderOfTypeMaterial(ID id, int typemat, const float4x4* wmat)
 	{
 		if (typemat == MTL_TYPE_GEOM)
 		{
-			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomPSSMDirect, "WorldViewProjection", &tmpmat);
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomPSSMDirect, "g_mWVP", &tmpmat);
 			SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomPSSMDirect);
 			SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SMDepthGeomPSSMDirect);
 		}
 		else if (typemat == MTL_TYPE_GRASS)
 		{
-			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGrassPSSMDirect, "WorldViewProjection", &tmpmat);
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGrassPSSMDirect, "g_mWVP", &tmpmat);
 			SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGrassPSSMDirect);
 			SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SMDepthGreenPSSMDirect);
 		}
 		else if (typemat == MTL_TYPE_TREE)
 		{
-			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthTreePSSMDirect, "WorldViewProjection", &tmpmat);
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthTreePSSMDirect, "g_mWVP", &tmpmat);
 			SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthTreePSSMDirect);
 			SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SMDepthGreenPSSMDirect);
 		}
 		else if (typemat == MTL_TYPE_SKIN)
 		{
-			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthSkinPSSMDirect, "WorldViewProjection", &tmpmat);
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthSkinPSSMDirect, "g_mWVP", &tmpmat);
 			SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthSkinPSSMDirect);
 			SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SMDepthSkinPSSMDirect);
 		}
@@ -839,33 +839,33 @@ void CLights::initShaderOfTypeMaterial(ID id, int typemat, const float4x4* wmat)
 	{
 		if (typemat == MTL_TYPE_GEOM)
 		{
-			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomCube, "WorldViewProjection", &tmpmat);
-			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomCube, "World", &tmpwmat);
-			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomCube, "LightPos", &ArrLights[id]->Position);
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomCube, "g_mWVP", &tmpmat);
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomCube, "g_mW", &tmpwmat);
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomCube, "g_vLightPos", &ArrLights[id]->Position);
 			SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomCube);
 			SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SMDepthGeomCube);
 		}
 		else if (typemat == MTL_TYPE_GRASS)
 		{
-			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGrassCube, "WorldViewProjection", &tmpmat);
-			//SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGrassCube, "World", &tmpwmat);
-			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGrassCube, "LightPos", &ArrLights[id]->Position);
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGrassCube, "g_mWVP", &tmpmat);
+			//SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGrassCube, "g_mW", &tmpwmat);
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGrassCube, "g_vLightPos", &ArrLights[id]->Position);
 			SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGrassCube);
 			SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SMDepthGreenCube);
 		}
 		else if (typemat == MTL_TYPE_TREE)
 		{
-			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthTreeCube, "WorldViewProjection", &tmpmat);
-			//SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthTreeCube, "World", &tmpwmat);
-			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthTreeCube, "LightPos", &ArrLights[id]->Position);
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthTreeCube, "g_mWVP", &tmpmat);
+			//SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthTreeCube, "g_mW", &tmpwmat);
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthTreeCube, "g_vLightPos", &ArrLights[id]->Position);
 			SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthTreeCube);
 			SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SMDepthGreenCube);
 		}
 		else if (typemat == MTL_TYPE_SKIN)
 		{
-			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthSkinCube, "WorldViewProjection", &tmpmat);
-			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthSkinCube, "World", &tmpwmat);
-			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthSkinCube, "LightPos", &ArrLights[id]->Position);
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthSkinCube, "g_mWVP", &tmpmat);
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthSkinCube, "g_mW", &tmpwmat);
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthSkinCube, "g_vLightPos", &ArrLights[id]->Position);
 			SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthSkinCube);
 			SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SMDepthSkinCube);
 		}
@@ -1349,13 +1349,13 @@ void CLights::shadowSoft(bool randomsam, float size, bool isfirst)
 	
 		if(randomsam)
 		{
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PPBlurDepthBasedNoise, "PixelSize", &float2_t(size / float(*r_win_width), size / float(*r_win_height)));
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PPBlurDepthBasedNoise, "NearFar", &float2_t(*r_near, *r_far));
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PPBlurDepthBasedNoise, "g_vPixelSize", &float2_t(size / float(*r_win_width), size / float(*r_win_height)));
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PPBlurDepthBasedNoise, "g_vNearFar", &float2_t(*r_near, *r_far));
 		}
 		else
 		{
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PPBlurDepthBased, "PixelSize", &float2_t(size / float(*r_win_width), size / float(*r_win_height)));
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PPBlurDepthBased, "NearFar", &float2_t(*r_near, *r_far));
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PPBlurDepthBased, "g_vPixelSize", &float2_t(size / float(*r_win_width), size / float(*r_win_height)));
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PPBlurDepthBased, "g_vNearFar", &float2_t(*r_near, *r_far));
 		}
 
 	
@@ -1390,7 +1390,7 @@ void CLights::toneMappingCom(DWORD timeDelta, float factor_adapted)
 
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ScreenOut);
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SampleLumIterative);
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SampleLumIterative, "ArrOffsets", &(MLSet::HDRSampleOffsets));
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SampleLumIterative, "g_aOffsets", &(MLSet::HDRSampleOffsets));
 
 	MLSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(MLSet::IDsRenderTargets::LigthCom));
 	SGCore_ScreenQuadDraw();
@@ -1424,7 +1424,7 @@ void CLights::toneMappingCom(DWORD timeDelta, float factor_adapted)
 
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ScreenOut);
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SampleLumInit);
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SampleLumInit, "ArrOffsets", &(MLSet::HDRSampleOffsets));
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SampleLumInit, "g_aOffsets", &(MLSet::HDRSampleOffsets));
 
 	SGCore_ScreenQuadDraw();
 
@@ -1446,7 +1446,7 @@ void CLights::toneMappingCom(DWORD timeDelta, float factor_adapted)
 
 		SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ScreenOut);
 		SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SampleLumIterative);
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SampleLumIterative, "ArrOffsets", &(MLSet::HDRSampleOffsets));
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SampleLumIterative, "g_aOffsets", &(MLSet::HDRSampleOffsets));
 
 		MLSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(MLSet::IDsRenderTargets::ToneMaps[CurrTexture + 1]));
 		SGCore_ScreenQuadDraw();
@@ -1481,7 +1481,7 @@ void CLights::toneMappingCom(DWORD timeDelta, float factor_adapted)
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::CalcAdaptedLum);
 
 	float ElapsedTime = float(timeDelta) * 0.001f * (factor_adapted * 1000.f);
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::CalcAdaptedLum, "ElapsedTime", &(ElapsedTime));
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::CalcAdaptedLum, "g_fElapsedTime", &(ElapsedTime));
 
 	SGCore_ScreenQuadDraw();
 
diff --git a/source/mtllight/material.cpp b/source/mtllight/material.cpp
index 8ba9ab038a1208ebf409f74a9b97f9da5d2f2ed5..1de295f46cd4c4ecf58234dfa2a17568702b9447 100644
--- a/source/mtllight/material.cpp
+++ b/source/mtllight/material.cpp
@@ -1823,8 +1823,8 @@ void CMaterials::renderStd(MTLTYPE_MODEL type, const float4x4 *pWorld, ID idSlot
 		wvpmat = SMMatrixTranspose(wmat * wvpmat);
 		wmat = SMMatrixTranspose(wmat);
 
-		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::StdGeom, "WorldViewProjection", &wvpmat);
-		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::StdGeom, "World", &wmat);
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::StdGeom, "g_mWVP", &wvpmat);
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::StdGeom, "g_mW", &wmat);
 
 		if (Core_RBoolGet(G_RI_BOOL_CLIPPLANE0))
 		{
@@ -1835,8 +1835,8 @@ void CMaterials::renderStd(MTLTYPE_MODEL type, const float4x4 *pWorld, ID idSlot
 			Core_RFloat3Get(G_RI_FLOAT3_CLIPPLANE0_NORMAL, &tmpnormal);
 			Core_RFloat3Get(G_RI_FLOAT3_CLIPPLANE0_POINT, &tmppoint);
 
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGeomCP, "PlaneNormal", &tmpnormal);
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGeomCP, "PlanePoint", &tmppoint);
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGeomCP, "g_vPlaneNormal", &tmpnormal);
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGeomCP, "g_vPlanePoint", &tmppoint);
 		}
 		else
 			SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGeom);
@@ -1852,8 +1852,8 @@ void CMaterials::renderStd(MTLTYPE_MODEL type, const float4x4 *pWorld, ID idSlot
 		wvpmat = SMMatrixTranspose(wmat * wvpmat);
 		wmat = SMMatrixTranspose(wmat);
 
-		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, tmpvs, "WorldViewProjection", &wvpmat);
-		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, tmpvs, "World", &wmat);
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, tmpvs, "g_mWVP", &wvpmat);
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, tmpvs, "g_mW", &wmat);
 
 		if (Core_RBoolGet(G_RI_BOOL_CLIPPLANE0))
 		{
@@ -1864,8 +1864,8 @@ void CMaterials::renderStd(MTLTYPE_MODEL type, const float4x4 *pWorld, ID idSlot
 			Core_RFloat3Get(G_RI_FLOAT3_CLIPPLANE0_NORMAL, &tmpnormal);
 			Core_RFloat3Get(G_RI_FLOAT3_CLIPPLANE0_POINT, &tmppoint);
 
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGreenCP, "PlaneNormal", &tmpnormal);
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGreenCP, "PlanePoint", &tmppoint);
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGreenCP, "g_vPlaneNormal", &tmpnormal);
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGreenCP, "g_vPlanePoint", &tmppoint);
 		}
 		else
 			SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGreen);
@@ -1880,8 +1880,8 @@ void CMaterials::renderStd(MTLTYPE_MODEL type, const float4x4 *pWorld, ID idSlot
 		wvpmat = SMMatrixTranspose(wmat * wvpmat);
 		wmat = SMMatrixTranspose(wmat);
 
-		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::StdSkin, "WorldViewProjection", &wvpmat);
-		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::StdSkin, "World", &wmat);
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::StdSkin, "g_mWVP", &wvpmat);
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::StdSkin, "g_mW", &wmat);
 
 		if (Core_RBoolGet(G_RI_BOOL_CLIPPLANE0))
 		{
@@ -1892,8 +1892,8 @@ void CMaterials::renderStd(MTLTYPE_MODEL type, const float4x4 *pWorld, ID idSlot
 			Core_RFloat3Get(G_RI_FLOAT3_CLIPPLANE0_NORMAL, &tmpnormal);
 			Core_RFloat3Get(G_RI_FLOAT3_CLIPPLANE0_POINT, &tmppoint);
 
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdSkinCP, "PlaneNormal", &tmpnormal);
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdSkinCP, "PlanePoint", &tmppoint);
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdSkinCP, "g_vPlaneNormal", &tmpnormal);
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdSkinCP, "g_vPlanePoint", &tmppoint);
 		}
 		else
 			SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdSkin);
@@ -1959,7 +1959,7 @@ void CMaterials::render(ID id, const float4x4 *pWorld)
 		MLSet::DXDevice->SetTexture(MTL_TEX_R_PARAM_LIGHT, SGCore_LoadTexGetTex(pMtrl->m_oLightParam.m_idTexParam));
 	}
 	//иначе если берем параметры из ... редактора
-	else if (!pMtrl->m_oLightParam.m_isTextureParam)
+	else //if (!pMtrl->m_oLightParam.m_isTextureParam)
 	{
 		if (pMtrl->m_oLightParam.m_fOldRoughness != pMtrl->m_oLightParam.m_fRoughness || pMtrl->m_oLightParam.m_fOldF0 != pMtrl->m_oLightParam.m_fF0 || pMtrl->m_oLightParam.m_fOldThickness != pMtrl->m_oLightParam.m_fThickness)
 		{
@@ -1979,8 +1979,8 @@ void CMaterials::render(ID id, const float4x4 *pWorld)
 
 		MLSet::DXDevice->SetTexture(MTL_TEX_R_PARAM_LIGHT, SGCore_LoadTexGetTex(pMtrl->m_oLightParam.m_idTexParamHand));
 	}
-	else
-		MLSet::DXDevice->SetTexture(MTL_TEX_R_PARAM_LIGHT, SGCore_LoadTexGetTex(MLSet::IDsTexs::NullMaterial));
+	/*else
+		MLSet::DXDevice->SetTexture(MTL_TEX_R_PARAM_LIGHT, SGCore_LoadTexGetTex(MLSet::IDsTexs::NullMaterial));*/
 
 
 	if (pMtrl->m_oMainGraphics.m_idShaderVS != -1)
@@ -1994,36 +1994,30 @@ void CMaterials::render(ID id, const float4x4 *pWorld)
 
 	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldView || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldView || pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection)
 	{
-		//float4x4 view;
 		Core_RMatrixGet(G_RI_MATRIX_VIEW, &m_mViewTrans);
-		//MLSet::DXDevice->GetTransform(D3DTS_VIEW, &tmpView);
-		//view = float4x4(tmpView);
 		m_mViewTrans = SMMatrixTranspose(m_mViewTrans);
 
-		//float4x4 proj;
 		Core_RMatrixGet(G_RI_MATRIX_PROJECTION, &m_mProjTrans);
-		//MLSet::DXDevice->GetTransform(D3DTS_PROJECTION, &tmpProjection);
-		//proj = float4x4(tmpProjection);
 		m_mProjTrans = SMMatrixTranspose(m_mProjTrans);
 	}
 
 	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorld)
-		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "World", &m_mWorldTrans);
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "g_mW", &m_mWorldTrans);
 
 	if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorld)
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "World", &m_mWorldTrans);
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "g_mW", &m_mWorldTrans);
 
 	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransView)
-		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "View", &m_mViewTrans);
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "g_mV", &m_mViewTrans);
 
 	if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransView)
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "View", &m_mViewTrans);
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "g_mV", &m_mViewTrans);
 
 	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransProjection)
-		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "Projection", &m_mProjTrans);
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "g_mP", &m_mProjTrans);
 
 	if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransProjection)
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "Projection", &m_mProjTrans);
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "g_mP", &m_mProjTrans);
 
 
 	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldView || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldView)
@@ -2031,10 +2025,10 @@ void CMaterials::render(ID id, const float4x4 *pWorld)
 		float4x4 wv = m_mViewTrans * m_mWorldTrans;
 
 		if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldView)
-			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "WorldView", &wv);
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "g_mWV", &wv);
 
 		if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldView)
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "WorldView", &wv);
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "g_mWV", &wv);
 	}
 
 	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection)
@@ -2045,10 +2039,10 @@ void CMaterials::render(ID id, const float4x4 *pWorld)
 		mWVP = SMMatrixTranspose(mWVP);
 
 		if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection)
-			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "WorldViewProjection", &mWVP);
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "g_mWVP", &mWVP);
 
 		if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection)
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "WorldViewProjection", &mWVP);
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "g_mWVP", &mWVP);
 	}
 
 	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransPosCam || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransPosCam)
@@ -2057,36 +2051,36 @@ void CMaterials::render(ID id, const float4x4 *pWorld)
 		Core_RFloat3Get(G_RI_FLOAT3_OBSERVER_POSITION, &vObserverPos);
 
 		if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransPosCam)
-			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "PosCam", &vObserverPos);
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "g_vPosCam", &vObserverPos);
 
 		if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransPosCam)
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "PosCam", &vObserverPos);
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "g_vPosCam", &vObserverPos);
 	}
 
 
 	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransUserData)
-		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "Param", &(pMtrl->m_oMainGraphics.m_oDataVS.m_vUserData));
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "g_vParam", &(pMtrl->m_oMainGraphics.m_oDataVS.m_vUserData));
 
 	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransUserDataInOtherShader)
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "ParamVS", &(pMtrl->m_oMainGraphics.m_oDataVS.m_vUserData));
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "g_vParamVS", &(pMtrl->m_oMainGraphics.m_oDataVS.m_vUserData));
 
 	if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransUserData)
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "Param", &(pMtrl->m_oMainGraphics.m_oDataPS.m_vUserData));
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "g_vParam", &(pMtrl->m_oMainGraphics.m_oDataPS.m_vUserData));
 
 	if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransUserDataInOtherShader)
-		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "ParamPS", &(pMtrl->m_oMainGraphics.m_oDataPS.m_vUserData));
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "g_vParamPS", &(pMtrl->m_oMainGraphics.m_oDataPS.m_vUserData));
 
 	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransTimeDelta)
-		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "TimeDelta", &float2(m_uiCountTimeDelta, float(m_uiCurrTimeDelta) * 0.001f));
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "g_vTimeDelta", &float2(m_uiCountTimeDelta, float(m_uiCurrTimeDelta) * 0.001f));
 
 	if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransTimeDelta)
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "TimeDelta", &float2(m_uiCountTimeDelta, float(m_uiCurrTimeDelta) * 0.001f));
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "g_vTimeDelta", &float2(m_uiCountTimeDelta, float(m_uiCurrTimeDelta) * 0.001f));
 
 	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWinSize)
-		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "WinSize", &float2_t(*r_win_width, *r_win_height));
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "g_vWinSize", &float2_t(*r_win_width, *r_win_height));
 
 	if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWinSize)
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "WinSize", &float2_t(*r_win_width, *r_win_height));
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "g_vWinSize", &float2_t(*r_win_width, *r_win_height));
 
 	//если материалом назначен альфа тест и не включен принудительный
 	if (pMtrl->m_oMainGraphics.m_useAlphaTest && !m_useForceblyAlphaTest)
@@ -2132,7 +2126,7 @@ void CMaterials::render(ID id, const float4x4 *pWorld)
 		if (m_useCountSurface && pMtrl->m_oLightParam.m_isTransparent)
 			++(m_idCurrIdSurface);
 
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "NearFarIsUnlit", &float4_t(*r_near, *r_far, fLayer, float(m_idCurrIdSurface) / 255.f));
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "g_vNearFarLayers", &float4_t(*r_near, *r_far, fLayer, float(m_idCurrIdSurface) / 255.f));
 	}
 }
 
diff --git a/source/mtllight/ml_data.cpp b/source/mtllight/ml_data.cpp
index 36a2a5fd6ad574be950c632da072452261f70455..dfa31ab02f5205e40a78da34cab7f093eee46587 100644
--- a/source/mtllight/ml_data.cpp
+++ b/source/mtllight/ml_data.cpp
@@ -152,9 +152,9 @@ namespace MLSet
 	namespace IDsTexs
 	{
 		ID Tex_NoiseTex;
-		ID ParamLight;
-		ID NullMaterial;
-		ID NullingTex;
+		//ID ParamLight;
+		//ID NullMaterial;
+		//ID NullingTex;
 	};
 };
 
@@ -167,26 +167,28 @@ void MLSet::MLInit()
 
 	const float *r_default_fov = GET_PCVAR_FLOAT("r_default_fov");
 
-	MLSet::IDsTexs::Tex_NoiseTex = SGCore_LoadTexAddName("noise_rottex.dds", LOAD_TEXTURE_TYPE_CONST);
+	//MLSet::IDsTexs::Tex_NoiseTex = SGCore_LoadTexAddName("noise_rottex.dds", LOAD_TEXTURE_TYPE_CONST);
 
-	IDirect3DTexture9* NullMaterial;
-	MLSet::DXDevice->CreateTexture(1, 1, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &NullMaterial, NULL);
 	D3DLOCKED_RECT LockedRect;
-	uint32_t tmpColor = D3DCOLOR_ARGB(0, 250, 2, 255);
-
-	NullMaterial->LockRect(0, &LockedRect, 0, 0);
+	uint32_t* tmpOldColor;
+	IDirect3DTexture9 *pRnsSampler;
+	MLSet::DXDevice->CreateTexture(4, 4, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &pRnsSampler, NULL);
+	
+	uint32_t aRndColors[16];// = D3DCOLOR_ARGB(0, 250, 2, 255);
 
-	uint32_t* tmpOldColor = (uint32_t*)LockedRect.pBits + 0 * LockedRect.Pitch + 0 * sizeof(uint32_t);
-	memcpy(tmpOldColor, &tmpColor, sizeof(uint32_t));
+	for (int i = 0; i < 16; ++i)
+		aRndColors[i] = D3DCOLOR_ARGB(255, rand() % 255, rand() % 255, rand() % 255);
 
-	NullMaterial->UnlockRect(0);
+	pRnsSampler->LockRect(0, &LockedRect, 0, 0);
+	memcpy(LockedRect.pBits, aRndColors, sizeof(uint32_t));
+	pRnsSampler->UnlockRect(0);
 
 	//SGCore_LoadTexLoadTextures();
-	MLSet::IDsTexs::NullMaterial = SGCore_LoadTexCreate("null_material__", NullMaterial);
-
+	MLSet::IDsTexs::Tex_NoiseTex = SGCore_LoadTexCreate("noise_rottex__", pRnsSampler);
+	
 
 
-	IDirect3DTexture9* ParamLightModelTex;
+	/*IDirect3DTexture9* ParamLightModelTex;
 	MLSet::DXDevice->CreateTexture(1, 1, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &ParamLightModelTex, NULL);
 
 	DWORD tmpcolorparamlight = D3DCOLOR_ARGB(0, 0, 0, 0);
@@ -204,11 +206,11 @@ void MLSet::MLInit()
 	ParamLightModelTex->UnlockRect(0);
 
 	//SGCore_LoadTexLoadTextures();
-	MLSet::IDsTexs::ParamLight = SGCore_LoadTexCreate("param_light__", ParamLightModelTex);
+	MLSet::IDsTexs::ParamLight = SGCore_LoadTexCreate("param_light__", ParamLightModelTex);*/
 
 
 
-	IDirect3DTexture9* NullingTex;
+	/*IDirect3DTexture9* NullingTex;
 	MLSet::DXDevice->CreateTexture(1, 1, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &NullingTex, NULL);
 
 	DWORD tmpcolornulling = D3DCOLOR_ARGB(10, 10, 10, 10);
@@ -226,7 +228,7 @@ void MLSet::MLInit()
 	NullingTex->UnlockRect(0);
 
 	//SGCore_LoadTexLoadTextures();
-	MLSet::IDsTexs::NullingTex = SGCore_LoadTexCreate("nulling_tex__", NullingTex);
+	MLSet::IDsTexs::NullingTex = SGCore_LoadTexCreate("nulling_tex__", NullingTex);*/
 
 
 	MLSet::IDsShaders::VS::SMDepthSkinPSSMDirect = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "sm_depth_skin_pssm_direct.vs", "sm_depth_skin_pssm_direct.vs", SHADER_CHECKDOUBLE_PATH);
diff --git a/source/mtllight/shadow.cpp b/source/mtllight/shadow.cpp
index 66926c6dd49009fdfd13942d2cc806d0c6369b9b..915dcc0e23faa175bf4913844ae804117ef58c65 100644
--- a/source/mtllight/shadow.cpp
+++ b/source/mtllight/shadow.cpp
@@ -17,7 +17,6 @@ PSSM::PSSM()
 			m_aDepthMaps[i] = 0;
 			m_aFrustums[i] = 0;
 			m_aIsUpdate[i] = 0;
-
 			//IDArr[i] = -1;
 		}
 
@@ -175,6 +174,8 @@ void PSSM::init()
 			m_aFrustums[i] = SGCore_CrFrustum();
 		}
 
+		//m_aMask[]
+
 	m_aNearFar[0].x = *r_near;
 	m_aNearFar[0].y = MLSet::DistForPSSM.x;
 
@@ -332,7 +333,8 @@ void PSSM::preRender(int split)
 	Core_RMatrixSet(G_RI_MATRIX_PROJECTION, &Projs[split]);
 	Core_RMatrixSet(G_RI_MATRIX_VIEWPROJ, &ViewProj[split]);
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomPSSMDirect, "WorldViewProjection", &SMMatrixTranspose(ViewProj[split]));
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomPSSMDirect, "g_mWVP", &SMMatrixTranspose(ViewProj[split]));
+	//SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomPSSMDirect, "g_vLigthPos", &Position);
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomPSSMDirect);
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SMDepthGeomPSSMDirect);
 
@@ -377,12 +379,14 @@ void PSSM::end()
 
 	/*if (GetAsyncKeyState(VK_NUMPAD1))
 	{
-		D3DXSaveTextureToFile("C:\\1\\depthmapshadow0.bmp", D3DXIFF_PNG, m_aDepthMaps[0], NULL);
-		D3DXSaveTextureToFile("C:\\1\\depthmapshadow1.bmp", D3DXIFF_PNG, m_aDepthMaps[1], NULL);
-		D3DXSaveTextureToFile("C:\\1\\depthmapshadow2.bmp", D3DXIFF_PNG, m_aDepthMaps[2], NULL);
-		D3DXSaveTextureToFile("C:\\1\\depthmapshadow3.bmp", D3DXIFF_PNG, m_aDepthMaps[3], NULL);
-		D3DXSaveTextureToFile("C:\\1\\depthmapshadow4.bmp", D3DXIFF_PNG, m_aDepthMaps[4], NULL);
+		D3DXSaveTextureToFile("C:\\1\\depthmapshadow0.png", D3DXIFF_PNG, m_aDepthMaps[0], NULL);
+		D3DXSaveTextureToFile("C:\\1\\depthmapshadow1.png", D3DXIFF_PNG, m_aDepthMaps[1], NULL);
+		D3DXSaveTextureToFile("C:\\1\\depthmapshadow2.png", D3DXIFF_PNG, m_aDepthMaps[2], NULL);
+		D3DXSaveTextureToFile("C:\\1\\depthmapshadow3.png", D3DXIFF_PNG, m_aDepthMaps[3], NULL);
+		D3DXSaveTextureToFile("C:\\1\\depthmapshadow4.png", D3DXIFF_PNG, m_aDepthMaps[4], NULL);
 	}*/
+
+	
 }
 
 void PSSM::flickering(float4x4 *matLVP,float size_x,float size_y)
@@ -441,21 +445,22 @@ void PSSM::genShadow(IDirect3DTexture9* shadowmap)
 	SGCore_SetSamplerAddress2(1, 6, D3DTADDRESS_CLAMP);
 
 	MLSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(MLSet::IDsRenderTargets::DepthScene));
+	MLSet::DXDevice->SetTexture(6, SGCore_RTGetTexture(MLSet::IDsRenderTargets::NormalScene));
+
+	float4x4 aMatrixTexture[5];
 
 	float4x4 MatrixTexture;
 	char mattex[16];
 	for (int i = 0; i<5; i++)
 	{
 		MLSet::DXDevice->SetTexture(1 + i, m_aDepthMaps[i]);
-		sprintf(mattex, "MatrixTexture%d", 1 + i);
 		MatrixTexture = ViewProj[i] * ScaleBiasMat;
 		MatrixTexture = SMMatrixTranspose(MatrixTexture);
-		if (Generating4Slits)
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PSSM4, mattex, &MatrixTexture);
-		else if (i != 3)
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PSSM3, mattex, &MatrixTexture);
+		aMatrixTexture[i] = MatrixTexture;
 	}
 
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PSSM4, "g_aMatrixTexture", &aMatrixTexture);
+
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth);
 	if (Generating4Slits)
 		SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PSSM4);
@@ -475,25 +480,19 @@ void PSSM::genShadow(IDirect3DTexture9* shadowmap)
 	float3 observerpos;
 	Core_RFloat3Get(G_RI_FLOAT3_OBSERVER_POSITION, &observerpos);
 	
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "ParamProj", &float3_t(*r_win_width, *r_win_height, *r_default_fov));
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "NearFar", &float2_t(*r_near, *r_far));
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "g_vParamProj", &float3_t(*r_win_width, *r_win_height, *r_default_fov));
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "g_vNearFar", &float2_t(*r_near, *r_far));
 	
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "ViewInv", &ViewInv);
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "g_mViewInv", &ViewInv);
 
-	if (Generating4Slits)
-	{
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PSSM4, "PosCam", &observerpos);
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PSSM4, "PixelSize", &float2(BlurPixel / MLSet::SizeTexDepthGlobal.x, BlurPixel / MLSet::SizeTexDepthGlobal.y));
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PSSM4, "NearFar", &float2_t(*r_near, *r_far));
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PSSM4, "DistSplit", &float4(m_aNearFar[0].y, m_aNearFar[1].y, m_aNearFar[2].y, m_aNearFar[3].y));
-	}
-	else
-	{
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PSSM3, "PosCam", &observerpos);
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PSSM3, "PixelSize", &float2(BlurPixel / MLSet::SizeTexDepthGlobal.x, BlurPixel / MLSet::SizeTexDepthGlobal.y));
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PSSM3, "NearFar", &float2_t(*r_near, *r_far));
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PSSM3, "DistSplit", &float4(m_aNearFar[0].y, m_aNearFar[1].y, m_aNearFar[2].y, m_aNearFar[3].y));
-	}
+	float aDistSplits[4] = { m_aNearFar[0].y, m_aNearFar[1].y, m_aNearFar[2].y, m_aNearFar[3].y };
+
+	ID idShader = (Generating4Slits ? MLSet::IDsShaders::PS::PSSM4 : MLSet::IDsShaders::PS::PSSM3);
+
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idShader, "g_vPosCam", &observerpos);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idShader, "g_vPixelSize", &float2(BlurPixel / MLSet::SizeTexDepthGlobal.x, BlurPixel / MLSet::SizeTexDepthGlobal.y));
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idShader, "g_vNearFar", &float2_t(*r_near, *r_far));
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idShader, "g_vDistSplit", &float4(m_aNearFar[0].y, m_aNearFar[1].y, m_aNearFar[2].y, m_aNearFar[3].y));
 
 	SGCore_ScreenQuadDraw();
 
@@ -504,6 +503,11 @@ void PSSM::genShadow(IDirect3DTexture9* shadowmap)
 
 	mem_release_del(RenderSurf);
 	mem_release_del(BackBuf);
+
+	if (GetAsyncKeyState(VK_NUMPAD1))
+	{
+		D3DXSaveTextureToFile("C:\\1\\pssm.png", D3DXIFF_PNG, shadowmap, NULL);
+	}
 }
 
 void PSSM::genShadowAll(IDirect3DTexture9* shadowmap)
@@ -718,7 +722,7 @@ void ShadowMapTech::begin()
 	
 	Frustum->update(&(View),&(Proj));
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomPSSMDirect, "WorldViewProjection", &SMMatrixTranspose(View * Proj));
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomPSSMDirect, "g_mWVP", &SMMatrixTranspose(View * Proj));
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomPSSMDirect);
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SMDepthGeomPSSMDirect);
 
@@ -782,9 +786,9 @@ void ShadowMapTech::genShadow(IDirect3DTexture9* shadowmap)
 	MatrixTexture = SMMatrixTranspose(MatrixTexture);
 
 	if (MLSet::IsHalfGenPCFShadowLocal)
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowDirect4, "MatrixTexture", &MatrixTexture);
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowDirect4, "g_mMatrixTexture", &MatrixTexture);
 	else
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowDirect9, "MatrixTexture", &MatrixTexture);
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowDirect9, "g_mMatrixTexture", &MatrixTexture);
 
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth);
 
@@ -793,24 +797,24 @@ void ShadowMapTech::genShadow(IDirect3DTexture9* shadowmap)
 	else
 		SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowDirect9);
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "ParamProj", &float3_t(*r_win_width, *r_win_height, *r_default_fov));
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "NearFar", &float2_t(*r_near, *r_far));
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "g_vParamProj", &float3_t(*r_win_width, *r_win_height, *r_default_fov));
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "g_vNearFar", &float2_t(*r_near, *r_far));
 
 	float3 observerpos;
 	Core_RFloat3Get(G_RI_FLOAT3_OBSERVER_POSITION, &observerpos);
 
 	if (MLSet::IsHalfGenPCFShadowLocal)
 	{
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowDirect4, "PosCam", &observerpos);
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowDirect4, "PixelSize", &float2(BlurPixel / MLSet::SizeTexDepthLocal.x, BlurPixel / MLSet::SizeTexDepthLocal.y));
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowDirect4, "SizeMapBias", &float3(MLSet::SizeTexDepthLocal.x, MLSet::SizeTexDepthLocal.y, Bias));
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowDirect4, "g_vPosCam", &observerpos);
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowDirect4, "g_vPixelSize", &float2(BlurPixel / MLSet::SizeTexDepthLocal.x, BlurPixel / MLSet::SizeTexDepthLocal.y));
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowDirect4, "g_vSizeMapBias", &float3(MLSet::SizeTexDepthLocal.x, MLSet::SizeTexDepthLocal.y, Bias));
 		//SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowDirect4, "NearFar", &float2_t(*r_near, *r_far));
 	}
 	else
 	{
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowDirect9, "PosCam", &observerpos);
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowDirect9, "PixelSize", &float2(BlurPixel / MLSet::SizeTexDepthLocal.x, BlurPixel / MLSet::SizeTexDepthLocal.y));
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowDirect9, "SizeMapBias", &float3(MLSet::SizeTexDepthLocal.x, MLSet::SizeTexDepthLocal.y, Bias));
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowDirect9, "g_vPosCam", &observerpos);
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowDirect9, "g_vPixelSize", &float2(BlurPixel / MLSet::SizeTexDepthLocal.x, BlurPixel / MLSet::SizeTexDepthLocal.y));
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowDirect9, "g_vSizeMapBias", &float3(MLSet::SizeTexDepthLocal.x, MLSet::SizeTexDepthLocal.y, Bias));
 		//SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowDirect9, "NearFar", &float2_t(*r_near, *r_far));
 	}
 
@@ -821,7 +825,7 @@ void ShadowMapTech::genShadow(IDirect3DTexture9* shadowmap)
 	float4x4 ViewInv = SMMatrixInverse(&determ, camview);
 	ViewInv = SMMatrixTranspose(ViewInv);
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "ViewInv", &ViewInv);
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "g_mViewInv", &ViewInv);
 
 	SGCore_ScreenQuadDraw();
 
@@ -1058,8 +1062,8 @@ void ShadowMapCubeTech::pre(int cube)
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomCube);
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SMDepthGeomCube);
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomCube, "LightPos", &Position);
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomCube, "WorldViewProjection", &vp);
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomCube, "g_vLightPos", &Position);
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomCube, "g_mWVP", &vp);
 }
 
 void ShadowMapCubeTech::post(int cube)
@@ -1125,8 +1129,8 @@ void ShadowMapCubeTech::genShadow(IDirect3DTexture9* shadowmap)
 	else
 		SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowCube6);
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "ParamProj", &float3_t(*r_win_width, *r_win_height, *r_default_fov));
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "NearFar", &float2_t(*r_near, *r_far));
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "g_vParamProj", &float3_t(*r_win_width, *r_win_height, *r_default_fov));
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "g_vNearFar", &float2_t(*r_near, *r_far));
 
 	float pixel_size = BlurPixel / MLSet::SizeTexDepthLocal.x;
 	float3 observerpos;
@@ -1134,19 +1138,19 @@ void ShadowMapCubeTech::genShadow(IDirect3DTexture9* shadowmap)
 
 	if (MLSet::IsHalfGenPCFShadowLocal)
 	{
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowCube1, "PosCam", &observerpos);
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowCube1, "LightPos", &Position);
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowCube1, "SizeMapBias", &float2(MLSet::SizeTexDepthLocal.x, Bias));
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowCube1, "PixelSize", &pixel_size);
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowCube1, "LightPos", &Position);
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowCube1, "g_vPosCam", &observerpos);
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowCube1, "g_vLightPos", &Position);
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowCube1, "g_vSizeMapBias", &float2(MLSet::SizeTexDepthLocal.x, Bias));
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowCube1, "g_fPixelSize", &pixel_size);
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowCube1, "g_vLightPos", &Position);
 	}
 	else
 	{
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowCube6, "PosCam", &observerpos);
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowCube6, "LightPos", &Position);
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowCube6, "SizeMapBias", &float2(MLSet::SizeTexDepthLocal.x, Bias));
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowCube6, "PixelSize", &pixel_size);
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowCube6, "LightPos", &Position);
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowCube6, "g_vPosCam", &observerpos);
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowCube6, "g_vLightPos", &Position);
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowCube6, "g_vSizeMapBias", &float2(MLSet::SizeTexDepthLocal.x, Bias));
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowCube6, "g_fPixelSize", &pixel_size);
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowCube6, "g_vLightPos", &Position);
 	}
 
 	float4x4 camview;
@@ -1156,7 +1160,7 @@ void ShadowMapCubeTech::genShadow(IDirect3DTexture9* shadowmap)
 	float4x4 ViewInv = SMMatrixInverse(&determ, camview);
 	ViewInv = SMMatrixTranspose(ViewInv);
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "ViewInv", &ViewInv);
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "g_mViewInv", &ViewInv);
 
 	SGCore_ScreenQuadDraw();
 
diff --git a/source/pp/sxpp.cpp b/source/pp/sxpp.cpp
index 6eab4aee7e63da6d4cde9ea6b364c185d0b01224..9b8a1ae92aa263332d0b0117be19120879c5de87 100644
--- a/source/pp/sxpp.cpp
+++ b/source/pp/sxpp.cpp
@@ -73,10 +73,12 @@ namespace PPSet
 
 			ID DOF;
 
-			ID EdgeDetect;
+			ID DepthEdgeDetect;
 			ID NFAA;
 			ID DLAA_Small;
 			ID DLAA_Long;
+
+			ID idClip;
 		};
 	};
 
@@ -86,13 +88,20 @@ namespace PPSet
 		ID Depth0;
 		ID Depth1;
 
+		ID DepthD2;
+
 		ID Input;
 		ID Output;
 
 		ID EdgeDetected;
+		ID EdgeDetected2;
 
 		ID IntermediateWinSize;
 		ID IntermediateWinSize2;
+
+		ID IntermediateWinSizeD2;
+		ID IntermediateWinSize2D2;
+
 		ID Bright;
 		ID Bright2;
 
@@ -162,12 +171,35 @@ void PPSet::Init()
 
 	PPSet::IDsShaders::PS::NFAA = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "ppe_nfaa.ps", "ppe_nfaa.ps", SHADER_CHECKDOUBLE_PATH);
 
-	PPSet::IDsShaders::PS::EdgeDetect = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "ppe_edge_detected.ps", "ppe_edge_detected.ps", SHADER_CHECKDOUBLE_PATH);
+	PPSet::IDsShaders::PS::DepthEdgeDetect = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "ppe_depth_edge_detected.ps", "ppe_depth_edge_detected.ps", SHADER_CHECKDOUBLE_PATH);
 
 	PPSet::IDsShaders::PS::DLAA_Small = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "ppe_dlaa_small.ps", "ppe_dlaa_small.ps", SHADER_CHECKDOUBLE_PATH);
 	PPSet::IDsShaders::PS::DLAA_Long = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "ppe_dlaa_long.ps", "ppe_dlaa_long.ps", SHADER_CHECKDOUBLE_PATH);
 
-	PPSet::IDsTexs::Noise = SGCore_LoadTexAddName("noise_rottex.dds", LOAD_TEXTURE_TYPE_CONST);
+	PPSet::IDsShaders::PS::idClip = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pp_clip.ps", "pp_clip.ps", SHADER_CHECKDOUBLE_NAME);
+
+	//PPSet::IDsTexs::Noise = SGCore_LoadTexAddName("noise_rottex.dds", LOAD_TEXTURE_TYPE_CONST);
+
+	D3DLOCKED_RECT LockedRect;
+	uint32_t* tmpOldColor;
+	IDirect3DTexture9 *pRnsSampler;
+	PPSet::DXDevice->CreateTexture(*r_win_width, *r_win_height, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &pRnsSampler, NULL);
+
+	//uint32_t aRndColors[16];// = D3DCOLOR_ARGB(0, 250, 2, 255);
+
+	
+
+	pRnsSampler->LockRect(0, &LockedRect, 0, 0);
+	for (int i = 0; i < (*r_win_width) * (*r_win_height); ++i)
+	{
+		((DWORD*)LockedRect.pBits)[i] = D3DCOLOR_ARGB(255, rand() % 255, rand() % 255, rand() % 255);
+		//memcpy(LockedRect.pBits + (i * sizeof(DWORD)), aRndColors, sizeof(uint32_t));
+	}
+	pRnsSampler->UnlockRect(0);
+
+	//SGCore_LoadTexLoadTextures();
+	PPSet::IDsTexs::Noise = SGCore_LoadTexCreate("noise_rottex_fullscreen__", pRnsSampler);
+
 	PPSet::IDsTexs::Sun = -1;
 
 	
@@ -187,12 +219,18 @@ void PPSet::Init()
 		PPSet::ArrRndVecSSAO[i].z *= scale;
 	}
 
-	PPSet::IDsRenderTargets::EdgeDetected = SGCore_RTAdd(PPSet::WinSize.x, PPSet::WinSize.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R5G6B5, D3DPOOL_DEFAULT, "pp_edge_detected", 1);
+	PPSet::IDsRenderTargets::DepthD2 = SGCore_RTAdd(PPSet::WinSize.x * 0.5f, PPSet::WinSize.y * 0.5f, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R32F, D3DPOOL_DEFAULT, "pp_depth_d2", 0.5);
+	PPSet::IDsRenderTargets::EdgeDetected = SGCore_RTAdd(PPSet::WinSize.x, PPSet::WinSize.y, 1, D3DUSAGE_RENDERTARGET | D3DUSAGE_AUTOGENMIPMAP, D3DFMT_R5G6B5, D3DPOOL_DEFAULT, "pp_edge_detected", 1);
+	PPSet::IDsRenderTargets::EdgeDetected2 = SGCore_RTAdd(PPSet::WinSize.x, PPSet::WinSize.y, 1, D3DUSAGE_RENDERTARGET | D3DUSAGE_AUTOGENMIPMAP, D3DFMT_R5G6B5, D3DPOOL_DEFAULT, "pp_edge_detected2", 1);
 
 	PPSet::IDsRenderTargets::IntermediateWinSize = SGCore_RTAdd(PPSet::WinSize.x, PPSet::WinSize.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, "pp_intermidiatews", 1);
 	PPSet::IDsRenderTargets::IntermediateWinSize2 = SGCore_RTAdd(PPSet::WinSize.x, PPSet::WinSize.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, "pp_intermidiatews2", 1);
-	PPSet::IDsRenderTargets::Bright = SGCore_RTAdd(PPSet::WinSize.x, PPSet::WinSize.y, 0, D3DUSAGE_RENDERTARGET | D3DUSAGE_AUTOGENMIPMAP, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, "pp_bright", 1);
-	PPSet::IDsRenderTargets::Bright2 = SGCore_RTAdd(PPSet::WinSize.x, PPSet::WinSize.y, 0, D3DUSAGE_RENDERTARGET | D3DUSAGE_AUTOGENMIPMAP, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, "pp_bright2", 1);
+
+	PPSet::IDsRenderTargets::IntermediateWinSizeD2 = SGCore_RTAdd(PPSet::WinSize.x * 0.5, PPSet::WinSize.y * 0.5, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, "pp_intermidiatews_d2", 0.5);
+	PPSet::IDsRenderTargets::IntermediateWinSize2D2 = SGCore_RTAdd(PPSet::WinSize.x * 0.5, PPSet::WinSize.y * 0.5, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, "pp_intermidiatews2_d2", 0.5);
+
+	PPSet::IDsRenderTargets::Bright = SGCore_RTAdd(PPSet::WinSize.x * 0.5, PPSet::WinSize.y * 0.5, 0, D3DUSAGE_RENDERTARGET | D3DUSAGE_AUTOGENMIPMAP, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, "pp_bright", 0.5);
+	PPSet::IDsRenderTargets::Bright2 = SGCore_RTAdd(PPSet::WinSize.x * 0.5, PPSet::WinSize.y * 0.5, 0, D3DUSAGE_RENDERTARGET | D3DUSAGE_AUTOGENMIPMAP, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, "pp_bright2", 0.5);
 }
 
 #define PP_PRECOND(retval) if(!PPSet::DXDevice){LibReport(REPORT_MSG_LEVEL_ERROR, "%s - post process is not init", GEN_MSG_LOCATION); return retval;}
@@ -237,6 +275,34 @@ SX_LIB_API void SPP_0Create(const char* name, bool is_unic)
 		LibReport(REPORT_MSG_LEVEL_ERROR, "%s - not init argument [name]", GEN_MSG_LOCATION);
 }
 
+SX_LIB_API void SPP_OnLostDevice()
+{
+
+}
+
+SX_LIB_API void SPP_OnDeviceReset()
+{
+	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
+	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
+
+	D3DLOCKED_RECT LockedRect;
+	uint32_t* tmpOldColor;
+	//ID idTex = SGCore_LoadTexGetID("noise_rottex_fullscreen__");
+	IDirect3DTexture9 *pRnsSampler = SGCore_LoadTexGetTex(PPSet::IDsTexs::Noise);
+	mem_release_del(pRnsSampler);
+	PPSet::DXDevice->CreateTexture(*r_win_width, *r_win_height, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &pRnsSampler, NULL);
+
+	pRnsSampler->LockRect(0, &LockedRect, 0, 0);
+
+	for (int i = 0; i < (*r_win_width) * (*r_win_height); ++i)
+		((DWORD*)LockedRect.pBits)[i] = D3DCOLOR_ARGB(255, rand() % 255, rand() % 255, rand() % 255);
+
+	pRnsSampler->UnlockRect(0);
+
+	//SGCore_LoadTexLoadTextures();
+	PPSet::IDsTexs::Noise = SGCore_LoadTexCreate("noise_rottex_fullscreen__", pRnsSampler);
+}
+
 SX_LIB_API void SPP_0Kill()
 {
 	PPSet::DXDevice = 0;
@@ -365,8 +431,8 @@ SX_LIB_API void SPP_RenderFogLinear(float3_t* color, float density)
 
 	PPSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(PPSet::IDsRenderTargets::Depth0));
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::FogLinear, "FogColor", color);
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::FogLinear, "FogDenisty", &density);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::FogLinear, "g_vFogColor", color);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::FogLinear, "g_fFogDenisty", &density);
 	//SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::FogLinear, "NearFar", &PPSet::NearFar);
 
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ScreenOut);
@@ -390,6 +456,7 @@ SX_LIB_API void SPP_RenderSSAO(float4_t* param, int quality)
 	PP_PRECOND_SECOND(_VOID);
 
 	PPSet::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
+	
 
 	LPDIRECT3DSURFACE9 RenderSurf, BackBuf;
 	SGCore_RTGetTexture(PPSet::IDsRenderTargets::IntermediateWinSize)/*SGCore_RTGetTexture(PPSet::IDsRenderTargets::GetSendRT())*/->GetSurfaceLevel(0, &RenderSurf);
@@ -398,6 +465,8 @@ SX_LIB_API void SPP_RenderSSAO(float4_t* param, int quality)
 
 	PPSet::DXDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0);
 
+	PPSet::DXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED);
+
 	SGCore_SetSamplerFilter(0, D3DTEXF_LINEAR);
 	SGCore_SetSamplerAddress(0, D3DTADDRESS_CLAMP);
 	SGCore_SetSamplerFilter(1, D3DTEXF_POINT);
@@ -416,23 +485,23 @@ SX_LIB_API void SPP_RenderSSAO(float4_t* param, int quality)
 	else if (quality == 2)
 		idpsshader = PPSet::IDsShaders::PS::SSAO_Q_2;
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idpsshader, "NearFar", &PPSet::NearFar);
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idpsshader, "Params", &float4(param->x, param->y, param->z, param->w));
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idpsshader, "ArrRndVecSSAO", &PPSet::ArrRndVecSSAO);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idpsshader, "g_vNearFar", &PPSet::NearFar);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idpsshader, "g_vParams", &float4(param->x, param->y, param->z, param->w));
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idpsshader, "g_aRndVectors", &PPSet::ArrRndVecSSAO);
 	//float scale_rnd = PPSet::WinSize.x * 0.25f;
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idpsshader, "Ratio", &float2_t(PPSet::WinSize.x / PPSet::WinSize.y, 1));
+	//SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idpsshader, "Ratio", &float2_t(PPSet::WinSize.x / PPSet::WinSize.y, 1));
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idpsshader, "ViewPos", &PPSet::ConstCurrCamPos);
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idpsshader, "ViewProj", &SMMatrixTranspose(PPSet::MCamView * PPSet::MCamProj));
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idpsshader, "g_vViewPos", &PPSet::ConstCurrCamPos);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idpsshader, "g_vViewProj", &SMMatrixTranspose(PPSet::MCamView * PPSet::MCamProj));
 
 	float determ = 0;
 	float4x4 ViewInv = SMMatrixInverse(&determ, PPSet::MCamView);
 	ViewInv = SMMatrixTranspose(ViewInv);
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ResPos, "ViewInv", &ViewInv);
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ResPos, "NearFar", &PPSet::NearFar);
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ResPos, "g_mViewInv", &ViewInv);
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ResPos, "g_vNearFar", &PPSet::NearFar);
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ResPos, "ParamProj", &float3_t(PPSet::WinSize.x, PPSet::WinSize.y, PPSet::ProjFov));
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ResPos, "g_vParamProj", &float3_t(PPSet::WinSize.x, PPSet::WinSize.y, PPSet::ProjFov));
 
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ResPos);
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, idpsshader);
@@ -449,15 +518,15 @@ SX_LIB_API void SPP_RenderSSAO(float4_t* param, int quality)
 
 
 
-	SGCore_RTGetTexture(PPSet::IDsRenderTargets::IntermediateWinSize2)->GetSurfaceLevel(0, &RenderSurf);
+	/*SGCore_RTGetTexture(PPSet::IDsRenderTargets::IntermediateWinSize2)->GetSurfaceLevel(0, &RenderSurf);
 	//PPSet::DXDevice->GetRenderTarget(0, &BackBuf);
 	PPSet::DXDevice->SetRenderTarget(0, RenderSurf);
 
 	PPSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(PPSet::IDsRenderTargets::Depth1));
 	PPSet::DXDevice->SetTexture(1, SGCore_RTGetTexture(PPSet::IDsRenderTargets::IntermediateWinSize));
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::SSAOBlur1, "PixelSize", &float2_t(2.0f / PPSet::WinSize.x, 2.0f / PPSet::WinSize.y));
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::SSAOBlur1, "NearFar", &PPSet::NearFar);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::SSAOBlur1, "g_vPixelSize", &float2_t(2.0f / PPSet::WinSize.x, 2.0f / PPSet::WinSize.y));
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::SSAOBlur1, "g_vNearFar", &PPSet::NearFar);
 
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ScreenOut);
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::SSAOBlur1);
@@ -468,20 +537,21 @@ SX_LIB_API void SPP_RenderSSAO(float4_t* param, int quality)
 
 	//PPSet::DXDevice->SetRenderTarget(0, BackBuf);
 
-	mem_release(RenderSurf);
+	mem_release(RenderSurf);*/
 	//mem_release(BackBuf);
-
+	
+	PPSet::DXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_ALPHA);
 
 	SGCore_RTGetTexture(PPSet::IDsRenderTargets::GetRenderRT())->GetSurfaceLevel(0, &RenderSurf);
 	//PPSet::DXDevice->GetRenderTarget(0, &BackBuf);
 	PPSet::DXDevice->SetRenderTarget(0, RenderSurf);
 
 	PPSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(PPSet::IDsRenderTargets::Depth1));
-	PPSet::DXDevice->SetTexture(1, SGCore_RTGetTexture(PPSet::IDsRenderTargets::IntermediateWinSize2));
+	PPSet::DXDevice->SetTexture(1, SGCore_RTGetTexture(PPSet::IDsRenderTargets::IntermediateWinSize));
 	PPSet::DXDevice->SetTexture(2, SGCore_RTGetTexture(PPSet::IDsRenderTargets::GetSendRT()));
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::SSAOBlur2, "PixelSize", &float2_t(1.f / PPSet::WinSize.x, 1.f / PPSet::WinSize.y));
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::SSAOBlur2, "NearFar", &PPSet::NearFar);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::SSAOBlur2, "g_vPixelSize", &float2_t(1.f / PPSet::WinSize.x, 1.f / PPSet::WinSize.y));
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::SSAOBlur2, "g_vNearFar", &PPSet::NearFar);
 
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ScreenOut);
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::SSAOBlur2);
@@ -498,13 +568,13 @@ SX_LIB_API void SPP_RenderSSAO(float4_t* param, int quality)
 	PPSet::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
 	PPSet::IDsRenderTargets::IncrRT();
 
-	if (GetKeyState('N'))
+	/*if (GetKeyState('N'))
 	{
 		//MessageBox(0,"PP GetKeyState",0,0);
 		char tmppath[1024];
 		sprintf(tmppath, "%sssao.jpg", "C:\\1\\");
 		D3DXSaveTextureToFile(tmppath, D3DXIFF_JPG, SGCore_RTGetTexture(PPSet::IDsRenderTargets::IntermediateWinSize), NULL);
-	}
+	}*/
 }
 
 
@@ -522,7 +592,7 @@ SX_LIB_API void SPP_RenderWhiteBlack(float coef)
 
 	PPSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(PPSet::IDsRenderTargets::GetSendRT()));
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::WhiteBlack, "CountPassWB", &coef);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::WhiteBlack, "g_fCoef", &coef);
 
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ScreenOut);
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::WhiteBlack);
@@ -552,11 +622,11 @@ SX_LIB_API void SPP_RenderSepia(float coef)
 
 	PPSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(PPSet::IDsRenderTargets::GetSendRT()));
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::Sepia, "CountSepia", &coef);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::Sepia, "g_vCountSepia", &coef);
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::Sepia, "LightColor", &PP_SEPIA_LIGHT_COLOR);
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::Sepia, "DarkColor", &PP_SEPIA_DARK_COLOR);
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::Sepia, "LumWeights", &PP_SEPIA_WEIGHTS_COLOR);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::Sepia, "g_vLightColor", &PP_SEPIA_LIGHT_COLOR);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::Sepia, "g_vDarkColor", &PP_SEPIA_DARK_COLOR);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::Sepia, "g_vLumWeights", &PP_SEPIA_WEIGHTS_COLOR);
 
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ScreenOut);
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::Sepia);
@@ -586,7 +656,7 @@ SX_LIB_API void SPP_RenderCBG(float3_t* param)
 
 	PPSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(PPSet::IDsRenderTargets::GetSendRT()));
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::CBG, "Param", &param);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::CBG, "g_vParam", &param);
 
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ScreenOut);
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::CBG);
@@ -622,8 +692,8 @@ SX_LIB_API void SPP_RenderDOF(float4_t* param, float sky_blur)
 	float2_t tmpSizeMap = float2_t(desc.Width, desc.Height);
 
 	float tmpcoefblurbloom = 1.f;
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::GaussBlurH, "CoefBlur", &tmpcoefblurbloom);
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::GaussBlurH, "SizeMap", &tmpSizeMap);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::GaussBlurH, "g_fCoefBlur", &tmpcoefblurbloom);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::GaussBlurH, "g_vSizeMap", &tmpSizeMap);
 
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ScreenOut);
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::GaussBlurH);
@@ -647,8 +717,8 @@ SX_LIB_API void SPP_RenderDOF(float4_t* param, float sky_blur)
 
 	PPSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(PPSet::IDsRenderTargets::GetRenderRT()));
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::GaussBlurW, "CoefBlur", &tmpcoefblurbloom);
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::GaussBlurW, "SizeMap", &tmpSizeMap);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::GaussBlurW, "g_fCoefBlur", &tmpcoefblurbloom);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::GaussBlurW, "g_vSizeMap", &tmpSizeMap);
 
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ScreenOut);
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::GaussBlurW);
@@ -675,9 +745,9 @@ SX_LIB_API void SPP_RenderDOF(float4_t* param, float sky_blur)
 	PPSet::DXDevice->SetTexture(2, SGCore_RTGetTexture(PPSet::IDsRenderTargets::IntermediateWinSize));
 
 	float tmpskyblur = 0.0f;
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::DOF, "Param", param);
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::DOF, "SkyBlur", &sky_blur);
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::DOF, "NearFar", &PPSet::NearFar);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::DOF, "g_vParam", param);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::DOF, "g_fSkyBlur", &sky_blur);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::DOF, "g_vNearFar", &PPSet::NearFar);
 
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ScreenOut);
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::DOF);
@@ -802,11 +872,11 @@ SX_LIB_API void SPP_RenderSun(float4_t* sun_color)
 	PPSet::DXDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
 	PPSet::DXDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::SunRender, "LightPos", &PPSet::SunPos);
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::SunRender, "SizeMap", &(PPSet::WinSize));
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::SunRender, "SizeTexSun", &SizeMapSun);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::SunRender, "g_vLightPos", &PPSet::SunPos);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::SunRender, "g_vSizeMap", &(PPSet::WinSize));
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::SunRender, "g_vSizeTexSun", &SizeMapSun);
 	//SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::SunRender, "PixelSize", &float2_t(1.f / PPSet::WinSize.x, 1.f / PPSet::WinSize.y));
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::SunRender, "LightColor", sun_color);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::SunRender, "g_vLightColor", sun_color);
 	//SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::SunRender, "NearFar", &PPSet::NearFar);
 
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ScreenOut);
@@ -855,10 +925,10 @@ SX_LIB_API void SPP_RenderLensFlare(float3_t* param, float4_t* sun_color, bool u
 		float2_t tmpSizeMap = float2_t(desc.Width, desc.Height);
 
 		float LensFlareSunRadius = PP_SUN_RADIUS;
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::LensFlare0, "LightPos", &PPSet::SunPos);
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::LensFlare0, "SizeMap", &tmpSizeMap);
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::LensFlare0, "RadiusSun", &LensFlareSunRadius);
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::LensFlare0, "Color", sun_color);
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::LensFlare0, "g_vLightPos", &PPSet::SunPos);
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::LensFlare0, "g_vSizeMap", &tmpSizeMap);
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::LensFlare0, "g_fRadiusSun", &LensFlareSunRadius);
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::LensFlare0, "g_vColor", sun_color);
 		//SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::LensFlare0, "NearFar", &PPSet::NearFar);
 		SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ScreenOut);
 		SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::LensFlare0);
@@ -895,7 +965,7 @@ SX_LIB_API void SPP_RenderLensFlare(float3_t* param, float4_t* sun_color, bool u
 
 	PPSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(PPSet::IDsRenderTargets::Bright));
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::LensFlare2, "LensFlareParam", param);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::LensFlare2, "g_vLensFlareParam", param);
 
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ScreenOut);
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::LensFlare2);
@@ -924,7 +994,7 @@ SX_LIB_API void SPP_RenderBloom(float3_t* param)
 
 	PPSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(PPSet::IDsRenderTargets::GetSendRT()));
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::BloomBP, "Param", param);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::BloomBP, "g_vParam", param);
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ScreenOut);
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::BloomBP);
 
@@ -935,11 +1005,9 @@ SX_LIB_API void SPP_RenderBloom(float3_t* param)
 	//PPSet::DXDevice->SetRenderTarget(0, BackBuf);
 	mem_release(RenderSurf);
 
-	/*if (SSInput_GetKeyState(DIK_N))
+	/*if (GetKeyState('N'))
 	{
-		char tmppath[1024];
-		sprintf(tmppath, "%sbp.png", GData::Pathes::WorkingTex);
-		D3DXSaveTextureToFile(tmppath, D3DXIFF_PNG, SGCore_RTGetTexture(PPSet::IDsRenderTargets::Bright), NULL);
+		D3DXSaveTextureToFile("C:\\1\\sbp.png", D3DXIFF_PNG, SGCore_RTGetTexture(PPSet::IDsRenderTargets::Bright), NULL);
 	}*/
 
 
@@ -955,8 +1023,8 @@ SX_LIB_API void SPP_RenderBloom(float3_t* param)
 	float2_t tmpSizeMap = float2_t(desc.Width, desc.Height);
 
 	float tmpcoefblurbloom = 2.f;
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::GaussBlurH, "CoefBlur", &tmpcoefblurbloom);
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::GaussBlurH, "SizeMap", &tmpSizeMap);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::GaussBlurH, "g_fCoefBlur", &tmpcoefblurbloom);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::GaussBlurH, "g_vSizeMap", &tmpSizeMap);
 
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ScreenOut);
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::GaussBlurH);
@@ -977,8 +1045,8 @@ SX_LIB_API void SPP_RenderBloom(float3_t* param)
 
 	PPSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(PPSet::IDsRenderTargets::Bright2));
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::GaussBlurW, "CoefBlur", &tmpcoefblurbloom);
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::GaussBlurW, "SizeMap", &tmpSizeMap);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::GaussBlurW, "g_fCoefBlur", &tmpcoefblurbloom);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::GaussBlurW, "g_vSizeMap", &tmpSizeMap);
 
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ScreenOut);
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::GaussBlurW);
@@ -1032,60 +1100,138 @@ void SPP_ComEdgeDetected()
 {
 	PPSet::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
 	LPDIRECT3DSURFACE9 RenderSurf, BackBuf;
-	SGCore_RTGetTexture(PPSet::IDsRenderTargets::GetRenderRT())->GetSurfaceLevel(0, &RenderSurf);
+
+	/*SGCore_RTGetTexture(PPSet::IDsRenderTargets::DepthD2)->GetSurfaceLevel(0, &RenderSurf);
 
 	PPSet::DXDevice->GetRenderTarget(0, &BackBuf);
 	PPSet::DXDevice->SetRenderTarget(0, RenderSurf);
 
 	SGCore_SetSamplerAddress(0, D3DTADDRESS_MIRROR);
+	SGCore_SetSamplerFilter(0, D3DTEXF_LINEAR);
 
 	PPSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(PPSet::IDsRenderTargets::Depth1));
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::EdgeDetect, "PixelSize", &float2_t(1.f / PPSet::WinSize.x, 1.f / PPSet::WinSize.y));
-
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ScreenOut);
-	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::EdgeDetect);
+	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::ScreenOut);
 
 	SGCore_ScreenQuadDraw();
 
-	mem_release(RenderSurf);
+	mem_release(RenderSurf);*/
+
+	SGCore_SetSamplerAddress(0, D3DTADDRESS_MIRROR);
+	//SGCore_SetSamplerFilter(0, D3DTEXF_LINEAR);
+
 	SGCore_RTGetTexture(PPSet::IDsRenderTargets::EdgeDetected)->GetSurfaceLevel(0, &RenderSurf);
+
+	PPSet::DXDevice->GetRenderTarget(0, &BackBuf);
 	PPSet::DXDevice->SetRenderTarget(0, RenderSurf);
 
+	SGCore_SetSamplerAddress(0, D3DTADDRESS_MIRROR);
+	SGCore_SetSamplerFilter(0, D3DTEXF_LINEAR);
+
 	PPSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(PPSet::IDsRenderTargets::Depth1));
-	PPSet::DXDevice->SetTexture(1, SGCore_RTGetTexture(PPSet::IDsRenderTargets::GetRenderRT()));
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::SSAOBlur1, "PixelSize", &float2_t(2.0f / PPSet::WinSize.x, 2.0f / PPSet::WinSize.y));
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::SSAOBlur1, "NearFar", &PPSet::NearFar);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::DepthEdgeDetect, "g_vPixelSize", &float2_t(1.f / PPSet::WinSize.x, 1.f / PPSet::WinSize.y));
 
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ScreenOut);
-	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::SSAOBlur1);
+	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::DepthEdgeDetect);
+
+	SGCore_ScreenQuadDraw();
+
+	mem_release(RenderSurf);
+	SGCore_RTGetTexture(PPSet::IDsRenderTargets::EdgeDetected2)->GetSurfaceLevel(0, &RenderSurf);
+	PPSet::DXDevice->SetRenderTarget(0, RenderSurf);
+
+	//PPSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(PPSet::IDsRenderTargets::Depth1));
+	PPSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(PPSet::IDsRenderTargets::EdgeDetected));
+
+	D3DSURFACE_DESC desc;
+	SGCore_RTGetTexture(PPSet::IDsRenderTargets::EdgeDetected)->GetLevelDesc(0, &desc);
+
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::FreeBlur3x3, "g_vPixelSize", &float2_t(1.0f / desc.Width, 1.0f / desc.Height));
+	//SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::SSAOBlur1, "g_vNearFar", &PPSet::NearFar);
+
+	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ScreenOut);
+	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::FreeBlur3x3);
 
 	SGCore_ScreenQuadDraw();
 
 	SGCore_ShaderUnBind();
 
-	PPSet::DXDevice->SetRenderTarget(0, BackBuf);
 	mem_release(RenderSurf);
+	PPSet::DXDevice->SetRenderTarget(0, BackBuf);
 	mem_release(BackBuf);
+
+
+
+	PPSet::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
+	PPSet::DXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, FALSE);
+
+	PPSet::DXDevice->Clear(0, 0, D3DCLEAR_STENCIL, 0, 1.0f, 0);
+
+	PPSet::DXDevice->SetRenderState(D3DRS_STENCILENABLE, TRUE);
+
+	PPSet::DXDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS);
+	PPSet::DXDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP);
+	PPSet::DXDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE);
+	PPSet::DXDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP);
+	PPSet::DXDevice->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP);
+
+	PPSet::DXDevice->SetRenderState(D3DRS_STENCILREF, 1);
+	PPSet::DXDevice->SetRenderState(D3DRS_STENCILMASK, 0xFFFFFFFF);
+	PPSet::DXDevice->SetRenderState(D3DRS_STENCILWRITEMASK, 0xFFFFFFFF);
+
+	
+
+	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ScreenOut);
+	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::idClip);
+
+	PPSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(PPSet::IDsRenderTargets::EdgeDetected2));
+	SGCore_SetSamplerFilter(0, D3DTEXF_LINEAR);
+
+	SGCore_ScreenQuadDraw();
+
+	PPSet::DXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_ALPHA);
+
+	SGCore_ShaderUnBind();
+
+	PPSet::DXDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE);
+
+	if (GetAsyncKeyState('N'))
+	{
+		D3DXSaveTextureToFile("C:\\1\\EdgeDetected.jpg", D3DXIFF_JPG, SGCore_RTGetTexture(PPSet::IDsRenderTargets::EdgeDetected), NULL);
+		D3DXSaveTextureToFile("C:\\1\\EdgeDetected2.jpg", D3DXIFF_JPG, SGCore_RTGetTexture(PPSet::IDsRenderTargets::EdgeDetected2), NULL);
+	}
 }
 
 SX_LIB_API void SPP_RenderNFAA(float3_t* param)
 {
+	SGCore_SetSamplerFilter(0, D3DTEXF_NONE);
+	SGCore_SetSamplerAddress(0, D3DTADDRESS_CLAMP);
 	PPSet::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
+	PPSet::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
+
 	LPDIRECT3DSURFACE9 RenderSurf, BackBuf;
 	SGCore_RTGetTexture(PPSet::IDsRenderTargets::GetRenderRT())->GetSurfaceLevel(0, &RenderSurf);
 
+	PPSet::DXDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0);
+
 	PPSet::DXDevice->GetRenderTarget(0, &BackBuf);
 	PPSet::DXDevice->SetRenderTarget(0, RenderSurf);
 
-	SGCore_SetSamplerAddress(0, D3DTADDRESS_MIRROR);
+	PPSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(PPSet::IDsRenderTargets::GetSendRT()));
+
+	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ScreenOut);
+	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::ScreenOut);
+
+	SGCore_ScreenQuadDraw();
+
+	//**
 
 	PPSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(PPSet::IDsRenderTargets::GetSendRT()));
-	PPSet::DXDevice->SetTexture(1, SGCore_RTGetTexture(PPSet::IDsRenderTargets::EdgeDetected));
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::NFAA, "Param", param);
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::NFAA, "PixelSize", &float2_t(1.f / PPSet::WinSize.x, 1.f / PPSet::WinSize.y));
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::NFAA, "g_vParam", param);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::NFAA, "g_vPixelSize", &float2_t(1.f / PPSet::WinSize.x, 1.f / PPSet::WinSize.y));
 
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ScreenOut);
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::NFAA);
@@ -1099,45 +1245,62 @@ SX_LIB_API void SPP_RenderNFAA(float3_t* param)
 	mem_release(BackBuf);
 
 	PPSet::IDsRenderTargets::IncrRT();
+
+	PPSet::DXDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE);
 }
 
 SX_LIB_API void SPP_RenderDLAA()
 {
+	SGCore_SetSamplerFilter(0, D3DTEXF_NONE);
+	SGCore_SetSamplerAddress(0, D3DTADDRESS_CLAMP);
 	PPSet::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
+	PPSet::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
+
+
 	LPDIRECT3DSURFACE9 RenderSurf, BackBuf;
 	SGCore_RTGetTexture(PPSet::IDsRenderTargets::GetRenderRT())->GetSurfaceLevel(0, &RenderSurf);
 
+	PPSet::DXDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0);
+
 	PPSet::DXDevice->GetRenderTarget(0, &BackBuf);
 	PPSet::DXDevice->SetRenderTarget(0, RenderSurf);
 
-	SGCore_SetSamplerAddress(0, D3DTADDRESS_MIRROR);
-	//SGCore_SetSamplerAddress(1, D3DTADDRESS_MIRROR);
-
 	PPSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(PPSet::IDsRenderTargets::GetSendRT()));
-	PPSet::DXDevice->SetTexture(1, SGCore_RTGetTexture(PPSet::IDsRenderTargets::EdgeDetected));
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::DLAA_Long, "PixelSize", &float2_t(1.f / PPSet::WinSize.x, 1.f / PPSet::WinSize.y));
+	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ScreenOut);
+	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::ScreenOut);
+
+	SGCore_ScreenQuadDraw();
+
+	//**
 
+	PPSet::DXDevice->SetRenderState(D3DRS_STENCILENABLE, TRUE);
+	PPSet::DXDevice->SetRenderState(D3DRS_STENCILREF, 1);
+	PPSet::DXDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_EQUAL);
+	PPSet::DXDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP);
+
+	PPSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(PPSet::IDsRenderTargets::GetSendRT()));
+	
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ScreenOut);
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::DLAA_Long);
 
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::DLAA_Long, "g_vPixelSize", &float2_t(1.f / PPSet::WinSize.x, 1.f / PPSet::WinSize.y));
+
 	SGCore_ScreenQuadDraw();
 
 	SGCore_ShaderUnBind();
 
 	mem_release(RenderSurf);
 
+	//**
 
 	SGCore_RTGetTexture(PPSet::IDsRenderTargets::GetSendRT())->GetSurfaceLevel(0, &RenderSurf);
 
 	PPSet::DXDevice->SetRenderTarget(0, RenderSurf);
 
-	SGCore_SetSamplerAddress(0, D3DTADDRESS_MIRROR);
-
 	PPSet::DXDevice->SetTexture(0, SGCore_RTGetTexture(PPSet::IDsRenderTargets::GetRenderRT()));
-	PPSet::DXDevice->SetTexture(1, SGCore_RTGetTexture(PPSet::IDsRenderTargets::EdgeDetected));
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::DLAA_Small, "PixelSize", &float2_t(1.f / PPSet::WinSize.x, 1.f / PPSet::WinSize.y));
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::DLAA_Small, "g_vPixelSize", &float2_t(1.f / PPSet::WinSize.x, 1.f / PPSet::WinSize.y));
 
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ScreenOut);
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::DLAA_Small);
@@ -1149,6 +1312,8 @@ SX_LIB_API void SPP_RenderDLAA()
 	PPSet::DXDevice->SetRenderTarget(0, BackBuf);
 	mem_release(RenderSurf);
 	mem_release(BackBuf);
+
+	PPSet::DXDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE);
 }
 
 //##########################################################################
@@ -1176,17 +1341,17 @@ SX_LIB_API void SPP_RenderMotionBlur(float coef, DWORD timeDelta)
 
 	//float4x4 tmpProj = SMMatrixTranspose(PPSet::MCamView*PPSet::MCamProj);
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ResPos, "ViewInv", &ViewInv);
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ResPos, "NearFar", &PPSet::NearFar);
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ResPos, "ParamProj", &float3_t(PPSet::WinSize.x, PPSet::WinSize.y, PPSet::ProjFov));
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ResPos, "g_mViewInv", &ViewInv);
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ResPos, "g_vNearFar", &PPSet::NearFar);
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ResPos, "g_vParamProj", &float3_t(PPSet::WinSize.x, PPSet::WinSize.y, PPSet::ProjFov));
 	
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::MotionBlur, "ViewPos", &PPSet::ConstCurrCamPos);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::MotionBlur, "g_vViewPos", &PPSet::ConstCurrCamPos);
 	float tmpcoefblur = float(timeDelta) * 0.001f * ((coef)*10.f);// 0.3f;// *(float(timeDelta) * 0.001f);
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::MotionBlur, "CoefBlur", &tmpcoefblur);
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::MotionBlur, "NearFar", &PPSet::NearFar);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::MotionBlur, "g_fCoefBlur", &tmpcoefblur);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::MotionBlur, "g_vNearFar", &PPSet::NearFar);
 
 	//SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::MotionBlur, "InvViewProj", &ViewProjInv);
-	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::MotionBlur, "ViewProjectionPrev", &ViewProjPrev);
+	SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::MotionBlur, "g_mVPprev", &ViewProjPrev);
 
 	SGCore_ShaderBind(SHADER_TYPE_VERTEX, PPSet::IDsShaders::VS::ResPos);
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::MotionBlur);
diff --git a/source/pp/sxpp.h b/source/pp/sxpp.h
index 7ad0eacf916aed8cfd9974750aefe5f1102da3e2..53548ed4eb1cca091cb1f9cc945530cf38b45bd8 100644
--- a/source/pp/sxpp.h
+++ b/source/pp/sxpp.h
@@ -68,6 +68,11 @@ SX_LIB_API void SPP_0Create(
 	bool is_unic				//!< должно ли быть имя подсистемы уникальным
 	);
 
+SX_LIB_API void SPP_OnLostDevice();
+
+//! вызывать при попытке сброса устройства
+SX_LIB_API void SPP_OnDeviceReset();
+
 //! уничтожение подсистемы
 SX_LIB_API void SPP_0Kill();	
 
diff --git a/source/render/gdata.cpp b/source/render/gdata.cpp
index 5460a14c33e2cfc0dbb190e6dc080e48e479aa8a..b1ea1347bead1f348a719468f1b9d0fa9841346e 100644
--- a/source/render/gdata.cpp
+++ b/source/render/gdata.cpp
@@ -69,7 +69,7 @@ namespace GData
 
 			 ID BlendAmbientSpecDiffColor;
 
-			 ID ToneMapping;
+			//ID ToneMapping;
 
 			 ID StencilStr;
 			 ID StencilColumn;
@@ -126,7 +126,7 @@ void GData::IDsShaders::InitAllShaders()
 	GData::IDsShaders::VS::ScreenOut = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "pp_quad_render.vs", "pp_quad_render.vs",SHADER_CHECKDOUBLE_PATH);
 	GData::IDsShaders::PS::ScreenOut = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pp_quad_render.ps", "pp_quad_render.ps",SHADER_CHECKDOUBLE_PATH);
 
-	GData::IDsShaders::PS::ToneMapping = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "lighting_tone_mapping.ps", "lighting_tone_mapping.ps",SHADER_CHECKDOUBLE_PATH);
+	//GData::IDsShaders::PS::ToneMapping = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "lighting_tone_mapping.ps", "lighting_tone_mapping.ps",SHADER_CHECKDOUBLE_PATH);
 
 	GData::IDsShaders::VS::ResPos = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "pp_res_pos.vs", "pp_quad_render_res_pos.vs",SHADER_CHECKDOUBLE_PATH);
 
diff --git a/source/render/gdata.h b/source/render/gdata.h
index 4fa35d7da60352e2fe7790a3f27f6184173d3d5b..c85b3cbc8da3dc1308c0212e0d5e049315c69cb3 100644
--- a/source/render/gdata.h
+++ b/source/render/gdata.h
@@ -126,7 +126,7 @@ namespace GData
 
 			extern ID BlendAmbientSpecDiffColor;
 
-			extern ID ToneMapping;
+			//extern ID ToneMapping;
 
 			extern ID StencilStr;
 			extern ID StencilColumn;
diff --git a/source/render/render_func.cpp b/source/render/render_func.cpp
index 72a748facae5d62a95ca58e42bcd793c30ebb497..37549f466269bc43704abe55b10f7fbe382f1362 100644
--- a/source/render/render_func.cpp
+++ b/source/render/render_func.cpp
@@ -109,6 +109,7 @@ void SXRenderFunc::ComDeviceLost(bool isSetWindowSize)
 	SGeom_OnLostDevice();
 	SML_OnLostDevice();
 	SPE_OnLostDevice();
+	SPP_OnLostDevice();
 
 	SXRenderFunc::InitModeWindow();
 	bool bf = SGCore_OnDeviceReset(*r_win_width, *r_win_height, *r_win_windowed);
@@ -127,7 +128,7 @@ void SXRenderFunc::ComDeviceLost(bool isSetWindowSize)
 		SML_OnResetDevice();
 		SGeom_OnResetDevice();
 		SPE_OnResetDevice();
-
+		SPP_OnDeviceReset();
 
 		GData::DXDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
 	}
@@ -757,7 +758,7 @@ void SXRenderFunc::BuildMRT(DWORD timeDelta, bool isRenderSimulation)
 
 			SGCore_ShaderBind(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ScreenOut);
 			SGCore_ShaderBind(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::StencilStr);
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::StencilStr, "WinSize", &vWinSize);
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::StencilStr, "g_vWinSize", &vWinSize);
 
 			SGCore_ScreenQuadDraw();
 
@@ -766,7 +767,7 @@ void SXRenderFunc::BuildMRT(DWORD timeDelta, bool isRenderSimulation)
 
 			SGCore_ShaderBind(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ScreenOut);
 			SGCore_ShaderBind(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::StencilColumn);
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::StencilColumn, "WinSize", &vWinSize);
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::StencilColumn, "g_vWinSize", &vWinSize);
 
 			SGCore_ScreenQuadDraw();
 
@@ -775,7 +776,7 @@ void SXRenderFunc::BuildMRT(DWORD timeDelta, bool isRenderSimulation)
 
 			SGCore_ShaderBind(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ScreenOut);
 			SGCore_ShaderBind(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::StencilStrColumn);
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::StencilStrColumn, "WinSize", &vWinSize);
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::StencilStrColumn, "g_vWinSize", &vWinSize);
 
 			SGCore_ScreenQuadDraw();
 
@@ -850,7 +851,7 @@ void SXRenderFunc::UpdateShadow(DWORD timeDelta)
 	GData::DXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE);
 	GData::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
 	GData::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
-	GData::DXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
+	GData::DXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
 	GData::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
 
 	SetSamplerFilter(0, D3DTEXF_LINEAR);
@@ -891,7 +892,7 @@ void SXRenderFunc::UpdateShadow(DWORD timeDelta)
 				{
 					SML_LigthsUpdateGFrustums(i, 4, &GData::ConstCurrCamPos, &GData::ConstCurrCamDir);
 					SML_LigthsShadowRenderPre(i, 4);
-					GData::DXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
+					GData::DXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
 					GData::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
 					SetSamplerFilter(0, D3DTEXF_LINEAR);
 					SetSamplerFilter(1, D3DTEXF_LINEAR);
@@ -910,6 +911,7 @@ void SXRenderFunc::UpdateShadow(DWORD timeDelta)
 			}
 			else if (SML_LigthsGetType(i) == LTYPE_LIGHT_DIR)
 			{
+				GData::DXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
 				if (SML_LigthsCountUpdateUpdate(i, &GData::ConstCurrCamPos))
 				{
 					SML_LigthsShadowRenderBegin(i);
@@ -937,6 +939,7 @@ void SXRenderFunc::UpdateShadow(DWORD timeDelta)
 			}
 			else if (SML_LigthsGetType(i) == LTYPE_LIGHT_POINT)
 			{
+				GData::DXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
 				if (SML_LigthsGetTypeShadowed(i) != LTYPE_SHADOW_NONE && SML_LigthsCountUpdateUpdate(i, &GData::ConstCurrCamPos))
 				{
 					SML_LigthsShadowRenderBegin(i);
@@ -976,6 +979,7 @@ void SXRenderFunc::UpdateShadow(DWORD timeDelta)
 	}
 	Core_RIntSet(G_RI_INT_RENDERSTATE, RENDER_STATE_FREE);
 	GData::DXDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_ALPHA);
+	GData::DXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
 }
 
 void SXRenderFunc::RenderSky(DWORD timeDelta)
@@ -1200,9 +1204,9 @@ void SXRenderFunc::ComLighting(DWORD timeDelta)
 			float4x4 ViewInv = SMMatrixInverse(&determ, GData::MCamView);
 			ViewInv = SMMatrixTranspose(ViewInv);
 
-			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ResPos, "ViewInv", &ViewInv);
-			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ResPos, "NearFar", &GData::NearFar);
-			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ResPos, "ParamProj", &float3_t(*r_win_width, *r_win_height, GData::ProjFov));
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ResPos, "g_mViewInv", &ViewInv);
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ResPos, "g_vNearFar", &GData::NearFar);
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ResPos, "g_vParamProj", &float3_t(*r_win_width, *r_win_height, GData::ProjFov));
 
 			float3 tmpPosition;
 			float2 tmpPowerDist;
@@ -1230,10 +1234,10 @@ void SXRenderFunc::ComLighting(DWORD timeDelta)
 			else
 				tmpColor.w = 1.f;
 
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idshader, "ViewPos", &GData::ConstCurrCamPos);
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idshader, "LightPos", &(tmpPosition));
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idshader, "LightPowerDist", &(tmpPowerDist));
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idshader, "LightColor", &tmpColor);
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idshader, "g_vViewPos", &GData::ConstCurrCamPos);
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idshader, "g_vLightPos", &(tmpPosition));
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idshader, "g_vLightPowerDist", &(tmpPowerDist));
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idshader, "g_vLightColor", &tmpColor);
 			//SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idshader, "NearFar", &GData::NearFar);
 
 			SGCore_ShaderBind(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ResPos);
@@ -1341,7 +1345,7 @@ void SXRenderFunc::UnionLayers()
 
 		SGCore_ShaderBind(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ScreenOut);
 		SGCore_ShaderBind(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::UnionAlpha);
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::UnionAlpha, "WinSize", &float4_t(*r_win_width, *r_win_height, 1.f / float(*r_win_width), 1.f / float(*r_win_height)));
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::UnionAlpha, "g_vWinSize", &float4_t(*r_win_width, *r_win_height, 1.f / float(*r_win_width), 1.f / float(*r_win_height)));
 
 		SGCore_ScreenQuadDraw();
 
@@ -1392,51 +1396,6 @@ void SXRenderFunc::UnionLayers()
 	mem_release(BackBuf);
 }
 
-void SXRenderFunc::ApplyToneMapping()
-{
-	LPDIRECT3DSURFACE9 BackBuf, ComLightSurf;
-	SML_DSGetRT(DS_RT_SCENELIGHT2)->GetSurfaceLevel(0, &ComLightSurf);
-	GData::DXDevice->GetRenderTarget(0, &BackBuf);
-	GData::DXDevice->SetRenderTarget(0, ComLightSurf);
-
-	GData::DXDevice->Clear(0, 0, D3DCLEAR_TARGET, RENDER_DEFAUL_BACKGROUND_COLOR, 1.0f, 0);
-
-	SetSamplerFilter(0, 5, D3DTEXF_NONE);
-	SetSamplerAddress(0, 5, D3DTADDRESS_CLAMP);
-
-	GData::DXDevice->SetTexture(0, SML_DSGetRT(DS_RT_SCENELIGHT));
-	GData::DXDevice->SetTexture(1, SML_DSGetRT(DS_RT_ADAPTEDLUM));
-
-	SGCore_ShaderBind(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ScreenOut);
-	SGCore_ShaderBind(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::ToneMapping);
-
-	SGCore_ScreenQuadDraw();
-
-	SGCore_ShaderUnBind();
-
-	mem_release(ComLightSurf);
-
-
-
-	SML_DSGetRT(DS_RT_SCENELIGHT)->GetSurfaceLevel(0, &ComLightSurf);
-	GData::DXDevice->SetRenderTarget(0, ComLightSurf);
-	GData::DXDevice->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0);
-	GData::DXDevice->SetTexture(0, SML_DSGetRT(DS_RT_SCENELIGHT2));
-
-	SGCore_ShaderBind(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ScreenOut);
-	SGCore_ShaderBind(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::ScreenOut);
-
-	SGCore_ScreenQuadDraw();
-
-	mem_release(ComLightSurf);
-
-	GData::DXDevice->SetRenderTarget(0, BackBuf);
-	mem_release(BackBuf);
-
-
-	SGCore_ShaderUnBind();
-}
-
 void SXRenderFunc::ComToneMapping(DWORD timeDelta)
 {
 	//обработка tone mapping
@@ -1474,12 +1433,13 @@ void SXRenderFunc::RenderPostProcess(DWORD timeDelta)
 	static float2_t vWinSize;
 	vWinSize = float2(*r_win_width, *r_win_height);
 
+	SPP_Update();
 	SPP_RTNull();
 
 	static const int * pp_ssao = GET_PCVAR_INT("pp_ssao");
 	if (pp_ssao && (*pp_ssao) > 0)
 		SPP_RenderSSAO(&float4_t(0.3f, 0.1f, 0.8f, 0.3f / GData::NearFar.y), (*pp_ssao));
-
+		
 	//создаем статический вектор цвета тумана, затем получаем квар который int типа который будет содеражть указатель на этот вектор, и в него записываем указатель на вектор цвета тумана
 	//static float3_t fog_color(0.5, 0.5, 0.5);
 	static UINT_PTR *pp_fog_color = GET_PCVAR_POINTER("pp_fog_color");
@@ -1493,9 +1453,9 @@ void SXRenderFunc::RenderPostProcess(DWORD timeDelta)
 
 	static const bool * pp_bloom = GET_PCVAR_BOOL("pp_bloom");
 	if (pp_bloom && (*pp_bloom))
-		SPP_RenderBloom(&float3_t(1, 0.7, 0.1));
+		SPP_RenderBloom(&float3_t(1, 0.7, 1.0));
 
-	SPP_Update();
+	
 
 	float3 tmpPosition;
 	float3 tmpColor;
@@ -1513,20 +1473,20 @@ void SXRenderFunc::RenderPostProcess(DWORD timeDelta)
 	}
 	else
 		SPP_UpdateSun(0);
-
+		
 	static const bool * pp_lensflare = GET_PCVAR_BOOL("pp_lensflare");
 	static const bool * pp_lensflare_usebloom = GET_PCVAR_BOOL("pp_lensflare_usebloom");
 	if (pp_lensflare && (*pp_lensflare) && GlobalLight >= 0)
-		SPP_RenderLensFlare(&float3_t(0.25f, 0.3f, 0.9f), &float4_t(tmpColor.x, tmpColor.y, tmpColor.z, (SML_LigthsGetCastGlobalShadow() ? 0 : SML_LigthsGetPower(GlobalLight))), (pp_lensflare_usebloom ? (*pp_lensflare_usebloom) : false));
+		SPP_RenderLensFlare(&float3_t(0.25f, 0.3f, 0.2f), &float4_t(tmpColor.x, tmpColor.y, tmpColor.z, (SML_LigthsGetCastGlobalShadow() ? 0 : SML_LigthsGetPower(GlobalLight))), (pp_lensflare_usebloom ? (*pp_lensflare_usebloom) : false));
 
 
-	SPP_RenderDOF(&float4_t(0, 200, 0, 100), 0);
+	SPP_RenderDOF(&float4_t(0, 100, 0, 20), 0);
 
 	
-
+	
 	static const bool * pp_nfaa = GET_PCVAR_BOOL("pp_nfaa");
 	if (pp_nfaa && (*pp_nfaa))
-		SPP_RenderNFAA(&float3_t(1, 2, 0));
+		SPP_RenderNFAA(&float3_t(1, 1, 0));
 
 	static const bool * pp_dlaa = GET_PCVAR_BOOL("pp_dlaa");
 	if (pp_dlaa && (*pp_dlaa))
diff --git a/source/render/render_func.h b/source/render/render_func.h
index eb1b1a64c591567a3326e1444aab38839471d8ce..04bb2bea632e168cd1d4aaaa0523d39d4897969a 100644
--- a/source/render/render_func.h
+++ b/source/render/render_func.h
@@ -105,7 +105,7 @@ namespace SXRenderFunc
 	void UnionLayers();
 
 	//! применение тонмаппинга к рт
-	void ApplyToneMapping();
+	//void ApplyToneMapping();
 
 	//! просчет тонмаппинга
 	void ComToneMapping(DWORD timeDelta);
diff --git a/source/render/sxrender.cpp b/source/render/sxrender.cpp
index 0b5458146650a2a006e1d5dcda5367ff30367eaa..3f009525e0b14b0a8ebf9e33966494d70d413f59 100644
--- a/source/render/sxrender.cpp
+++ b/source/render/sxrender.cpp
@@ -326,11 +326,6 @@ SX_LIB_API void SRender_UnionLayers()
 	SXRenderFunc::UnionLayers();
 }
 
-SX_LIB_API void SRender_ApplyToneMapping()
-{
-	SXRenderFunc::ApplyToneMapping();
-}
-
 SX_LIB_API void SRender_ComToneMapping(DWORD timeDelta)
 {
 	SXRenderFunc::ComToneMapping(timeDelta);
diff --git a/source/render/sxrender.h b/source/render/sxrender.h
index eba1c9b18e60eb75a72f426544535e176c708aa0..737ccd5a4b3fc5dc20d4045e59fc766022c39118 100644
--- a/source/render/sxrender.h
+++ b/source/render/sxrender.h
@@ -354,9 +354,6 @@ SX_LIB_API void SRender_ComLighting(DWORD timeDelta);
 //! объединение слоев прозрачности
 SX_LIB_API void SRender_UnionLayers();
 
-//! применение тонмаппинга к рт
-SX_LIB_API void SRender_ApplyToneMapping();
-
 //! просчет тонмаппинга
 SX_LIB_API void SRender_ComToneMapping(DWORD timeDelta);
 
diff --git a/source/skyxengine.cpp b/source/skyxengine.cpp
index eb868786c53c6387bad43e0b0692829732742d6e..1b02db73233b7a3ed3c9b911d53c7c0f350f65d7 100644
--- a/source/skyxengine.cpp
+++ b/source/skyxengine.cpp
@@ -174,7 +174,7 @@ void SkyXEngine_Init(HWND hWnd3D, HWND hWndParent3D)
 	Core_RIntSet(G_RI_INT_TIMER_RENDER, idTimerRender);
 	Core_RIntSet(G_RI_INT_TIMER_GAME, idTimerGame);
 
-	tm ct = { 0, 0, 5, 27, 5, 2030 - 1900, 0, 0, 0 };
+	tm ct = { 0, 0, 10, 27, 5, 2030 - 1900, 0, 0, 0 };
 	Core_TimeUnixStartSet(idTimerGame, mktime(&ct));
 
 	Core_TimeWorkingSet(idTimerRender, true);
@@ -771,14 +771,19 @@ void SkyXEngine_Frame(DWORD timeDelta)
 		ttime = TimeGetMcsU(Core_RIntGet(G_RI_INT_TIMER_RENDER));
 		SRender_ComLighting(timeDelta);
 		SRender_UnionLayers();
+
 		if (SGCore_SkyBoxIsCr())
 			SRender_RenderSky(timeDelta);
-		SRender_ApplyToneMapping();
+
 		SRender_ComToneMapping(timeDelta);
 
 		DelayComLighting += TimeGetMcsU(Core_RIntGet(G_RI_INT_TIMER_RENDER)) - ttime;
 	}
 
+	SGCore_ShaderUnBind();
+
+	SRender_RenderParticles(timeDelta);
+
 	pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
 	pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE);
 	pDXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);