Линия Pixellating - PullRequest
       10

Линия Pixellating

0 голосов
/ 26 июня 2018

Используя металл Я рисую линию, используя кривые Безье, используя четыре точки. Я использую около 1500 треугольников для линий. Линия является Pixellated. Как я могу уменьшить pixellated.

vertex VertexOutBezier bezier_vertex(constant BezierParameters *allParams[[buffer(0)]],
                               constant GlobalParameters& globalParams[[buffer(1)]],
                               uint vertexId [[vertex_id]],
                               uint instanceId [[instance_id]])
{

    float t = (float) vertexId / globalParams.elementsPerInstance;


    rint(t);
    BezierParameters params = allParams[instanceId];

    float lineWidth = (1 - (((float) (vertexId % 2)) * 2.0)) * params.lineThickness;
 float2 a = params.a;
    float2 b = params.b;

    float cx = distance(a , b);


float2 p1 = params.p1 * 3.0;  // float2 p1 = params.p1 * 3.0;
    float2 p2 = params.p2 * 3.0;  // float2 p2 = params.p2 * 3.0;

    float nt = 1.0f - t;
    float nt_2 = nt * nt;
    float nt_3 = nt_2 * nt;
    float t_2 = t * t;
    float t_3 = t_2 * t;

    // Calculate a single point in this Bezier curve:
    float2 point = a * nt_3 + p1 * nt_2 * t + p2 * nt * t_2 + b * t_3;

    float2 tangent = -3.0 * a * nt_2 + p1 * (1.0 - 4.0 * t + 3.0 * t_2) + p2 * (2.0 * t - 3.0 * t_2) + 3 * b * t_2;
    tangent = (float2(-tangent.y , tangent.x  ));
    VertexOutBezier vo;       
    vo.pos.xy = point + (tangent * (lineWidth / 2.0f));
    vo.pos.zw = float2(0, 1);
    vo.color = params.color;

    return vo;
}

1 Ответ

0 голосов
/ 26 июня 2018

Вам необходимо включить MSAA (мультисэмплирование сглаживания). То, как вы это сделаете, зависит от вашей конкретной конфигурации Metal view, но самый простой способ, если вы используете MTKView. Чтобы включить MSAA в MTKView, все, что вам нужно сделать, это:

metalView.sampleCount = 4

Затем, когда вы настраиваете MTLRenderPipelineDescriptor перед вызовом makeRenderPipelineState(), добавьте следующее:

pipelineDescriptor.sampleCount = 4

Это должно значительно улучшить качество ваших кривых и уменьшить пикселизацию. Однако это приводит к снижению производительности, поскольку графическому процессору приходится выполнять значительно больше работы для визуализации кадра.

...