From 6becfaea950146a713af275fa0ceaa42ef845860 Mon Sep 17 00:00:00 2001 From: dexy Date: Thu, 12 Dec 2019 22:21:18 +1100 Subject: [PATCH] Fixed capsule lights rendering --- CodeWalker.Shaders/LightPS.hlsli | 45 ++++++++++++++++++++++++++++--- CodeWalker.Shaders/LightVS.hlsl | 2 +- Rendering/Renderable.cs | 2 +- Shaders/LightPS.cso | Bin 5176 -> 6044 bytes Shaders/LightPS_MS.cso | Bin 26528 -> 33452 bytes Shaders/LightVS.cso | Bin 2408 -> 2364 bytes Shaders/LodLightsPS.cso | Bin 5208 -> 6032 bytes Shaders/LodLightsPS_MS.cso | Bin 27824 -> 34416 bytes 8 files changed, 44 insertions(+), 5 deletions(-) diff --git a/CodeWalker.Shaders/LightPS.hlsli b/CodeWalker.Shaders/LightPS.hlsli index 6866d9a..acafeec 100644 --- a/CodeWalker.Shaders/LightPS.hlsli +++ b/CodeWalker.Shaders/LightPS.hlsli @@ -68,6 +68,30 @@ float3 GetReflectedDir(float3 camRel, float3 norm) return refl; } +float4 GetLineSegmentNearestPoint(float3 v, float3 a, float3 b) +{ + float3 ab = b - a; + float3 av = v - a; + if (dot(av, ab) <= 0.0f)// Point is lagging behind start of the segment, so perpendicular distance is not viable. + { + return float4(av, length(av)); + } + else + { + float3 bv = v - b; + if (dot(bv, ab) >= 0.0f)// Point is advanced past the end of the segment, so perpendicular distance is not viable. + { + return float4(bv, length(bv)); + } + else + { + float3 abv = cross(ab, av); + float d = length(abv) / length(ab); + return float4(normalize(cross(abv, ab)) * d, d); //improve this! + } + } +} + float3 DeferredDirectionalLight(float3 camRel, float3 norm, float4 diffuse, float4 specular, float4 irradiance) { @@ -87,7 +111,15 @@ float4 DeferredLODLight(float3 camRel, float3 norm, float4 diffuse, float4 specu LODLight lodlight = LODLights[iid]; float3 srpos = lodlight.Position - (camRel + CameraPos.xyz); //light position relative to surface position float ldist = length(srpos); - if (ldist > lodlight.Falloff) return 0; //out of range of the light... TODO: capsules! + if (LightType == 4)//capsule + { + float3 ext = lodlight.Direction.xyz * lodlight.OuterAngleOrCapExt; + float4 lsn = GetLineSegmentNearestPoint(srpos, ext, -ext); + ldist = lsn.w; + srpos.xyz = lsn.xyz; + } + + if (ldist > lodlight.Falloff) return 0; //out of range of the light... if (ldist <= 0) return 0; float4 rgbi = Unpack4x8UNF(lodlight.Colour).gbar; @@ -132,7 +164,14 @@ float4 DeferredLight(float3 camRel, float3 norm, float4 diffuse, float4 specular { float3 srpos = InstPosition - camRel; //light position relative to surface position float ldist = length(srpos); - if (ldist > InstFalloff) return 0; //out of range of the light... TODO: capsules! + if (InstType == 4)//capsule + { + float3 ext = InstDirection.xyz * (InstCapsuleExtent.y * 0.5); + float4 lsn = GetLineSegmentNearestPoint(srpos, ext, -ext); + ldist = lsn.w; + srpos.xyz = lsn.xyz; + } + if (ldist > InstFalloff) return 0; if (ldist <= 0) return 0; float d = dot(srpos, InstCullingPlaneNormal) - InstCullingPlaneOffset; @@ -159,7 +198,7 @@ float4 DeferredLight(float3 camRel, float3 norm, float4 diffuse, float4 specular } else if (InstType == 4)//capsule { - lamt *= pow(saturate(1 - (ldist / InstFalloff)), InstFalloffExponent); //TODO! proper capsule lighting... (use point-line dist!) + lamt *= pow(saturate(1 - (ldist / InstFalloff)), InstFalloffExponent); } pclit *= lamt; diff --git a/CodeWalker.Shaders/LightVS.hlsl b/CodeWalker.Shaders/LightVS.hlsl index 221933d..5949730 100644 --- a/CodeWalker.Shaders/LightVS.hlsl +++ b/CodeWalker.Shaders/LightVS.hlsl @@ -56,7 +56,7 @@ VS_Output main(float4 ipos : POSITION, uint iid : SV_InstanceID) else if (InstType == 4)//capsule { float3 cpos = ipos.xyz * extent; - cpos += InstCapsuleExtent * (ipos.w * 2 - 1) * 0.1; + cpos.y += abs(InstCapsuleExtent.y) * (ipos.w - 0.5); opos = (cpos.x * InstTangentX.xyz) + (cpos.y * InstDirection.xyz) + (cpos.z * InstTangentY.xyz); } diff --git a/Rendering/Renderable.cs b/Rendering/Renderable.cs index e3e31b9..643bb5a 100644 --- a/Rendering/Renderable.cs +++ b/Rendering/Renderable.cs @@ -1503,7 +1503,7 @@ namespace CodeWalker.Rendering spots.Add(light); break; case LightType.Capsule: - light.OuterAngleOrCapExt = ll.coneOuterAngleOrCapExt[i] * 0.1f;//is this right? + light.OuterAngleOrCapExt = ll.coneOuterAngleOrCapExt[i] * 0.25f; caps.Add(light); break; default: break;//just checking... diff --git a/Shaders/LightPS.cso b/Shaders/LightPS.cso index a03653ddca86b1b3f647298e50382294e77658c9..a86bfd272cf5048f395cd2976186e7a9230ee075 100644 GIT binary patch delta 2079 zcmah~J8KkC6uz^M%+6+K_GKJQh}jrK35ps-MbT{5u!SO4#s^wh2DH#x*d&z}zBr%= zu@eg$BNo~S+Nr%iAOW?q&?1$B-*@Mpak2_7%$~dF@tyBH=I-mA%X_9~&vlOHubjw# zdE6Pc@ghUdczEh`D?wE+rw2=)f-d7Ov)>`+b9zUJ%$DsLq? z#Du-9_NRV=lWW6ZOpjl0^_ene@HzmPw7b+=n1Lh!9|i8_YR1FwnlU~}k?4a$67#@; zk7jHvf}gVUW!yG*?&f+f89)*)8B?2J=C?TGe5ZdXpoveH=O27t!gfz*jZ5=u$nsdd$*LIX~+Pxlj#j><*MElgp z7O9OOS_uhFIa}As2!z-*`m;JplBFbBcCVDdAQtn0Y%g65vZYcN1Ql7f49s>&iKv_f zA(CZme}`=Ku0wOh#77B{+0UKR&quOZi}v8)W1LVB?njJ4E|N72?}HVIWQ*`e^9fG$k$ z!2p=Z*{wvA|HOz_jfeU@4sdL8suFu0oA^eh6izx6merB_m9bH76>(u%cn6uyds0@T zX2^vnHm5Kt-zsBu{lzj8?PwUE`b!JM#SG$;@B{C$^lIP`v?8J)Pmr#eEQTZFoeZ}b zholu?e11n(!)8xo)mvF9zD95xv|3#TSGnbJ#H~4X8jE9~xQc_=^xDL>$?2$Qr&E;k z(Zo!@x3V!Ubo?Ln=#1?uu%Gfc8t&N9vM_|FH;TIIIyk!>fv!WUlke5$nf{Tm{TUJ) z+Rqn?{@L=iWX;^bPDZj?9g&sDm*>^_?b!(X=LQ6fCSBcR36Iux1Zb6gI|_2OHnC+1 ze$?>4hH)xq#j9-IX797Cnr}GWc}>|+S*^uG3c_j8YNdqrIDo%xTV8h8zslZ5!7IqG pdW_Rbk=Il~>djbwHs06oATGee4>2ywr{;8#w~;5~n-H<7^czNav^M|% delta 1202 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 literal 26528 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 B=XwAD diff --git a/Shaders/LightVS.cso b/Shaders/LightVS.cso index 379b340320d0fbda354834f9830553235f705147..37e2164bdb69dc77d8a90438ac01a4cdfdcb9c03 100644 GIT binary patch delta 288 zcmaDMv`5I$CBn%$n)}7hxW!+89N6$Cdc}WVO-2R=1{+QW238<#0>m*a3=CU12;@gszITl5hx6D4#+81P(4yW z8YDJ(51Wi8$QGa`E@T@)l5R~3U`0TOGPp4TT{Ah5U04WN2IwK6%;qxoIz~ZhAREL7 M0gw)%$*i2o0E|&8_5c6? delta 315 zcmdlZ^g_tcCBn&ho{CWLndC;v!)FWXHpN#6FfuSOWNSVAul0JV1dr z8x8NXaNb~MU~phyWcW5&l6BMM=d6m1N|QO+l$h9qCZA=M<|<+kU|<4j3}c=Aj!kT` z4;u#)8^h!)#PkWe!ntg}_j-nRUFr$eOB32L-w5VMXeYt2CZVLTi8et&yUy>vd&cWP(7>B>=bqpFo!>d4O9P{m=O#{E zS-f!eLX$;X@r1 z!S`BDS*H#9j2SQ=WRWHi2*k7y36Nq9JTN54h43`3Ta(%;CX5b14TEhlSTiY$f|xRq zyM~<4!Lk^vJ%iy2Gu}>OC^V&m^Psye#$>2V2_IL0No>nOu?Mk?he(h1kTC~^1)hB& zR05PY<;R*y*vA=UTF4NHdkF|!c}H*$)cy6j|eh(WlyAj0eb!-UwkFD-;8l=S=@*arDJ zt3Ph1jH^MfQ&qgIOsT3@lc}{k-n5i4wV8qQYo<$m$?xgL(24G7JV8Q@XbuyupXw`A zdI0J$m)?N%M2(ugqB=S&@JH3w(@R9z;2HCjk$@w96b{h|R zJYk{cfuaYJD%YR9g*~+Ean;84{{w$_`273-z=dKZw^>7xoKi-%D&M)#VA>rR>19GBla9b7&ViBiWvQVcv#zO_a6y%d{uz?;B3;88MJ-b0n5{6s#A(Wik0N1o(C%_q0BBOBP)`WB?N#-R$>Q7P3XHxm{W(ke*& z+${%^M*7kPNR;mGIoJ+*_SjB)FbiloIj*T6c$q? zUHvER2;a(9jsT@9?Ry)co0;%%*pIbj={=n$zs`=E07|@*^?5CyJg&9kTtJRR{nLYn z9%)QpdtN4>D)QTWG3&>{;tn=<%e@vNxW gD_)azb-?E<121wnB|Z_bC^-5l9`&0Nd)2S~0kFk=y#N3J diff --git a/Shaders/LodLightsPS_MS.cso b/Shaders/LodLightsPS_MS.cso index 8c66a647504728950e789cc8eb74cbae99b0212c..2145a6f5be6a8e30d4562d8c0dde8804bf88a1e0 100644 GIT binary patch literal 34416 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 literal 27824 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