2016-10-01 4 views
1

Ich habe einige Code wie folgt:Scenekit SCNShadable Texture2D funktioniert nicht

let myShader = 
    "#pragma arguments\n" + 
    "sampler uMaskTex;\n" + 
    "uniform sampler2D uMaskTex;\n" + 

    "#pragma body\n" + 

    //none of these work 
    "vec3 mask = texture2D(uMaskTex , vec2(1.,1.)).xyz;\n" + 
    //"vec3 mask = texture2d(uMaskTex , vec2(1.,1.)).xyz;\n" + 
    //"vec3 mask = texture(uMaskTex , vec2(1.,1.)).xyz;\n" + 
    "_output.color.rgb = vec3(1.);" 

Ich bekomme eine rosa Masche. Wenn ich die texture2D Zeilen auskommentiere, funktioniert der Shader. Ich bekomme keine Fehler in der Konsole. Die Uniformen brechen es auch nicht, also nehme ich an, dass sie funktionieren (obwohl ich wirklich verwirrt bin, warum ich zwei von ihnen brauche, einen für opengl, den anderen für Metall).

Was ist der richtige Weg, um einen einheitlichen Sampler2D von einem Shader mit diesem SCNShadable-Mechanismus zu lesen?

+0

Warum hast du das mit 'metal' markiert? Benutzt du Metal in irgendeiner Weise? –

+0

weil, wenn ich verstehe, glsl wird transpiled, was auch immer Metall Schattierungssprache ist. Ich weiß, dass ich einige Probleme mit globalen Funktionen hatte, die dem ähnlich sind: http://stackoverflow.com/questions/37762535/scenekit-shader-modifier-for-geometry-entry-points-works-in-ios-but-not -os-x Ich benutze PBR und es scheint ausschließlich mit Metall zu arbeiten (habe einige Warnungen in diese Richtung bekommen). Sagst du mir, sollte es mit Metall getaggt sein oder nicht? Die Dokumentation sagt, zwei Uniformen zu erklären, eine für Metall für GLSL, obwohl ich vielleicht nur GLSL schreibe. Benutze ich Metall oder nicht? – pailhead

+0

@NicolBolas Ich versuche nicht, gemein oder so zu sein, aber angesichts der folgenden Antwort ist es mehr oder weniger ein Metal-Problem? Ich bin wirklich neugierig, vor allem, weil ich mit Scenekit frustriert bin und es ist Dokumentation :) – pailhead

Antwort

3

Dies scheint durch die Whitespace-Empfindlichkeit des Shader-Cross-Compilers verursacht zu werden. Insbesondere dann, wenn ich

ändern
vec3 mask = texture2D(uMaskTex , vec2(1.,1.)).xyz; 

zu

vec3 mask = texture2D(uMaskTex, vec2(1.,1.)).xyz; 

(beachten Sie das Fehlen eines Raumes nach dem ersten Parameter), scheint es zu funktionieren.

Es ist wahrscheinlich filing a bug report dafür wert. Der Parser sollte diesen Whitespace löschen, anstatt ihn als Teil des Bezeichners zu behandeln.

+0

Danke! Werde es ausprobieren. Irgendwelche Ratschläge, wie der Shader einen Fehler auslösen kann? – pailhead

+0

Leider nein. Um dies zu debuggen, setze ich einen symbolischen Haltepunkt auf 'newLibrary: options: error:' und drucke dann den Quellstring mit 'po $ arg3'. Von dort habe ich versucht, den generierten String als '.metal'-Datei in Xcode zu kompilieren, indem ich die Präprozessor-Direktiven so lange manipulierte, bis der Kompilierungsfehler den Code schlug (der generierte Sampler hieß 'uMaskTex Sampler' und nicht' uMaskTexSampler') Es war ein einfacher Abzug, um dann zu realisieren, dass der Parser dachte, dass extra Raum Teil des Samplernamens war. – warrenm

+0

Heilig $%^$ # ^! Hut ab, das klingt wahnsinnig, scheint ziemlich viel Arbeit zu sein! – pailhead