Files
textdecalURP/Assets/TextMesh Pro/Shaders/DecalFunctions.hlsl
2024-12-02 18:24:09 +03:00

89 lines
3.0 KiB
HLSL

float invLerp(const float from, const float to, const float value)
{
return (value - from) / (to - from);
}
float remap(const float origFrom, const float origTo, const float targetFrom, const float targetTo, const float value)
{
const float rel = invLerp(origFrom, origTo, value);
return lerp(targetFrom, targetTo, rel);
}
float3 rotate(float3 p, float4 quaternion)
{
const float x = -quaternion.x;
const float y = -quaternion.y;
const float z = -quaternion.z;
const float w = quaternion.w;
const float3x3 rotation_matrix = float3x3(
1 - 2 * (y * y + z * z), 2 * (x * y - w * z), 2 * (x * z + w * y),
2 * (x * y + w * z), 1 - 2 * (x * x + z * z), 2 * (y * z - w * x),
2 * (x * z - w * y), 2 * (y * z + w * x), 1 - 2 * (x * x + y * y)
);
return mul(rotation_matrix, p);
}
void ComputeSDFDecal_float(float SSR, float SD, float SDR, float2 softness, float2 dilate, float weight,
float4 faceColor, out float4 rgba)
{
float scale = 1 / SSR * SDR;
scale /= 1 + (softness.x * scale);
const float w = .5 - (weight + dilate.x) * .5;
rgba = faceColor * saturate((SD - w) * scale + 0.5);
float4 outlineColor = float4(0,1,1,1);
float outlineWidth = dilate.y;
// outlineColor = lerp(faceColor, outlineColor, sqrt(min(1.0, outlineWidth * scale * 2)));
// rgba = lerp(outlineColor, faceColor, saturate((SD - w - outlineWidth) * scale + 0.5));
// rgba *= saturate((SD - w + outlineWidth) * scale + 0.5);
}
void CalculateDecal_float(float3 position, float4 meshData, float4 uvData, float4 quaternion,
out float3 decalUV, out float3 decalClip)
{
float3 local_pos = position - meshData.xyz;
local_pos = rotate(local_pos, quaternion);
const float width = meshData.w;
const float height = meshData.w * uvData.w;
local_pos.x += width / 2;
local_pos.y += height / 2;
decalClip = float3(
step(0, local_pos.x) * (1 - step(width, local_pos.x)),
step(0, local_pos.y) * (1 - step(height, local_pos.y)),
1);
// remap from (0..vertex_size) to (uv.start..uv.end)
const float2 uvSize = float2(uvData.z, uvData.z * uvData.w);
decalUV = float3(
remap(0, width, uvData.x, uvData.x + uvSize.x, local_pos.x),
remap(0, height, uvData.y, uvData.y + uvSize.y, local_pos.y),
local_pos.z);
}
void ComputeSDFDecal_float(float4 faceColor, float SD, float scale, float3 decal_clip, out float4 rgba)
{
rgba = faceColor * saturate((SD - 0.5) * scale + 0.5);
rgba *= decal_clip.x * decal_clip.y * decal_clip.z;
}
void DecalClip_float(inout float4 color, float3 decal_clip)
{
color *= decal_clip.x * decal_clip.y * decal_clip.z;
}
void DecalClip_float(in float4 color, float3 decal_clip, out float4 result)
{
DecalClip_float(color, decal_clip);
result = color;
}
void CalculateSSR_float(float2 uv, float textureHeight, bool filter, out float SSR)
{
SSR = abs(ddx(uv.x)) + abs(ddy(uv.y));
SSR *= textureHeight * 0.75;
}