碎片功能似乎写得很好,但Metal抱怨

时间:2017-01-09 23:11:09

标签: metal metalanguage

TL; DR:Metal似乎没有检测到我的顶点着色器返回的内容

我有两个用MSL编写的函数:

vertex float4 base_image_rect(constant float4 *pos [[buffer(0)]],
                                           uint vid [[vertex_id]]) {
    return pos[vid];
}

fragment float4 fragment_image_display(float4 vPos [[stage_in]],
                              texture2d<float, access::sample> imageToRender [[texture(0)]],
                              sampler imageSampler [[sampler(0)]]) {
    return imageToRender.sample(imageSampler, float2(vPos.x, vPos.y));
}

当我尝试使用以下代码创建渲染管道状态时:

// Make image display render pipeline state
let imageDisplayStateDescriptor = MTLRenderPipelineDescriptor()
imageDisplayStateDescriptor.colorAttachments[0].pixelFormat = view.colorPixelFormat
imageDisplayStateDescriptor.vertexFunction = library.makeFunction(name: "base_image_rect")
imageDisplayStateDescriptor.fragmentFunction = library.makeFunction(name: "fragment_image_display")

displayImagePipelineState = try! device.makeRenderPipelineState(descriptor: imageDisplayStateDescriptor)

创建管道状态时出错:

  

致命错误:'试试!'表达式意外地引发了错误:错误   Domain = CompilerError Code = 1“链接失败:片段输入vPos   在顶点着色器输出中找到“[...]

我检查并重新检查了代码,无法理解错误。

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:4)

尝试将stage_in替换为position。我认为stage_in主要与struct一起使用,其中每个字段都使用特定属性限定符进行注释或按名称进行匹配。显然,当它与非结构类型一起使用时,它会尝试按名称进行匹配。例如,如果您的顶点函数要输出其字段为vPos的结构,那么就可以找到它。