TL; DR: Metall scheint nicht zu erkennen, was meine Vertex-ShaderFragment Funktion scheint richtig geschrieben, aber Metall klagt
zurück Ich habe diese beiden Funktionen in MSL geschrieben:
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));
}
Wenn ich versuche, meine Pipeline Zustand mit denen machen zu erstellen, mit diesem Code:
// 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)
Es ist ein Fehler bei der Erstellung der Pipeline Zustand:
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" [...]
Ich überprüfte und überprüfte den Code und kann nicht verstehen, was falsch ist.
Irgendwelche Ideen? Vielen Dank!
Wird nicht die Positionsmarke verwendet, um die Position auf dem Bildschirm zu erhalten, anstatt die Position relativ zum Rechteck? –
Vielen Dank für Ihre Antwort, ich werde überprüfen, dass morgen –
Es ist "Fenster relativ", aber das bedeutet wirklich relativ zu dem Ansichtsfenster, die einen Teil der Farbe oder Tiefe Anhang (s) angibt. Für einen Vertex-Shader wie deins, der nur einen 'float4' zurückgibt, ist der Rückgabewert die' position'. Da dies als Eingabe für Ihre Fragmentfunktion gewünscht ist, möchten Sie diese Eingabe auch als "Position" annotieren. –