2016-03-27 14 views
2

// Veröffentlichen Sie dies, falls jemand auf das gleiche Problem stößt.SpriteKit Shader läuft nicht mit Uniformen

Original-Problem:

Portierungs einen Shader über OSX, und versucht es, eine Uniform zu füttern. Der Shader wird nicht ausgeführt.

Dies ist an: XCode 7.3, Swift 2.

GameScene.swift:

var myShader = SKShader(); 

override func didMoveToView(view: SKView) { 

    ////////////////////////////////// 
    // Create SKShader 
    let shaderContainer = SKSpriteNode(color: NSColor.grayColor(), size: CGSizeMake(300, 300)); 
    shaderContainer.position = CGPointMake(self.frame.width/2, self.frame.height/2); 

    self.addChild(shaderContainer); 

    myShader = SKShader(fileNamed: "color-wheel.fsh"); 
    let utest = SKUniform(name: "utest", float: 0.3); 
    myShader.addUniform(utest); 

    shaderContainer.shader = myShader; 
} 

farb wheel.fsh (Shader):

#define PI 3.14159265359 
#define TWO_PI 6.28318530718 

// Function from Iñigo Quiles 
// https://www.shadertoy.com/view/MsS3Wc 
vec3 hsb2rgb(in vec3 c){ 
    vec3 rgb = clamp(abs(mod(c.x*6.0+vec3(0.0,4.0,2.0), 6.0)-3.0)-1.0, 0.0, 1.0); 
    rgb = rgb*rgb*(3.0-2.0*rgb); 
    return c.z * mix(vec3(1.0), rgb, c.y); 
} 

void main (void) { 
    vec2 st = v_tex_coord; // SPRITEKIT SPECIFIC 

    vec3 color = vec3(0.0); 

    // Using Polar Coordinates instead of Cartesian 
    vec2 vectorToCentre = vec2(0.5) - st; 
    float angle = atan(vectorToCentre.y, vectorToCentre.x); // function is atan(y,x) , not x,y 
    float distanceToCentre = length(vectorToCentre); 
    float radius = distanceToCentre * 2.0; 
    angle = angle + u_time*0.6 - radius*2.5; 

    vec3 hue = vec3(angle/TWO_PI+0.5, radius, 1.0) * vec3(1.0, 0.4, 1.0); 
    color = hsb2rgb(hue); 

    gl_FragColor = vec4(color, 1.0); 
} 

Antwort

2

Fand dieses nach ein bisschen trialing.

Lösung:

In diesem Szenario (XCode 7.3), erscheint es, wenn ein Shader-Uniformen verwendet, und #defines müssen die #defines nicht auf der nullten Linie sein, z .;

farb wheel.fsh (Shader):

// BLANK LINE HERE 
#define PI 3.14159265359 
#define TWO_PI 6.28318530718 

... 

Ich stelle mir vor iOS auch ähnliche Betrachtung erfordern.

1

Ihr Problem ist, dass Sie niemals eine Uniform in Ihrem Shader deklarieren. Irgendwo im Shader sollten Sie

uniform float utest 

Ich vermute, Sie bekommen verwirrt mit uTest und u_time, die ein in GLSL einheitlich gebaut ist auf ios

edit: Eigentlich ist mir falsch. Sie müssen Uniformen in IOS nicht deklarieren, wenn Sie sie festlegen. In der Tat, wenn Sie dies tun, brechen sie den Shader. In Ihrem Fall besteht der Fehler darin, dass Sie eine Uniform mit dem falschen Namen deklarieren (z. B. einheitlicher Name, der im Shader nicht verwendet wird)

Verwandte Themen