Files
Main/Assets/Editor/External/UwaProjScan/ArtCheckUtils/UwaProjScanUtil.compute

245 lines
5.2 KiB
Plaintext
Raw Permalink Normal View History

2025-01-25 04:38:09 +08:00
// Each #kernel tells which function to compile; you can have many kernels
//#pragma kernel FaceVisibility
#pragma kernel K1
#pragma kernel K3
//#pragma kernel EdgeDetection
#pragma kernel K2
#pragma kernel K4
// Create a RenderTexture with enableRandomWrite flag and set it
// with cs.SetTexture
//Texture
RWTexture2D<float4> T1;
//InTex
Texture2D<float4> v11;
//Vertices
StructuredBuffer<float3> v7;
//Faces
StructuredBuffer<int> v8;
//Result
RWStructuredBuffer<int> v13;
//MVP
uniform float4x4 v5;
//VisRenderSize
uniform int v9;
//MeshSize
uniform float v12;
uniform int sf;
//Hash
float F1(uint s)
{
s = s ^ 2747636419u;
s = s * 2654435769u;
s = s ^ (s >> 16);
s = s * 2654435769u;
s = s ^ (s >> 16);
s = s * 2654435769u;
return float(s) / 4294967295.0f;
}
//InitRandom
float2 F2(float2 a)
{
float2 r;
r.x = abs(F1(uint(a.x * 4294967295.0f)));
r.y = abs(F1(uint(a.y * 4294967295.0f)));
return r;
}
//GetRandomBarycentric
float3 F3(float2 a) {
float3 b;
b.xy = F2(a);
float c = b.x + b.y;
if (c > 1.0f) {
b.xy /= c;
b.z = 0.0f;
}
else {
b.z = 1.0f - c;
}
return b;
}
//FaceVisibility
[numthreads(64, 1, 1)]
void K1(uint3 id : SV_DispatchThreadID)
{
int v1 = id.x;
float4 v2 = float4(v7[v8[v1 * 3]], 1);
float4 v3 = float4(v7[v8[v1 * 3 + 1]], 1);
float4 v4 = float4(v7[v8[v1 * 3 + 2]], 1);
v2 = mul(v5, v2);
v3 = mul(v5, v3);
v4 = mul(v5, v4);
v2 /= v2.w;
v3 /= v3.w;
v4 /= v4.w;
float v10 = length(cross(float3(v2.xy - v3.xy, 0), float3(v2.xy - v4.xy, 0)));
uint t = sqrt(0.1 * v10 * v9 * v9);
t = max(t, 2);
float tt = 1.0f / t;
for (float i = 0; i < 1.0f + 1e-4; i += tt)
{
for (float j = 0; j < 1.0f + 1e-4 - i; j += tt)
{
float3 ttt = i * v2.xyz + j * v3.xyz + (1.0f - i - j) * v4.xyz;
uint2 l = (ttt.xy * 0.5f + float2(0.5f, 0.5f)) * v9;
float v12 = v11[l].r;
if ((ttt.z - v12) > -1e-4 * v12)
{
v13[v1] = 1;
break;
}
}
}
}
//EdgeDetection
// ref: http://recreationstudios.blogspot.com/2010/04/sobel-filter-compute-shader.html
[numthreads(8, 8, 1)]
void K2(uint3 id : SV_DispatchThreadID)
{
float l13 = 0.95f;
// Sample neighbor pixels
// 00 01 02
// 10 __ 12
// 20 21 22
float3 l1 = v11[id.xy + float2(-1, -1)].xyz;
float3 l2 = v11[id.xy + float2(0, -1)].xyz;
float3 l3 = v11[id.xy + float2(1, -1)].xyz;
float3 l4 = v11[id.xy + float2(-1, 0)].xyz;
float3 l5 = v11[id.xy + float2(1, 0)].xyz;
float3 l6 = v11[id.xy + float2(-1, 1)].xyz;
float3 l7 = v11[id.xy + float2(0, 1)].xyz;
float3 l8 = v11[id.xy + float2(1, 1)].xyz;
float3 l9 = l1 + 2 * l4 + l6 - l3 - 2 * l5 - l8;
float3 l10 = l1 + 2 * l2 + l3 - l6 - 2 * l7 - l8;
float3 l11 = (l9 * l9 + l10 * l10);
float3 l12 = (l11 > l13 * l13);
// l14 is where is normal edge but not uv edge.
float l14 = saturate(saturate(l12.x + l12.y) - l12.z);
float4 l15 = float4(l14+ l12.z, l12.z, l12.z, 1);
if (l14 > 0.5f) {
v13.IncrementCounter();
}
T1[id.xy] = l15;
}
//CheckPadding
[numthreads(8, 8, 1)]
void K4(uint3 id : SV_DispatchThreadID)
{
float4 l12 = float4(0, 0, 0, 1);
if (v11[id.xy].y > 0.5f) {
l12 = float4(0.5, 0.5, 0.5, 1);
}
if (v11[id.xy].x > 0.5f)
{
v13.IncrementCounter();
l12 = float4(1, 1, 0, 1);
}
T1[id.xy] = l12;
}
//AnalysePadding
[numthreads(8, 8, 1)]
void K3(uint3 id : SV_DispatchThreadID)
{
float s11 = v11[id.xy].x * sf;
float l0 = v11[id.xy + float2(-1, -1)].x * sf;
float l2 = v11[id.xy + float2(0, -1)].x * sf;
float l3 = v11[id.xy + float2(1, -1)].x * sf;
float l4 = v11[id.xy + float2(-1, 0)].x * sf;
float l5 = v11[id.xy + float2(1, 0)].x * sf;
float l6 = v11[id.xy + float2(-1, 1)].x * sf;
float l7 = v11[id.xy + float2(0, 1)].x * sf;
float l8 = v11[id.xy + float2(1, 1)].x * sf;
float k3l1 = 0;
float k3l2 = 0;
float k3l3 = 0;
if (l0 > 1e-4)
{
k3l1 = l0;
k3l2 += l0;
k3l3 += 1.0f;
}
if (l2 > 1e-4)
{
k3l1 = l2;
k3l2 += l2;
k3l3 += 1.0f;
}
if (l3 > 1e-4)
{
k3l1 = l3;
k3l2 += l3;
k3l3 += 1.0f;
}
if (l4 > 1e-4)
{
k3l1 = l4;
k3l2 += l4;
k3l3 += 1.0f;
}
if (l5 > 1e-4)
{
k3l1 = l5;
k3l2 += l5;
k3l3 += 1.0f;
}
if (l6 > 1e-4)
{
k3l1 = l6;
k3l2 += l6;
k3l3 += 1.0f;
}
if (l7 > 1e-4)
{
k3l1 = l7;
k3l2 += l7;
k3l3 += 1.0f;
}
if (l8 > 1e-4)
{
k3l1 = l8;
k3l2 += l8;
k3l3 += 1.0f;
}
float l9 = l0 + 2 * l4 + l6 - l3 - 2 * l5 - l8;
float l10 = l0 + 2 * l2 + l3 - l6 - 2 * l7 - l8;
float l13 = 0.9f;
float l11 = (l9 * l9 + l10 * l10);
float k3l4 = (l11 > l13 * l13) ? 1.0f : 0.0f;
float4 l12 = float4(0, k3l4, 0, 0);
if (k3l3 > 1e-4)
{
float k3l5 = k3l2 / k3l3;
if (abs(k3l5 - k3l1) > 1e-2)
{
l12.x += 1;
}
}
T1[id.xy] = l12;
}