Рисование круга во фрагментном шейдере - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь нарисовать круг во фрагментном шейдере. Со стороны процессора я передаю позицию точки касания в шейдер.

Ниже приведены структуры ввода / вывода теней

struct smudgeOut {
    float4 pos[[position]];
    float  pointSize [[point_size]];
    float2 textureCoordinates;
    float2 drawPoint;
};
struct SmudgeIn
{
    float2 drawPoint;
    float size;
    float4 color;

};

В вершинном шейдере я создаю квадрат вокруг точки, которую я прохожу

vertex smudgeOut vertex_shader_smudge(constant SmudgeIn *allParams[[buffer(0)]],
                                      uint vertexId [[vertex_id]],
                                      uint instanceId [[instance_id]])
{
    SmudgeIn params = allParams[instanceId];
    smudgeOut vo;
    half2 pos;

    ushort x = (vertexId % 4) ;
    switch (x) {
        case 1:
            pos.x = params.drawPoint.x +     params.size  * 3.0/4.0 ;
            pos.y = params.drawPoint.y +   params.size ;
            vo.textureCoordinates = float2(1,0);;
            break;
        case 2:
            pos.x = params.drawPoint.x -    params.size * 3.0/4.0  ;
            pos.y = params.drawPoint.y -     params.size ;
            vo.textureCoordinates = float2(0,1);
            break;
        case 3:
            pos.x = params.drawPoint.x +   params.size  *  3.0/4.0  ;
            pos.y = params.drawPoint.y -    params.size ;
            vo.textureCoordinates = float2(1,1);
            break;
        default:
            pos.x = params.drawPoint.x -   params.size  * 3.0/4.0 ;
            pos.y = params.drawPoint.y +   params.size  ;
            vo.textureCoordinates = float2(0,0);
            break;
    }
    vo.pos.xy = float2(pos);
    vo.drawPoint = params.drawPoint;
    vo.pointSize = 60;
    vo.pos.zw = float2(0, 1);
    return vo;
    }

Thisэто фрагментный шейдер внутри квадрата, который я создал, я хочу, чтобы внутри был круг с цветом, оставшиеся части квадрата были бы бесцветными

fragment float4 fragment_shader_smudge(smudgeOut params[[stage_in]],
                                       float2 uv[[point_coord]],
                                       texture2d<float , access::sample>texture [[texture(0)]],
                                       texture2d<float , access::sample>texture1 [[texture(1)]])
{

    float2 uvPos = uv;
    float2 centerpoint = params.drawPoint;

    float2 diff = uvPos - centerpoint;

    float dist = length(diff);
    float4 color;

    if(dist < 0.05){
        float4 color = float4(1.0f, 0.0f, 1.0f, 1.0f);
    }else{
        discard_fragment();
    }
    return color;
}

Я не смог бы обвести круг вокруг точки, которую япрошло и должно быть внутри площади.Предложите мне, что не так здесь

...