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", ¶m); + SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, PPSet::IDsShaders::PS::CBG, "g_vParam", ¶m); 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);