2017-01-09 4 views
2

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!

Antwort

3

Versuchen Sie, stage_in durch position zu ersetzen. Ich denke, dass stage_in meist mit struct s verwendet wird, wobei jedes Feld entweder mit einem bestimmten Attributqualifikationsmerkmal versehen ist oder mit dem Namen übereinstimmt. Wenn es mit einem Nicht-Struct-Typ verwendet wird, versucht es offensichtlich, nach dem Namen zu suchen. Wenn Ihre Scheitelpunktfunktion beispielsweise eine Struktur ausgeben würde, deren Felder vPos wären, würde sie diese finden.

+0

Wird nicht die Positionsmarke verwendet, um die Position auf dem Bildschirm zu erhalten, anstatt die Position relativ zum Rechteck? –

+0

Vielen Dank für Ihre Antwort, ich werde überprüfen, dass morgen –

+0

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. –

Verwandte Themen