From dead879d997ea1133ab051620e0a255c614b33d5 Mon Sep 17 00:00:00 2001 From: dexy Date: Wed, 27 Nov 2019 12:56:34 +1100 Subject: [PATCH] Weapon rendering improvements --- CodeWalker.Shaders/BasicPS.hlsl | 14 ++++++++++++-- CodeWalker.Shaders/ShadowPS.hlsl | 1 + Rendering/Shaders/BasicShader.cs | 14 ++++++++++++++ Rendering/Shaders/ShadowShader.cs | 8 +++++++- Shaders/BasicPS.cso | Bin 10732 -> 11048 bytes Shaders/ShadowPS.cso | Bin 1120 -> 1168 bytes 6 files changed, 34 insertions(+), 3 deletions(-) diff --git a/CodeWalker.Shaders/BasicPS.hlsl b/CodeWalker.Shaders/BasicPS.hlsl index ba3595c..51524c6 100644 --- a/CodeWalker.Shaders/BasicPS.hlsl +++ b/CodeWalker.Shaders/BasicPS.hlsl @@ -5,6 +5,7 @@ Texture2D Bumpmap : register(t2); Texture2D Specmap : register(t3); Texture2D Detailmap : register(t4); Texture2D Colourmap2 : register(t5); +Texture2D TintPalette : register(t6); SamplerState TextureSS : register(s0); @@ -19,7 +20,7 @@ cbuffer PSSceneVars : register(b0) cbuffer PSGeomVars : register(b2) { uint EnableTexture;//1+=diffuse1, 2+=diffuse2 - uint EnableTint; + uint EnableTint;//1=default, 2=weapons (use diffuse.a for tint lookup) uint EnableNormalMap; uint EnableSpecMap; uint EnableDetailMap; @@ -80,6 +81,15 @@ float4 main(VS_OUTPUT input) : SV_TARGET float4 c2 = Colourmap2.Sample(TextureSS, input.Texcoord1); c = c2.a * c2 + (1 - c2.a) * c; } + if (EnableTint == 2) + { + //weapon tint + float tx = (round(c.a * 255.009995) - 32.0) * 0.007813; //okay R* this is just silly + float ty = 0.03125 * 0.5;// //1;//what to use for Y value? cb12[2].w in R* shader + float4 c3 = TintPalette.Sample(TextureSS, float2(tx, ty)); + c.rgb *= c3.rgb; + c.a = 1; + } if (IsDistMap) c = float4(c.rgb*2, (c.r+c.g+c.b) - 1); if ((IsDecal == 0) && (c.a <= 0.33)) discard; @@ -93,7 +103,7 @@ float4 main(VS_OUTPUT input) : SV_TARGET } c.a = saturate(c.a*AlphaScale); } - if (EnableTint > 0) + if (EnableTint == 1) { c.rgb *= input.Tint.rgb; } diff --git a/CodeWalker.Shaders/ShadowPS.hlsl b/CodeWalker.Shaders/ShadowPS.hlsl index 705e6e1..da5639e 100644 --- a/CodeWalker.Shaders/ShadowPS.hlsl +++ b/CodeWalker.Shaders/ShadowPS.hlsl @@ -25,6 +25,7 @@ float4 main(VS_OUTPUT input) : SV_TARGET if (EnableTexture == 1) { float4 c = Colourmap.Sample(TextureSS, input.Texcoord); + if (EnableTint == 2) { c.a = 1; } if ((IsDecal == 0) && (c.a <= 0.33)) discard; if ((IsDecal == 1) && (c.a <= 0.0)) discard; } diff --git a/Rendering/Shaders/BasicShader.cs b/Rendering/Shaders/BasicShader.cs index 1e17935..3f81fb7 100644 --- a/Rendering/Shaders/BasicShader.cs +++ b/Rendering/Shaders/BasicShader.cs @@ -637,6 +637,7 @@ namespace CodeWalker.Rendering detltex = itex; break; case ShaderParamNames.TintPaletteSampler: + case ShaderParamNames.TextureSamplerDiffPal: tintpal = itex; if (tintpal.Key != null) { @@ -649,6 +650,7 @@ namespace CodeWalker.Rendering isdistmap = true; break; case ShaderParamNames.DiffuseSampler2: + case ShaderParamNames.DiffuseExtraSampler: texture2 = itex; break; case ShaderParamNames.heightSampler: @@ -710,6 +712,14 @@ namespace CodeWalker.Rendering case 1229591973://{trees_normal_spec_tnt.sps} if (usetint) tintflag = 2; //use 2nd vertex colour channel for tint... break; + case 3267631682: //weapon_normal_spec_detail_tnt.sps + case 14185869: //weapon_normal_spec_tnt.sps + break; //regular tinting? + case 231364109: //weapon_normal_spec_cutout_palette.sps + case 3294641629://weapon_normal_spec_detail_palette.sps + case 731050667: //weapon_normal_spec_palette.sps + if (usetint) { tintflag = 0; pstintflag = 2; } //use diffuse sampler alpha for tint lookup! + break; case 3880384844://{decal_spec_only.sps}w case 600733812://{decal_amb_only.sps} case 2842248626://{spec_decal.sps} @@ -799,6 +809,10 @@ namespace CodeWalker.Rendering { tintpal.SetVSResource(context, 0); } + if (pstintflag == 2) + { + tintpal.SetPSResource(context, 6); + } if (geom.BoneTransforms != null) diff --git a/Rendering/Shaders/ShadowShader.cs b/Rendering/Shaders/ShadowShader.cs index 2474b99..bdf57fc 100644 --- a/Rendering/Shaders/ShadowShader.cs +++ b/Rendering/Shaders/ShadowShader.cs @@ -323,6 +323,7 @@ namespace CodeWalker.Rendering uint windflag = 0; + uint tintflag = 0; var shaderFile = geom.DrawableGeom.Shader.FileName; switch (shaderFile.Hash) { @@ -335,13 +336,18 @@ namespace CodeWalker.Rendering case 4265705004://{trees_normal_diffspec.sps} windflag = 1; break; + case 231364109: //weapon_normal_spec_cutout_palette.sps + case 3294641629://weapon_normal_spec_detail_palette.sps + case 731050667: //weapon_normal_spec_palette.sps + tintflag = 2; //use diffuse sampler alpha for tint lookup! (ignore texture alpha in PS) + break; } GeomVars.Vars.EnableTexture = usediff ? 1u : 0u; - GeomVars.Vars.EnableTint = 0u;// usetint ? 1u : 0u; + GeomVars.Vars.EnableTint = tintflag;// usetint ? 1u : 0u; GeomVars.Vars.IsDecal = 0u;// DecalMode ? 1u : 0u; GeomVars.Vars.EnableWind = windflag; GeomVars.Vars.WindOverrideParams = geom.WindOverrideParams; diff --git a/Shaders/BasicPS.cso b/Shaders/BasicPS.cso index b2a88f6442acaa0bf6517d096362de587ef4ae7e..9a0122e4608fa0c3b274887eda7a0209910ff685 100644 GIT binary patch delta 1804 zcmZvdO-NKx6vxkfGtP%PI5^g58e@YCO&2Z3uuz!tqaYWPT1fOUhE|s8VABVrj<|AB z)Z@9xFo=i{6jG)|qCu347Saa@8AMdOz&4SKNU;Bzci%WY-+?>l+~2w9+;i@`Z{BL_ z)&^GNug-?ySvYzln?eJ%D#H>0V5cBF>KrE`C0%A%16A;T< zkqC${+CC8o{=i}+P3>-n-heoufyslhCXjYJ(kenxPw#Lr&r`Jf;!;jqcW*q>(bE-= zcWHK|JRy+B2X`m*d)`~h8e+J)3H%Hj5IPU*3ZTcFM6nEB#dScux}q96KMc(*EP1=+ z7oa0Vi7k$PIPPMxInhn0P3{Muw%|eVnG7DnoTUN!nVDmMItIscvjhAD_<{xR1%GM5hrkyt z_$c@r3$B5CmZXC#3?-}W*F~a$uM#AN!3P+^qh@K4k6b@FqBhApq2utIc^~)<3!VTU zu;7P!`p$OrG;5WPxyyVD%48iO=r9JqLlNjG2H%dDv`b-+NP7?LF=>ZkPf9xi`-QZl zu+cg$2EUOmTGoy_TN80NCJ=KMBjC);{5H7Df45!RavklmJz4E)bhL*&et_Wo2>ecc@; zQ6JV0_Ftgj!gZ6tF4lB~(lLnxH9MY$)vqJH>T zniMbk)eRC_U4C(LIBzA@5gw#osYqVUxA}K@(M^g0^LOG31`Z{~@Bt$aJ{x}F)MhJu Q?jYvdFkE28+SdyEKY?AVApigX delta 1593 zcmZvcK}Z!r7=UM2pRV}?%Sub-y+BG)qCiTk!%LqQAt)N=!N6xpLZUB<^dLPC(N&i{ zMC3ur!wWqaPa?y@phH3jFG5`+&_j?=hlo1a_iwXm>;CZX|IhdTGxN{v%%nRvItEJ9&EY)JUtLl-j6LDuk^?*Y_yZ7FOy$nuNE_l-$df4`(i1FB7h#1rMr-(6Y|A`p$&LJaWym9J{ zh`DUg?I7LERl~Vwlu8wAhV#m}>6|o=rB)fM2vlb(wIbtbS%yn$lFyh2v1{=C*#2B% zJGjdJ*C^C1tlMQ+VKL2XG(U%JQ!2G9&`e;0WdA^|@F^LD0;pB>=z)^LVICjTd_uS+ zN(`COd`>tEm8Qx3YDouHu+usq9X$RSp5E%P&A-8C1Nbla+zxKZHXvMUf z=5^RRFh6gEj|A`z_-FvXFfi1c7-(^>WXNN3#2@ zNCI+rEb6XNWu6yh6(0!^W0kHH@Et@;Q6_R9@G!4#aXBZ;71D`AP4UeWo&9HzIO-=utd7#SECCa^FtumWilAl?HM5Mg3q@Bm^F zmWf7>7@0PUGMY1T9sx=?02LHY4rN+Y&uzpY0OT+*OlwsD(;$M$0f>P#GB9Ug;1q(Y z<$}_T4j>f`_Eu27ECU0(6O!EFuPf}}YJqY}P&q9qEyW-Xv7DEIg;@$JsKCI$p)@&` nSzZ@r9mE<224tgPaxgKe$t#(i8Tlu_W%i$}!Xh#`fJFcR)8ipt delta 236 zcmbQh`GCX7CBn(sOD@*EqQvovlG2ukhq4{485tND5?B}*Sb?+&5bpsBh%hlQcmVMe z=7~m+7#TK;GMY1TP60|d02QQ84rN-z#33}fms#8w$Y+pcU|?5b5CAb57#$cG4u4%? zX9eQ}<%FPYDJabarFj`xm|<)M1_rQ+^18?-flS0}(&U@W&WwDMWm)_uN3aM?ZUEu{ G78U@zn;+5u