2016-03-27 24 views
2

// Birinin aynı sorunla karşılaşması durumunda bunu gönderiyoruz.SpriteKit Shader Uniforms ile çalışmıyor

Orjinal Sorun:

OSX üzerinde bir gölgelendirici Porting ve buna bir üniforma beslemeye çalışırken. Gölgelendirici aslında çalışmıyor.

Bu özellik şu şekildedir: 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; 
} 

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

cevap

2

trialing biraz sonra bu bulundu.

Çözüm:

Bu senaryoda (XCode 7.3) olarak

, bu .; bir gölgelendirici üniforma ve #DEFINEs kullanırsa, # tanımlar örneğin, sıfırıncı hattında olmamalıdır görünür

renk wheel.fsh (Shader):

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

... 

iOS da benzer bir değerlendirme yapılması gerekebilir düşünün.

1

Sorununuz, gölgelendiricinizde asla bir üniforma ilan etmiyorsunuz. Aslında yanlış mıyım: Somewhere gölgelendiricideki Seni bir IOS

düzenleme üzerinde glsl üniformalı inşa edilmiştir UTEST ve u_time ile karıştı şüpheli

uniform float utest 

olmalıdır. Ayarladığınızda ios içinde üniforma ilan etmek zorunda değilsiniz. Aslında, eğer yaparsan, gölgelendiriciyi kırıyorlar. Böylelikle sizin hatanınızda, yanlış isimle bir üniforma ilan edersiniz (örneğin, gölgelendiricide kullanılmayan tekdüze isim)