#pragma kernel CSMain StructuredBuffer verts; StructuredBuffer indices; StructuredBuffer uvs; AppendStructuredBuffer 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); } } } } }