【问题标题】:Fragment shader and Vertex Shader in MetalMetal中的片段着色器和顶点着色器
【发布时间】:2019-01-24 03:35:34
【问题描述】:

片段着色器

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;

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

【问题讨论】:

  • 我们需要查看VertexOutBezier结构类型的定义。

标签: ios swift metal metalkit


【解决方案1】:

请确保 VertexOutBezier.pos.xy 的值是归一化的 (0 ~ 1.0),由于 defaultSampler 只接收归一化的位置值,如果总是返回单个可能是位置超出范围。

【讨论】:

  • 我们不能收到未标准化的值吗?是否有任何采样器方法可以从 Vertex Shader 接收未归一化的值?
  • 当然,在片段着色器中试试这个constexpr sampler defaultSampler(coord::pixel);
猜你喜欢
  • 2011-05-24
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多