代码之家  ›  专栏  ›  技术社区  ›  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 / 300;
        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 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;
    
        float2 point = a * nt_3 + params.p1 * nt_2 * t + params.p2 * nt * t_2 + b * t_3;
    
        float2 tangent = -3.0 * a * nt_2 + params.p1 * (1.0 - 4.0 * t + 3.0 * t_2) + params.p2 * (2.0 * t - 3.0 * t_2) + 3 * b * t_2;
    
        tangent = normalize(float2(-tangent.y, tangent.x));
        VertexOutBezier vo;   
        vo.pos.xy = point   + (tangent * (lineWidth / 3.0f));
        vo.pos.zw = float2(0, 1);
        vo.color = params.color ;
        return vo;
    }
    

    我的碎片着色器是

    fragment float4 bezier_fragment(VertexOutBezier params[[stage_in]],
                                    texture2d<float> texture [[texture(0)]]
                                    )
    {
        constexpr sampler defaultSampler;
       float4 canvasColor = texture.sample(defaultSampler, params.pos.xy);
        return canvasColor;   
    }
    

    在这里我希望得到纹理的像素颜色。但在这里它只有单一的颜色。它无法根据纹理的位置获取纹理的颜色。

    即使我在片段中这样做,我得到的是单一的颜色,它不随坐标变化

    fragment float4 bezier_fragment(VertexOutBezier params[[stage_in]],
                                    texture2d<float> texture [[texture(0)]]
                                    )
    {
        constexpr sampler defaultSampler;
       float4 canvasColor = params.color * params.pos.x;
        return canvasColor;
    }
    

    如果我在顶点着色器中这样做,我得到的颜色会随着x的位置而变化

    vo.pos.xy = point   + (tangent * (lineWidth / 3.0f));
    vo.pos.zw = float2(0, 1);
    vo.color = params.color * vo.pos.x;
    

    片段着色器中的问题是什么。我无法从顶点着色器获取坐标

    1 回复  |  直到 6 年前
        1
  •  1
  •   Danny Lau    6 年前

    请确保VertexOutBezier.pos.xy值为normalization(0~1.0),因为defaultSampler只接收normalization位置值,如果总是返回一个可能是位置超出界限的值。