From e7c557c9650e86d6f6b443f756bab91a2319a5d9 Mon Sep 17 00:00:00 2001
From: D-AIRY <admin@ds-servers.com>
Date: Sat, 18 Apr 2020 11:58:52 +0300
Subject: [PATCH] Glass lighting (rough)

---
 build/engine/shaders/base/anim.vs             |  8 ++--
 build/engine/shaders/base/post.vs             | 22 +++++------
 build/engine/shaders/base/static.vs           |  5 +--
 build/engine/shaders/const.h                  |  1 +
 build/engine/shaders/lighting/lighting_gi.ps  | 28 +------------
 build/engine/shaders/lpv.h                    | 39 ++++++++++++++++++-
 build/engine/shaders/material/shadow.ps       |  4 +-
 build/engine/shaders/material/transparent.ps  |  7 +++-
 .../engine/shaders/ppgensm/ppgensm_direct.ps  |  6 +--
 build/engine/shaders/ppgensm/ppgensm_point.ps |  4 +-
 build/engine/shaders/ppgensm/ppgensm_pssm.ps  |  4 +-
 build/engine/shaders/skin.h                   |  4 +-
 build/engine/shaders/struct.h                 |  2 +-
 build/gamesource/shaders/ps.h                 |  6 +--
 source/mtrl/IXMaterialSystem.h                |  3 ++
 source/mtrl/MaterialSystem.cpp                | 18 ++++++++-
 source/render/RenderPipeline.cpp              | 29 ++++++++++++--
 source/render/RenderPipeline.h                |  1 +
 source/render/gdata.cpp                       |  8 ++--
 source/render/gdata.h                         |  4 +-
 20 files changed, 129 insertions(+), 74 deletions(-)

diff --git a/build/engine/shaders/base/anim.vs b/build/engine/shaders/base/anim.vs
index ee1291326..84bdfb739 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 e3d144992..90f919094 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 a63faf026..a0f50c618 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 69517b3f7..3a6ddad89 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 f3a31a5a4..c59b1377a 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 77b0fc0b9..42374e118 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 63221c2ea..981235c2f 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 8e12119cf..3a99e54a4 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 6fad7bbcf..f0d45a212 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 c8ada90ef..2c7f60c96 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 1bea42987..f6d5ad9de 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 9bf861c9c..47f149a6d 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 a72254e40..1fd16acee 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 9115419f9..e01e5192b 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 130d707c2..423fc0040 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 88a866c9e..b81431c1a 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 5710b833c..8bc757f6c 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 b89e14ada..e1a9bfee6 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 5664cb63e..49c96747a 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 b50affafc..3f769a105 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;
-- 
GitLab