Triangulation in Metal

2019-08-31 05:31发布

问题:

As Shown in the picture. The numbers are touchpoints in the screen in order. I need to draw the traingulation only inside Colored area. Can we do it in metal with its algorithm or Any suggestions please

var temp1:VertexInFillBrus
temp1 = VertexInFillBrush(a:drawPoints[0] , b:drawPoints[drawPoints.count - 1] , c: drawPoints[drawPoints.count - 2]))
self.bezierCalculatedCoordinates.append(temp1)
self.buildBuffers(device: device)

In Draw Command

commandEncoder.setRenderPipelineState(renderPipelineState!)
commandEncoder.setVertexBuffer(vertexBuffer, offset: 0, index: 0)
commandEncoder.setFragmentTexture(texture, index: 0)
commandEncoder.drawIndexedPrimitives(type: .triangle, indexCount: 3 , indexType: .uint16, indexBuffer: indexBuffer!, indexBufferOffset: 0 ,instanceCount:bezierCalculatedCoordinates.count)

In shader

struct VertexOutFillBrush {
    float4 pos[[position]];
    float2 currentTextureCoordinates;
};
struct VertexInFillBrush
{
    float2 a;
    float2 b;
    float2 c;
};

Vertex Shader

 vertex VertexOutFillBrush fillBrushVertex(constant VertexInFillBrush *allParams[[buffer(0)]],
                                            uint vertexId [[vertex_id]],
                                            uint instanceId [[instance_id]])
    {

        VertexInFillBrush params = allParams[instanceId];
        VertexOutFillBrush vo;
        half2 pos;
        ushort x = (vertexId % 3) ;
        switch (x) {

            case 0:
                pos.x = params.a.x ;//+   0.06 * sinpi(params.angle)  * 3.0/4.0  ;
                pos.y = params.a.y ;//-    0.06 * cospi(params.angle);
                vo.currentTextureCoordinates =  float2(1 * pos.x/2.0 + 0.5 , -1 * pos.y/2.0 + 0.5);
                break;
            case 1:
                pos.x = params.b.x ;//+   0.06 * sinpi(params.angle)  * 3.0/4.0  ;
                pos.y = params.b.y ;//-
                 vo.currentTextureCoordinates =  float2(1 * pos.x/2.0 + 0.5 , -1 * pos.y/2.0 + 0.5);
                break;

         default:
                pos.x = params.c.x ;
                pos.y = params.c.y  ;
                vo.currentTextureCoordinates =  float2(1 * pos.x/2.0 + 0.5 , -1 * pos.y/2.0 + 0.5);
                break;
        }
        vo.pos.xy = float2(pos);
        vo.pos.zw = float2(0, 1);

        return vo;
    }

In fragment Shader

fragment float4 fillBrushFragment(VertexOutFillBrush params[[stage_in]],
                                    texture2d<float , access::sample>texture [[texture(0)]])
{

    constexpr sampler defaultSampler;
    float4 color = float4(texture.sample(defaultSampler, float2(params.currentTextureCoordinates))) ;
    if(color.w > 0.02){
        return float4(0.0,0.0,0.0,0.0);
    }
    return float4(1.0,1.0,0.0,0.5);

}