#pragma kernel ConvertTrianglesToDotsKernel struct TriangleInput { float3 p1; float3 p2; float3 p3; }; StructuredBuffer triangles; RWStructuredBuffer positionOutputs; float maxDotAmount = 0.225; float seed = 1.32523252; int pointCountPerTriangle = 10; float pointsPerUnit = 1; float rand(float3 co){ return (frac(sin(dot(co ,float3(12.9898,78.233,45.5432))) * 43758.5453)); } float triangleArea (float3 a, float3 b, float3 c) { //for simplicitys sake ignoring the y dimension and finding area of 2D triangle return (a.x*(b.z-c.z) + b.x*(c.z-a.z) + c.x*(a.z-b.z))/2.0; } float3 randomPointOnTriangle (float3 a, float3 b, float3 c, float index) { float r1 = rand(index*b*seed); float r0 = r1 + rand(index*c*seed) * (1-r1);//bigger return float3(r1 * a.x + (r0-r1)*b.x + (1-r0)*c.x, r1 * a.y + (r0-r1)*b.y + (1-r0)*c.y, r1 * a.z + (r0-r1)*b.z + (1-r0)*c.z ); } [numthreads(16,1,1)] void ConvertTrianglesToDotsKernel (uint3 id : SV_DispatchThreadID) { TriangleInput tri = triangles[id.x]; int startIndex = id.x*pointCountPerTriangle; //based on triangle size get point amount float points = min(triangleArea(tri.p1,tri.p2,tri.p3)*pointsPerUnit,pointCountPerTriangle); for (int i = 0; i < pointCountPerTriangle; ++i) { if(i < points) { positionOutputs[startIndex + i] = randomPointOnTriangle(tri.p1,tri.p2,tri.p3, saturate((float)i/(float)points) );//tri.p1 * saturate(1 - (float)i/(float)points) + tri.p2 * saturate((float)i/(float)points); } else { positionOutputs[startIndex + i] = float3(0,0,0); } } }