代码之家  ›  专栏  ›  技术社区  ›  Ruban4Axis

线条像素化

  •  0
  • Ruban4Axis  · 技术社区  · 6 年前

    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 回复  |  直到 6 年前
        1
  •  2
  •   ldoogy    6 年前

    您需要启用MSAA(多采样消除混叠)。如何做到这一点取决于您的确切金属视图配置,但最简单的方法是如果您正在使用 MTKView MTK视图

    metalView.sampleCount = 4
    

    MTLRenderPipelineDescriptor 呼叫前 makeRenderPipelineState()

    pipelineDescriptor.sampleCount = 4