片段函数似乎写得正确,但 Metal 抱怨
Fragment function seems properly written but Metal complains
TL;DR: Metal 似乎没有检测到我的顶点着色器 returns
我用 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)
创建管道状态时出错:
fatal error: 'try!' expression unexpectedly raised an error: Error
Domain=CompilerError Code=1 "Link failed: fragment input vPos was not
found in vertex shader outputs" [...]
我检查并重新检查了代码,不明白哪里出了问题。
有什么想法吗?谢谢!
尝试用 position
替换 stage_in
。我认为 stage_in
主要与 struct
s 一起使用,其中每个字段都用特定的属性限定符注释或按名称匹配。显然,当它与非结构类型一起使用时,它会尝试按名称进行匹配。例如,如果您的顶点函数要输出一个结构,其字段之一是 vPos
,那会找到它。
TL;DR: Metal 似乎没有检测到我的顶点着色器 returns
我用 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)
创建管道状态时出错:
fatal error: 'try!' expression unexpectedly raised an error: Error Domain=CompilerError Code=1 "Link failed: fragment input vPos was not found in vertex shader outputs" [...]
我检查并重新检查了代码,不明白哪里出了问题。
有什么想法吗?谢谢!
尝试用 position
替换 stage_in
。我认为 stage_in
主要与 struct
s 一起使用,其中每个字段都用特定的属性限定符注释或按名称匹配。显然,当它与非结构类型一起使用时,它会尝试按名称进行匹配。例如,如果您的顶点函数要输出一个结构,其字段之一是 vPos
,那会找到它。