2015-07-02 24 views
1

我在我的項目中添加了兩個着色器,其中一個來自WWDC 2014示例的着色器,另一個具有相同的代碼,但添加了自定義制服。問題在於,自定義制服的精靈在應用運行時呈現爲靜態,而在Xcode的SpriteKit編輯器中呈現黑色。爲什麼SpriteKit不更新着色器的制服?

enter image description here

與自定義統一着色器低於,u_speed用於控制海浪移動的速度。

void main() 
{ 
    float currTime = u_time * u_speed; 

    vec2 uv = v_tex_coord; 
    vec2 circleCenter = vec2(0.5, 0.5); 
    vec3 circleColor = vec3(0.8, 0.5, 0.7); 
    vec3 posColor = vec3(uv, 0.5 + 0.5 * sin(currTime)) * circleColor; 

    float illu = pow(1. - distance(uv, circleCenter), 4.) * 1.2; 
    illu *= (2. + abs(0.4 + cos(currTime * -20. + 50. * distance(uv, circleCenter))/1.5)); 

    gl_FragColor = vec4(posColor * illu * 2., illu * 2.) * v_color_mix.a; 
} 

This是一個項目,我只用了着色器和兩個精靈顯示問題放在一起。

回答

1

從我所知道的,你的代碼沒有問題。 GameScene.sks將自定義着色器統一信息傳遞給着色器,導致它成爲0,並凍結動畫,似乎存在一個錯誤。

如果您在代碼中而不是在UI生成器中初始化所有內容,則它可以正常工作。將其粘貼到您的didMoveToView:中,查看我的意思。

SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithColor:[SKColor whiteColor] size:CGSizeMake(100, 100)]; 
sprite.position = CGPointMake(self.size.width/2, self.size.height/2); 
[self addChild:sprite]; 
SKShader* spin2x = [SKShader shaderWithFileNamed:@"Shader2"]; 

spin2x.uniforms = @[ 
         [SKUniform uniformWithName:@"u_speed" float:(2.0)], 
         ]; 
sprite.shader = spin2x; 
+0

我發現另一個線程提到了類似的問題,並解釋了這個問題。你不能直接在着色器中使用傳遞的制服,你必須先將它們分配給一個變量。在您的制服內,只需添加:float userSpeed = u_speed;然後將u_time乘以userSpeed而不是u_speed。這應該使它與Interface Builder定義的統一一起工作。在這裏有一些討論的線程在這裏:http://stackoverflow.com/questions/25824414/skshader-performance-slowdown/31196711#31196711 – itnAAnti

+0

我認爲這是rraallvv正在下面工作,在獲取實際統一值。 – itnAAnti

0

添加類似下面的didMoveToView:代碼並獲得成功,不知何故制服是有,但不是由着色器讀取,這種價值觀的「提神」並使其正常工作。

for (SKSpriteNode *sprite in self.children) { 
    if ([sprite isKindOfClass:[SKSpriteNode class]]) { 
     for (SKUniform *uniform in sprite.shader.uniforms) { 
      if (uniform.uniformType == SKUniformTypeFloat) { 
       uniform.floatValue = uniform.floatValue; 
      } 
     } 
    } 
} 
+1

如果您想要對統一進行動態更新,它通常需要進行更新,而不僅僅是didMoveToView。在更新函數中完成此操作後,我可以獲取着色器的更新。很遺憾,看起來我們不能通過引用統一來傳遞變量,而是通過值來傳遞所有變量。 – GOR

相關問題