diff --git a/build/engine/shaders/base/anim.vs b/build/engine/shaders/base/anim.vs
index ee12913261508a2666c6ed966f0d570d9276377b..84bdfb739d7effdf3d6ebe7b6438ac90824a64d2 100644
--- a/build/engine/shaders/base/anim.vs
+++ b/build/engine/shaders/base/anim.vs
@@ -4,9 +4,9 @@ mtrlskin_base.vs
 Базовый рендер анимационных моделей
 */
 
-#include "../struct.h"
-#include "../skin.h"
-#include "../const.h"
+#include <struct.h>
+#include <skin.h>
+#include <const.h>
 
 //##########################################################################
 
@@ -18,7 +18,7 @@ VSO_SceneCommon main(VSI_Animation IN)
 	// OUT.vPosition = mul(OUT.vPosition, g_mWVP);
 	OUT.vPosition = mul(OUT.vPosition, g_mW);
 	OUT.vPosition = mul(OUT.vPosition, g_mVP);
-	OUT.vNormal = mul(OUT.vNormal, g_mW);
+	OUT.vNormal = mul(float4(OUT.vNormal, 1.0f), g_mW).xyz;
 	OUT.vTexUV = IN.vTexUV;
 	
 	OUT.vPos = OUT.vPosition;
diff --git a/build/engine/shaders/base/post.vs b/build/engine/shaders/base/post.vs
index e3d1449920137cdf804778a3fc391a8f53c6c4d6..90f919094872022c0b9cdeff88895d781d11308f 100644
--- a/build/engine/shaders/base/post.vs
+++ b/build/engine/shaders/base/post.vs
@@ -4,16 +4,16 @@ pp_res_pos.vs
 Восстановление позиции по глубине
 */
 
-#include "../struct.h"
+#include <struct.h>
 
 //##########################################################################
 
 cbuffer perFrame: register(b1)
 {
-	half4x4 g_mVP;
-	half4x4 g_mViewInv;
-	half4 g_vNearFar;
-	half3 g_vParamProj;
+	float4x4 g_mVP;
+	float4x4 g_mViewInv;
+	float4 g_vNearFar;
+	float3 g_vParamProj;
 };
 
 //##########################################################################
@@ -21,15 +21,15 @@ cbuffer perFrame: register(b1)
 VSO_ResPos main(VSI_PP IN)
 {
 	VSO_ResPos OUT;
-	OUT.vPosition = half4(IN.vPosition, 1.0);
+	OUT.vPosition = float4(IN.vPosition, 1.0);
 	OUT.vTexUV = IN.vTexUV.xy;
 	
-	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; 
+	float fTanHalfFOV = tan(g_vParamProj.z * 0.5) ; 
+	float aspectRatio = g_vParamProj.x / g_vParamProj.y; 
+	float fFarY = fTanHalfFOV * g_vNearFar.y; 
+	float fFarX = fFarY * aspectRatio; 
 	
-	OUT.vEyeRay = half3(sign(OUT.vPosition.x) * fFarX, sign(OUT.vPosition.y) * fFarY, g_vNearFar.y); 
+	OUT.vEyeRay = float3(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;
diff --git a/build/engine/shaders/base/static.vs b/build/engine/shaders/base/static.vs
index a63faf0261a0aaba803ebfd71b53049c3690240f..a0f50c618ad6750a1e939aa33fd984c4d032b730 100644
--- a/build/engine/shaders/base/static.vs
+++ b/build/engine/shaders/base/static.vs
@@ -13,10 +13,9 @@ VSO_SceneCommon main(VSI_Geometry IN)
 {
 	VSO_SceneCommon OUT = (VSO_SceneCommon)0;
 
-	// OUT.vPosition = mul(half4(IN.vPosition, 1.f), g_mWVP);
-	OUT.vPosition = mul(float4(IN.vPosition, 1.f), g_mW);
+	OUT.vPosition = mul(float4(IN.vPosition, 1.0f), g_mW);
 	OUT.vPosition = mul(OUT.vPosition, g_mVP);
-	OUT.vNormal = mul(IN.vNormal, g_mW);
+	OUT.vNormal = mul(float4(IN.vNormal, 1.0f), g_mW).xyz;
 	OUT.vTexUV = IN.vTexUV;
 	OUT.vPos = OUT.vPosition;
 
diff --git a/build/engine/shaders/const.h b/build/engine/shaders/const.h
index 69517b3f75df996c424f9951acd249ee9a87aae0..3a6ddad89181b51ef070c129f86ec9b0e594dc7c 100644
--- a/build/engine/shaders/const.h
+++ b/build/engine/shaders/const.h
@@ -21,6 +21,7 @@ cbuffer CDataCamera: register(b2)
 	// float4x4 mV;
 	float4x4 g_mVP;
 	float4 g_vPosCam;
+	float4x4 g_mInvVP;
 };
 cbuffer CDataObject: register(b1)
 {
diff --git a/build/engine/shaders/lighting/lighting_gi.ps b/build/engine/shaders/lighting/lighting_gi.ps
index f3a31a5a46566a631afdf6a6510fc6382b8518ea..c59b1377a12ab11976fd2a8ef97d631ba3611e2c 100644
--- a/build/engine/shaders/lighting/lighting_gi.ps
+++ b/build/engine/shaders/lighting/lighting_gi.ps
@@ -18,13 +18,9 @@ cbuffer perFrame: register(b1)
 //##########################################################################
 
 SamplerState g_sPointClamp: register(s0);
-SamplerState g_sLinearClamp: register(s1);
 
 Texture2D g_txDepth:register(t0);
 Texture2D g_txNormals:register(t1);
-Texture3D g_txLightVolumeRed[3]:register(t2);
-Texture3D g_txLightVolumeGreen[3]:register(t5);
-Texture3D g_txLightVolumeBlue[3]:register(t8);
 
 //#############################################################################
 
@@ -40,29 +36,7 @@ PSO_Lbuffer main(VSO_ResPos IN)
 	
 	float3 vNormalPixel = normalize(NormalDecode(vNormals.xyz).xyz);
 	
-	
-	// float3 vNormalPixel = normalize(IN.vNormal);
-	float4 SHintensity = dirToSH(-vNormalPixel);
-	
-	float r = 0.0f;
-	float g = 0.0f;
-	float b = 0.0f;
-
-	for(uint i = 0; i < 3; ++i)
-	{
-		float3 vTexCoord = GetGridTexCoord(vPosition.xyz, i);
-		float4 vColorR = g_txLightVolumeRed[i].Sample(g_sLinearClamp, vTexCoord);
-		float4 vColorG = g_txLightVolumeGreen[i].Sample(g_sLinearClamp, vTexCoord);
-		float4 vColorB = g_txLightVolumeBlue[i].Sample(g_sLinearClamp, vTexCoord);
-		
-		r += saturate(dot(SHintensity, vColorR));
-		g += saturate(dot(SHintensity, vColorG));
-		b += saturate(dot(SHintensity, vColorB));
-	}
-	
-	
-	
-	OUT.vAmdient.xyz = float3(r, g, b) / PI/*  * 6.0f */;
+	OUT.vAmdient.xyz = GetPixelLight(vPosition.xyz, vNormalPixel);
 	OUT.vAmdient.w = 1;
 	OUT.vSpecular = 0;
 	
diff --git a/build/engine/shaders/lpv.h b/build/engine/shaders/lpv.h
index 77b0fc0b9559c5088b97bfa88b0407f52431f542..42374e118f4a6e9b6797d918296bf58edb6369ab 100644
--- a/build/engine/shaders/lpv.h
+++ b/build/engine/shaders/lpv.h
@@ -7,7 +7,7 @@
 // #define LPV_MAP_SIZE 32
 #define KERNEL_SIZE (LPV_MAP_SIZE / LPV_POINT_COUNT)
 #ifdef IS_SUN
-#define LPV_POINT_WEIGHT (256.0f * 256.0f * 64.0f / (float)(LPV_POINT_COUNT * LPV_POINT_COUNT))
+#define LPV_POINT_WEIGHT (256.0f * 256.0f * 10.0f / (float)(LPV_POINT_COUNT * LPV_POINT_COUNT))
 #else
 #define LPV_POINT_WEIGHT (256.0f * 256.0f / (float)(LPV_POINT_COUNT * LPV_POINT_COUNT))
 #endif
@@ -41,6 +41,14 @@ cbuffer b10: register(b10)
 #define POSWS_BIAS_NORMAL 0.2
 #define POSWS_BIAS_LIGHT 1.0
 
+
+#ifndef NO_LPV_TEXTURES
+Texture3D g_txLightVolumeRed[3]:register(t2);
+Texture3D g_txLightVolumeGreen[3]:register(t5);
+Texture3D g_txLightVolumeBlue[3]:register(t8);
+SamplerState g_sLinearClamp: register(s1);
+#endif
+
 float4 dirToSH(float3 dir)
 {
 	return float4(SH_C0, -SH_C1 * dir.y, SH_C1 * dir.z, -SH_C1 * dir.x);
@@ -72,3 +80,32 @@ float3 GetGridTexCoord(float3 worldPos, uint uCascade)
 {
 	return((worldPos - GetGridCenter(uCascade)) / (GetGridWorldSize(uCascade) * LPV_DIM) + 0.5f + 1.0f / (LPV_DIM * 2.0f));
 }
+
+float3 GetPixelLight(float3 vPosition, float3 vNormalPixel)
+{
+	// float3 vNormalPixel = normalize(IN.vNormal);
+	float4 SHintensity = dirToSH(-vNormalPixel);
+	
+
+	float4 vColorR = (float4)0;
+    float4 vColorG = (float4)0;
+    float4 vColorB = (float4)0;
+	[unroll]for(uint i = 0; i < 3; ++i)
+	{
+		float3 vTexCoord = GetGridTexCoord(vPosition, i);
+		vColorR += g_txLightVolumeRed[i].Sample(g_sLinearClamp, vTexCoord);
+		vColorG += g_txLightVolumeGreen[i].Sample(g_sLinearClamp, vTexCoord);
+		vColorB += g_txLightVolumeBlue[i].Sample(g_sLinearClamp, vTexCoord);
+	}
+	
+	float r = max(0.0f, dot(SHintensity, vColorR));
+	float g = max(0.0f, dot(SHintensity, vColorG));
+	float b = max(0.0f, dot(SHintensity, vColorB));
+	
+	return(float3(r, g, b) / PI/*  * 6.0f */);
+}
+
+
+
+
+
diff --git a/build/engine/shaders/material/shadow.ps b/build/engine/shaders/material/shadow.ps
index 63221c2ea0ac1c690442883b0e033c6a62e8533b..981235c2f42eb50de639642c97f34d51b56d8e40 100644
--- a/build/engine/shaders/material/shadow.ps
+++ b/build/engine/shaders/material/shadow.ps
@@ -6,7 +6,7 @@ gbuffer.ps
 
 #include <struct.h>
 #include <mtrl.h>
-#include <shadow.h>
+// #include <shadow.h>
 #include <const.h>
 #include <xmat.h>
 
@@ -25,7 +25,7 @@ PSO_RSMbuffer main(PSI_XMaterial IN)
 	// OUT.vDepth = 4.0;
 #else
 	float fDepth = IN.vPos.z / IN.vPos.w;
-	float fBias = ShadowSlopeBias(fDepth);
+	// float fBias = ShadowSlopeBias(fDepth);
 	OUT.vDepth = fDepth/*  + fBias */;
 #endif
 	
diff --git a/build/engine/shaders/material/transparent.ps b/build/engine/shaders/material/transparent.ps
index 8e12119cfa0d4242284b4e27eea8c10d78ea0a2f..3a99e54a4753aecba415c2d1b5d76ff5b078212e 100644
--- a/build/engine/shaders/material/transparent.ps
+++ b/build/engine/shaders/material/transparent.ps
@@ -9,6 +9,9 @@ gbuffer.ps
 #include <const.h>
 #include <xmat.h>
 
+#define NO_LPV_TEXTURES
+#include <lpv.h>
+
 //##########################################################################
 
 cbuffer CDataClipPlanes: register(b6)
@@ -34,5 +37,7 @@ float4 main(PSI_XMaterial IN):COLOR0
 	
 	XMaterial mtrl = XMATERIAL_MAIN(IN);
 	
-	return(mtrl.vBaseColor);
+	float4 fWorldPos = mul(IN.vPos, g_mInvVP);
+	
+	return(mtrl.vBaseColor * float4(GetPixelLight(fWorldPos.xyz / fWorldPos.w, mtrl.vNormal), 1.0f));
 }
diff --git a/build/engine/shaders/ppgensm/ppgensm_direct.ps b/build/engine/shaders/ppgensm/ppgensm_direct.ps
index 6fad7bbcf92de69a0241f840acbfbde16ad8eb8c..f0d45a2121aaa6212a2a06091973ec870f471428 100644
--- a/build/engine/shaders/ppgensm/ppgensm_direct.ps
+++ b/build/engine/shaders/ppgensm/ppgensm_direct.ps
@@ -5,9 +5,9 @@ ppgensm_direct.ps
 */
 
 #include <struct.h>
-#include <shadow.h>
+// #include <shadow.h>
 #include <mtrl.h>
-#include <ps.h>
+// #include <ps.h>
 
 //##########################################################################
 
@@ -56,7 +56,7 @@ Texture2D g_txDepthShadow: register(t4);
 float4 main(VSO_ResPos IN):COLOR0
 {
 	float fShadow = 0.0f;
-	half3 vNormal = normalize(NormalDecode(g_txNormals.Sample(g_sPointClamp, IN.vTexUV).xyz).xyz);
+	float3 vNormal = normalize(NormalDecode(g_txNormals.Sample(g_sPointClamp, IN.vTexUV).xyz).xyz);
 	//g_txDepthView.Sample(g_sPointClamp, IN.vTexUV)
 	//g_txDepthShadow.Sample(g_sLinearClamp, IN.vTexUV)
 	
diff --git a/build/engine/shaders/ppgensm/ppgensm_point.ps b/build/engine/shaders/ppgensm/ppgensm_point.ps
index c8ada90efd0229bda6a13235bb2c7cfdb0a432a4..2c7f60c96400524426649c987f927da4f3ca66b0 100644
--- a/build/engine/shaders/ppgensm/ppgensm_point.ps
+++ b/build/engine/shaders/ppgensm/ppgensm_point.ps
@@ -5,9 +5,9 @@ ppgensm_point.ps
 */
 
 #include <struct.h>
-#include <shadow.h>
+// #include <shadow.h>
 #include <mtrl.h>
-#include <ps.h>
+// #include <ps.h>
 
 //##########################################################################
 
diff --git a/build/engine/shaders/ppgensm/ppgensm_pssm.ps b/build/engine/shaders/ppgensm/ppgensm_pssm.ps
index 1bea42987e3f28e1b5f2155f9a9608e39d15e059..f6d5ad9de456f95706cc145e874eab8e599117b1 100644
--- a/build/engine/shaders/ppgensm/ppgensm_pssm.ps
+++ b/build/engine/shaders/ppgensm/ppgensm_pssm.ps
@@ -5,9 +5,9 @@ ppgensm_pssm.ps
 */
 
 #include <struct.h>
-#include <shadow.h>
+// #include <shadow.h>
 #include <mtrl.h>
-#include <ps.h>
+// #include <ps.h>
 
 //##########################################################################
 
diff --git a/build/engine/shaders/skin.h b/build/engine/shaders/skin.h
index 9bf861c9cde810b193ed14a97bacf2860e9862e8..47f149a6d021a347650b08f772dfc64cb3bea592 100644
--- a/build/engine/shaders/skin.h
+++ b/build/engine/shaders/skin.h
@@ -31,7 +31,7 @@ VSO_SceneCommon SkinBoneTransform(uint iBone, float weight, VSI_Animation v)
 	iBone *= 2;
 	float4 bpos = g_BufferBoneWorld[iBone];
 	float4 q = g_BufferBoneWorld[iBone + 1];
-	Output.vPosition = float4((SkinRotateVec(q, v.vPosition) + bpos) * weight, 1.0);
+	Output.vPosition = float4((SkinRotateVec(q, v.vPosition) + bpos.xyz) * weight, 1.0);
 	Output.vNormal = SkinRotateVec(q, v.vNormal) * weight;
 
 	return(Output);
@@ -74,4 +74,4 @@ VSO_SceneCommon SkinAllTransform(VSI_Animation v)
 	Output.vPosition.w = 1.0;
 	
 	return(Output);
-}
\ No newline at end of file
+}
diff --git a/build/engine/shaders/struct.h b/build/engine/shaders/struct.h
index a72254e4058a5af325e2eb31bf56b811f3245576..1fd16aceeb265abb259099c53b690581e5e9d89b 100644
--- a/build/engine/shaders/struct.h
+++ b/build/engine/shaders/struct.h
@@ -9,7 +9,7 @@ struct.h
 #define __STRUCT_H
 
 
-#include "gdefines.h"
+#include <gdefines.h>
 
 /* \name ПОСТПРОЦЕСС
 @{*/
diff --git a/build/gamesource/shaders/ps.h b/build/gamesource/shaders/ps.h
index 9115419f9c04168d814cbdeb954cc5b22596c07f..e01e5192b99f0d41b77354d71b9739c11dfdb2b2 100644
--- a/build/gamesource/shaders/ps.h
+++ b/build/gamesource/shaders/ps.h
@@ -1,6 +1,6 @@
 
 //! обертка tex2Dlod
-half4 tex2Dlod2(sampler2D oSampler, half2 vTexUV, int iLod)
+float4 tex2Dlod2(sampler2D oSampler, float2 vTexUV, int iLod)
 {
-	return tex2Dlod(oSampler, half4(vTexUV,0.f,iLod));
-}
\ No newline at end of file
+	return tex2Dlod(oSampler, float4(vTexUV,0.f,iLod));
+}
diff --git a/source/mtrl/IXMaterialSystem.h b/source/mtrl/IXMaterialSystem.h
index 130d707c2bfb55d1c963d4ca757d9d550bfc45e9..423fc0040122011af18ab58fe2a184a308e62e9e 100644
--- a/source/mtrl/IXMaterialSystem.h
+++ b/source/mtrl/IXMaterialSystem.h
@@ -33,6 +33,9 @@ struct XRenderPassTexturesElement
 
 	//! Слот в шейдере
 	UINT uSlot;
+
+	//! Тип текстуры
+	GXTEXTURE_TYPE type;
 };
 #define XRENDER_PASS_TEXTURES_LIST_END() {NULL,NULL,~0u}
 
diff --git a/source/mtrl/MaterialSystem.cpp b/source/mtrl/MaterialSystem.cpp
index 88a866c9eea247ecc0f21070e699d72f3f17cfb1..b81431c1afc9d210521a701f1d5dc4c3d26304a6 100644
--- a/source/mtrl/MaterialSystem.cpp
+++ b/source/mtrl/MaterialSystem.cpp
@@ -981,6 +981,20 @@ static void GetAllDefines(Array<CMaterialSystem::MaterialDefine> &aAllDefines, A
 	}
 }
 
+static const char* GetTextureTypeName(GXTEXTURE_TYPE type)
+{
+	switch(type)
+	{
+	case GXTEXTURE_TYPE_2D:
+		return("Texture2D");
+	case GXTEXTURE_TYPE_3D:
+		return("Texture3D");
+	case GXTEXTURE_TYPE_CUBE:
+		return("TextureCube");
+	}
+	return("<unknown>");
+}
+
 static bool EvalCondition(CLogicExpression *pExpr, Array<CMaterialSystem::MaterialDefine*> &aStaticList)
 {
 	if(!pExpr)
@@ -1320,7 +1334,7 @@ void CMaterialSystem::updateReferences()
 						Array<MaterialTexture> aTextureMap({0}, GX_MAX_TEXTURES);
 						for(UINT j = 0, jl = pMetaPass->aTextures.size(); j < jl; ++j)
 						{
-							aTextureMap[pMetaPass->aTextures[j].uSlot] = {pMetaPass->aTextures[j].szKey, GXTEXTURE_TYPE_2D};
+							aTextureMap[pMetaPass->aTextures[j].uSlot] = {pMetaPass->aTextures[j].szKey, pMetaPass->aTextures[j].type};
 						}
 
 						pPass->aVariants[s].aTextureMap = Array<MaterialTexture>({0}, GX_MAX_TEXTURES);
@@ -1342,7 +1356,7 @@ void CMaterialSystem::updateReferences()
 						{
 							if(aTextureMap[j].szName)
 							{
-								sTextures += (aTextureMap[j].type == GXTEXTURE_TYPE_2D ? String("Texture2D") : String("TextureCube")) + " g_" + aTextureMap[j].szName + ":register(t" + (int)j + ");";
+								sTextures += String(GetTextureTypeName(aTextureMap[j].type)) + " g_" + aTextureMap[j].szName + ":register(t" + (int)j + ");";
 							}
 						}
 						aVariantDefines.push_back({"XMAT_MS_TEXTURES()", strdupa(sTextures.c_str())});
diff --git a/source/render/RenderPipeline.cpp b/source/render/RenderPipeline.cpp
index 5710b833c8d1c1dcd3aee1b76867141289a289aa..8bc757f6c27adc96ea16a56b94b294231bbb544a 100644
--- a/source/render/RenderPipeline.cpp
+++ b/source/render/RenderPipeline.cpp
@@ -82,17 +82,28 @@ CRenderPipeline::CRenderPipeline(IGXDevice *pDevice):
 	{
 		XRenderPassTexturesElement pTextures[] = {
 			{"GBuffer color(rgb) light(a)", "txGBufferC3L1", 0},
-			{"GBuffer normals(rgb) f0(a)", "txGBufferN3F1", 1},
+			// {"GBuffer normals(rgb) f0(a)", "txGBufferN3F1", 1},
 			{"GBuffer depth(r)", "txGBufferD1", 2},
-			{"", "", 3}, // reserved slot
+			// {"", "3", 3}, // reserved slot
 			// {"GBuffer roughness(r) metallic(g) thickness(b) AO(a)", "g_txGBufferR1M1T1AO1", 3},
 			{"Lighted scene", "txScene", 4},
+
+			{"LPV Red cascades", "txLightVolumeRed[3]", 5, GXTEXTURE_TYPE_3D},
+			{"", "6", 6},
+			{"", "7", 7},
+			{"LPV Green cascades", "txLightVolumeGreen[3]", 8, GXTEXTURE_TYPE_3D},
+			{"", "9", 9},
+			{"", "10", 10},
+			{"LPV Red cascades", "txLightVolumeBlue[3]", 11, GXTEXTURE_TYPE_3D},
+			{"", "12", 12},
+			{"", "13", 13},
 			XRENDER_PASS_TEXTURES_LIST_END()
 		}; 
 		
 		XRenderPassSamplersElement pSamplers[] = {
 			{"Scene default", "sScene", 0},
 			{"Point clamp", "sPointClamp", 1},
+			{"Linear clamp", "sLinearClamp", 2},
 			XRENDER_PASS_SAMPLERS_LIST_END()
 		};
 
@@ -576,9 +587,11 @@ void CRenderPipeline::renderFrame()
 	pCtx->setPSConstant(m_pSceneShaderDataPS, SCR_SCENE);
 
 	m_cameraShaderData.vs.mVP = SMMatrixTranspose(gdata::mCamView * gdata::mCamProj);
+	m_cameraShaderData.vs.mInvVP = SMMatrixInverse(NULL, m_cameraShaderData.vs.mVP);
 	m_cameraShaderData.vs.vPosCam = gdata::vConstCurrCamPos;
 	m_pCameraShaderDataVS->update(&m_cameraShaderData.vs);
 	pCtx->setVSConstant(m_pCameraShaderDataVS, SCR_CAMERA);
+	pCtx->setPSConstant(m_pCameraShaderDataVS, SCR_CAMERA);
 
 	renderPrepare();
 
@@ -1341,11 +1354,19 @@ void CRenderPipeline::renderTransparent()
 	pCtx->setDepthStencilState(m_pDepthStencilStateNoZWrite);
 	pCtx->setBlendState(m_pBlendStateAlpha);
 	pCtx->setSamplerState(m_pRefractionScene, 1);
+	pCtx->setSamplerState(gdata::rstates::pSamplerLinearClamp, 2);
 	//m_pDevice->setTexture(m_pSceneTexture, 11);
 	pCtx->setPSTexture(m_pGBufferColor);
-	pCtx->setPSTexture(m_pGBufferNormals, 1);
+//	pCtx->setPSTexture(m_pGBufferNormals, 1);
 	pCtx->setPSTexture(m_pGBufferDepth, 2);
-	pCtx->setPSTexture(m_pGBufferParams, 3);
+//	pCtx->setPSTexture(m_pGBufferParams, 3);
+
+	for(UINT i = 0; i < 3; ++i)
+	{
+		pCtx->setPSTexture(m_aLPVs[i].pGIAccumRed, 5 + i);
+		pCtx->setPSTexture(m_aLPVs[i].pGIAccumGreen, 8 + i);
+		pCtx->setPSTexture(m_aLPVs[i].pGIAccumBlue, 11 + i);
+	}
 
 	m_iRefractiveSource = -1;
 	IGXSurface *pSceneTarget = m_pSceneTexture->asRenderTarget();
diff --git a/source/render/RenderPipeline.h b/source/render/RenderPipeline.h
index b89e14ada815116faed687843a72d9287fd78f00..e1a9bfee6146f6ea7db4b0033802a7c1730cc06e 100644
--- a/source/render/RenderPipeline.h
+++ b/source/render/RenderPipeline.h
@@ -127,6 +127,7 @@ protected:
 			//SMMATRIX mV;
 			SMMATRIX mVP;
 			float3 vPosCam;
+			SMMATRIX mInvVP;
 		} vs;
 		//float4 vNearFarLayers;
 	} m_cameraShaderData;
diff --git a/source/render/gdata.cpp b/source/render/gdata.cpp
index 5664cb63e51301e567cc9fe599d29bfa82d163ca..49c96747a8ab5994dd6d5578ff3fe76bc34148c9 100644
--- a/source/render/gdata.cpp
+++ b/source/render/gdata.cpp
@@ -72,7 +72,7 @@ namespace gdata
 			ID idStencilStr;
 			ID idStencilColumn;
 			ID idStencilStrColumn;
-			ID idUnionAlpha;
+			//ID idUnionAlpha;
 		};
 
 		namespace kit
@@ -82,7 +82,7 @@ namespace gdata
 			ID idStencilColumn;
 			ID idStencilStrColumn;
 			ID idBlendAmbientSpecDiffColor;
-			ID idUnionAlpha;
+			//ID idUnionAlpha;
 			ID idComLightingNonShadow;
 			ID idComLightingShadow;
 			ID idComLightingSpotNonShadow;
@@ -177,7 +177,7 @@ void gdata::shaders_id::InitAllShaders()
 	gdata::shaders_id::ps::idComLightingPSSMShadow = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "lighting_com.ps", "lighting_com_pssm_shadow.ps", Defines_IS_PSSM_SHADOWED);
 	gdata::shaders_id::ps::idBlendAmbientSpecDiffColor = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "lighting_blend.ps");
 
-	gdata::shaders_id::ps::idUnionAlpha = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pp_union_alpha.ps");
+	//gdata::shaders_id::ps::idUnionAlpha = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pp_union_alpha.ps");
 
 	GXMacro Defines_STR[] = { { "_STR_", "" }, { 0, 0 } };
 	gdata::shaders_id::ps::idStencilStr = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "pp_alpha_stencil_mark.ps", "pp_stencil_str.ps", Defines_STR);
@@ -191,7 +191,7 @@ void gdata::shaders_id::InitAllShaders()
 	gdata::shaders_id::kit::idStencilColumn = SGCore_ShaderCreateKit(gdata::shaders_id::vs::idScreenOut, gdata::shaders_id::ps::idStencilColumn);
 	gdata::shaders_id::kit::idStencilStrColumn = SGCore_ShaderCreateKit(gdata::shaders_id::vs::idScreenOut, gdata::shaders_id::ps::idStencilStrColumn);
 	gdata::shaders_id::kit::idBlendAmbientSpecDiffColor = SGCore_ShaderCreateKit(gdata::shaders_id::vs::idScreenOut, gdata::shaders_id::ps::idBlendAmbientSpecDiffColor);
-	gdata::shaders_id::kit::idUnionAlpha = SGCore_ShaderCreateKit(gdata::shaders_id::vs::idScreenOut, gdata::shaders_id::ps::idUnionAlpha);
+	//gdata::shaders_id::kit::idUnionAlpha = SGCore_ShaderCreateKit(gdata::shaders_id::vs::idScreenOut, gdata::shaders_id::ps::idUnionAlpha);
 	gdata::shaders_id::kit::idComLightingNonShadow = SGCore_ShaderCreateKit(gdata::shaders_id::vs::idResPos, gdata::shaders_id::ps::idComLightingNonShadow);
 	gdata::shaders_id::kit::idComLightingShadow = SGCore_ShaderCreateKit(gdata::shaders_id::vs::idResPos, gdata::shaders_id::ps::idComLightingShadow);
 	gdata::shaders_id::kit::idComLightingSpotNonShadow = SGCore_ShaderCreateKit(gdata::shaders_id::vs::idResPos, gdata::shaders_id::ps::idComLightingSpotNonShadow);
diff --git a/source/render/gdata.h b/source/render/gdata.h
index b50affafc65a90b9de7f39677f71ede0ee3fbe8c..3f769a1050ac7e5a17d9ee86e27c80284d336a3c 100644
--- a/source/render/gdata.h
+++ b/source/render/gdata.h
@@ -125,7 +125,7 @@ namespace gdata
 			extern ID idStencilStr;
 			extern ID idStencilColumn;
 			extern ID idStencilStrColumn;
-			extern ID idUnionAlpha;
+			//extern ID idUnionAlpha;
 		};
 
 		namespace kit
@@ -135,7 +135,7 @@ namespace gdata
 			extern ID idStencilColumn;
 			extern ID idStencilStrColumn;
 			extern ID idBlendAmbientSpecDiffColor;
-			extern ID idUnionAlpha;
+			//extern ID idUnionAlpha;
 			extern ID idComLightingNonShadow;
 			extern ID idComLightingSpotNonShadow;
 			extern ID idComLightingShadow;