2016-11-25 6 views
3

Ich bin mit Metall auf iOS mit den folgenden Fragment-Shader:Metall: lineare Texturfilterung funktioniert nicht erwartet, da

constexpr sampler s(coord::normalized, 
        address::clamp_to_zero, 
        filter::linear); 

fragment half4 passThroughFragment(VertexInOut inFrag [[stage_in]], 
            texture2d<float> tex [[ texture(0) ]]) 
{ 
    return half4(tex.sample(s, inFrag.uv)); 
} 

Meine Textur ist ein 4x4-Bild. Trotz des Filtersatzes linear, erhalte ich folgendes Bild, mit nächsten Nachbarn Filterung:

Image with nearest neighbor filtering

Es scheint, dass mein uv ist in Ordnung ist, da, wenn ich die Fragment-Shader wie folgt ändern:

return half4(0, inFrag.uv.x, inFrag.uv.y, 1); 

ich das erwartete Bild:

Plot of UV coordinates

Gibt es noch etwas, was ich tun muss, damit die lineare Filterung anders funktioniert als filter::linear?

Antwort

3

Es scheint, lineare Filterung wird für Texturen des Typs MTLPixelFormatRGBA32Float auf meinem Gerät (iPad Pro) nicht unterstützt. Wenn ich zu MTLPixelFormatRGBA8Unorm ändere, funktioniert die Filterung wie erwartet.

+0

Wenn Ihnen das nicht bekannt ist, können Sie die Tabelle [Metal Pixel Format Capabilities] von Apple (https://developer.apple.com/metal/capabilities/) einsehen. In der Zeile für das Format, mit dem Sie arbeiten, suchen Sie in der Spalte für Ihr Feature-Set (das nach Betriebssystem und Version gruppiert ist) nach "Filter" oder "Alle". –

Verwandte Themen