ArabDesert/Assets/Editor/x64/Bakery/shaderSrc/ftCullFarSphere.compute

80 lines
2.2 KiB
Plaintext

#pragma kernel CSMain
StructuredBuffer<float3> verts;
StructuredBuffer<uint3> indices;
StructuredBuffer<float2> uvs;
AppendStructuredBuffer<uint3> newIndices;
Texture2D alphaTex;
float cubeSize;
uint triCount;
//float3 localCamPos;
float3 trinormal(float3 v0, float3 v1, float3 v2)
{
float3 p = v0-v1;
float3 q = v1-v2;
float3 norm = cross(p,q);
return normalize(norm);
}
[numthreads(256,1,1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{
if (id.x >= triCount) return;
uint3 ind = indices[id.x];
float3 a = verts[ind.x];
float3 b = verts[ind.y];
float3 c = verts[ind.z];
float ab = distance(a,b);
float bc = distance(b,c);
float ca = distance(c,a);
//if (max(max(ab, bc), ca) > 0.9) return;
float3 n = trinormal(a,b,c);
float3 dir = normalize(a);// - localCamPos);
//if (dot(-dir, n) > 0.2f)
float elimit = 10;
float dlimit = 900;
//if (distance(localCamPos, a) < dlimit && distance(localCamPos, b) < dlimit && distance(localCamPos, c) < dlimit)
if (length(a) < dlimit && length(b) < dlimit && length(c) < dlimit)
{
if (dot(-dir, n) > 0.0f)
{
float degenerateThreshold = 0.1f;
bool deg = false;
if (((bc + ca) - ab) / ab < degenerateThreshold)
{
deg = true;
}
else if (((ab + ca) - bc) / bc < degenerateThreshold)
{
deg = true;
}
else if (((ab + bc) - ca) / ca < degenerateThreshold)
{
deg = true;
}
if (!deg)
{
float2 uv0 = uvs[ind.x] * cubeSize;
float2 uv1 = uvs[ind.y] * cubeSize;
float2 uv2 = uvs[ind.z] * cubeSize;
float a0 = alphaTex.Load(int3(uv0.x, uv0.y, 0)).a;
float a1 = alphaTex.Load(int3(uv1.x, uv1.y, 0)).a;
float a2 = alphaTex.Load(int3(uv2.x, uv2.y, 0)).a;
//float a = a0 + a1 + a2;
float a = a0 * a1 * a2;
if (a > 1.0f / 255)
{
newIndices.Append(ind);
}
}
}
}
}