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 不 在顶点着色器输出中找到“[...]
我检查并重新检查了代码,无法理解错误。
有什么想法吗?谢谢!
答案 0 :(得分:4)
尝试将stage_in
替换为position
。我认为stage_in
主要与struct
一起使用,其中每个字段都使用特定属性限定符进行注释或按名称进行匹配。显然,当它与非结构类型一起使用时,它会尝试按名称进行匹配。例如,如果您的顶点函数要输出其字段为vPos
的结构,那么就可以找到它。