Линия Pixellating
Используя металл, я рисую линию, используя кривые Безье, используя четыре точки. Я использую около 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 ответ
Вам необходимо включить MSAA (мультисэмплирование сглаживания). Как вы это сделаете, зависит от вашей точной конфигурации Metal View, но самый простой способ, если вы используете MTKView
, Чтобы включить MSAA в MTKView
все, что вам нужно сделать, это:
metalView.sampleCount = 4
Затем, когда вы настраиваете MTLRenderPipelineDescriptor
перед звонком makeRenderPipelineState()
добавьте следующее:
pipelineDescriptor.sampleCount = 4
Это должно значительно улучшить качество ваших кривых и уменьшить пикселизацию. Однако это приводит к снижению производительности, поскольку графическому процессору приходится выполнять значительно больше работы для визуализации кадра.