wip: Ray mapping

This commit is contained in:
Alexandre Coirier
2026-05-31 01:11:58 +02:00
parent aa82cacd5c
commit d63ef70e48
3 changed files with 752 additions and 68 deletions
@@ -1,16 +1,74 @@
void Facing_float(float3 ObjectPos, float3 Origin, float3 InUp, uint Orthographic, out float3 FacingWorldPos, out float3 FacingObjectPos, out float3 Right, out float3 Up, out float3 Forward)
#include "Assets/_Content/Shaders/Include/Noises.hlsl"
float2 WorldToScreenUV(float3 posWS)
{
float3 origin = TransformObjectToWorld(float3(0, 0, 0));
float3 view = lerp(normalize(origin - _WorldSpaceCameraPos.xyz), GetViewForwardDir(), Orthographic);
Up = normalize(InUp);
Right = normalize(cross(Up, view));
Forward = cross(Right, Up);
FacingWorldPos = Origin;
FacingWorldPos += ObjectPos.x * length(TransformObjectToWorld(float3(1, 0, 0)) - origin) * Right;
FacingWorldPos += ObjectPos.y * length(TransformObjectToWorld(float3(0, 1, 0)) - origin) * Up;
FacingWorldPos += ObjectPos.z * length(TransformObjectToWorld(float3(0, 0, 1)) - origin) * Forward;
FacingObjectPos = TransformWorldToObject(FacingWorldPos);
float4 clip = TransformWorldToHClip(posWS);
float2 ndc = clip.xy / clip.w; // [-1, 1]
return ndc * .5 + .5; // [0, 1]
}
float3 GetBillboardPositionWS(float3 PositionOS, float3 PivotWS, float3 ViewDirWS)
{
float3 upWS = normalize(TransformObjectToWorldDir(float3(0, 1, 0)));
float3 rightWS = cross(upWS, ViewDirWS);
if (dot(rightWS, rightWS) < 1e-5)
rightWS = normalize(TransformObjectToWorldDir(float3(1, 0, 0)));
else
rightWS = normalize(rightWS);
float3 forwardWS = normalize(cross(rightWS, upWS));
return PivotWS + PositionOS.x * rightWS + PositionOS.y * upWS + PositionOS.z * forwardWS;
}
float3 ApplayerTaperAndScale(float3 PositionOS, float3 Scale)
{
float taper = lerp(Scale.z, 1, saturate(PositionOS.y));
float3 p = PositionOS;
p.xy *= Scale.xy;
p.x *= taper;
return p;
}
void Ray_float
(
float3 Color,
float3 PositionOS,
float4 ScreenPos,
uint Orthographic,
out float3 OutPosition,
out float3 OutColor
)
{
float3 pivot = TransformObjectToWorld(float3(0, 0, 0));
float3 scale = float3
(
length(TransformObjectToWorld(float3(1, 0, 0)) - pivot),
length(TransformObjectToWorld(float3(0, 1, 0)) - pivot),
length(TransformObjectToWorld(float3(0, 0, 1)) - pivot)
);
float3 viewDir = lerp(normalize(pivot - _WorldSpaceCameraPos.xyz), GetViewForwardDir(), Orthographic);
float3 pOS_0 = ApplayerTaperAndScale(PositionOS, scale);
float3 pOS_1 = ApplayerTaperAndScale(float3( .5, PositionOS.y, 0), scale);
float3 pOS_2 = ApplayerTaperAndScale(float3(-.5, PositionOS.y, 0), scale);
float3 pWS_0 = GetBillboardPositionWS(pOS_0, pivot, viewDir);
float3 pWS_1 = GetBillboardPositionWS(pOS_1, pivot, viewDir);
float3 pWS_2 = GetBillboardPositionWS(pOS_2, pivot, viewDir);
float2 pSC_0 = ScreenPos.xy;
float2 pSC_1 = WorldToScreenUV(pWS_1);
float2 pSC_2 = WorldToScreenUV(pWS_2);
float2 uv = float2(distance(pSC_0.x, pSC_2.x) / distance(pSC_1.x, pSC_2.x), pOS_0.y / scale.y);
OutPosition = TransformWorldToObject(pWS_0);
OutColor = float3(uv, 0);
}