3

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)

创建管道状态时出错:

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

我检查并重新检查了代码,无法理解出了什么问题。

有任何想法吗?谢谢!

4

1 回答 1

6

尝试替换stage_inposition. 我认为这stage_in主要与structs 一起使用,其中每个字段要么用特定的属性限定符注释,要么按名称匹配。显然,当它与非结构类型一起使用时,它会尝试按名称匹配。例如,如果您的顶点函数要输出一个结构体,其中一个字段是vPos,那会找到它。

于 2017-01-10T00:10:09.477 回答