2016-03-27 25 views
2

//發佈這個以防萬一任何人遇到相同的問題。SpriteKit着色器沒有與制服一起運行

原來的問題:

移植着色器到OSX,並試圖給它的均勻。着色器實際上不運行。

這是上: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; 
} 

顏色wheel.fsh(着色):

#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); 
} 

回答

2

位試運行之後找到此。

解決方案:

在這種情況下(7.3的XCode),看來如果着色器利用制服,和#定義,#定義不能是第零行,例如;

顏色wheel.fsh(着色器):

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

... 

我想象的iOS可能也需要類似的考慮。

1

你的問題是你永遠不會在你的着色器中聲明一個統一的。某處在着色器,你應該有

uniform float utest 

我懷疑你弄糊塗了與utest和u_time,這是一個建在GLSL統一iOS上

編輯:其實,我錯了。當你設置它們時,你不必在ios中聲明制服。事實上,如果你這樣做,他們會打破着色器。所以在你的情況下,錯誤是你用一個錯誤的名字來聲明一個制服(例如,統一的名稱不用在着色器中)

相關問題