2016-11-05 153 views
3

我正在爲iPad和iOS 10編寫一個應用程序。 我正在使用Objective-C和SpriteKit。繪製一個SKShapeNode線條顏色漸變從一種顏色到另一種

我需要繪製一條以一種顏色開始並以另一種顏色結束的線條(例如紅色到綠色)。

這是我的Objective-C代碼:

CGPoint points[2]; 
points[0] = CGPointMake(100, 100); 
points[1] = CGPointMake(160, 110); 

SKShapeNode *line1=[SKShapeNode shapeNodeWithPoints:points count:2]; 
line1.lineWidth = 2.0; 
line1.zPosition = -1; 
[email protected]"line"; 
SKShader *myShader=[SKShader shaderWithFileNamed:@"shader1.fsh"]; 
line1.strokeShader=myShader; 
[self addChild:line1]; 

這是着色器:

void main(){ 

float length = u_path_length; 
float distance = v_path_distance; 


gl_FragColor = vec4(1.0*(1-(distance/length)), 1.0*(distance/length), 0., 1.); 
} 

當我運行的應用程序出現錯誤(與金屬): 失敗的斷言'在u_path_length [0]的索引1處缺少緩衝區綁定。'

它看起來像u_path_length和v_path_distance不iOS的10

工作,你可以幫助解決這個問題? 或者你能否提出一個不同的解決方案?

+0

不知道這是否可以以某種方式幫助,還是會在性能影響你的情況:http://stackoverflow.com/q/34422374。或者你可以看看這個:http://stackoverflow.com/a/36261550/3402095 – Whirlwind

+0

@Whirlwind感謝您的建議,但您鏈接的解決方案將創建一個圖像,然後可以用作紋理。問題是SKShapeNode不能很好地處理紋理(不能控制紋理大小),這就是爲什麼我想使用着色器。 我需要在屏幕上繪製很多這些線(至少100)。目前我正在考慮使用帶着色器(我認爲是最好的解決方案)的SKShapeNode或帶有來自資產(我已經有工作代碼)的圖像的SKSpriteNode。 – danyadd

+0

理想情況下,您完全不應該使用SKShapeNode,因爲一個SKShapeNode需要一次繪製調用。意思是,你可能會很快遇到性能問題。與可以批量繪製的SKSpriteNode不同,SKShapeNodes不能,也不能像使用文檔中指出的那樣謹慎使用SKShapeNode。所以如果屏幕上同時出現超過10-15個實例,我會親自避免它。 – Whirlwind

回答

1

如果我在Info.plist文件中添加了bool值爲YES的PrefersOpenGL鍵,則該錯誤(與Metal有關)將消失。 當然這意味着我的應用程序不會使用Metal。 我想這是iOS 10中的一個bug。

我遇到了另一個問題:v_path_distance按預期工作,但u_path_length沒有。 u_path_length始終爲0.

要解決此問題,我必須修改我的代碼。

這是我的Objective-C代碼:

CGPoint points[2]; 
points[0] = CGPointMake(100, 100); 
points[1] = CGPointMake(160, 110); 

SKShapeNode *line1=[SKShapeNode shapeNodeWithPoints:points count:2]; 
line1.lineWidth = 2.0; 
line1.zPosition = -1; 
[email protected]"line"; 
SKShader *myShader=[SKShader shaderWithFileNamed:@"shader1.fsh"]; 
float my_length=hypotf(points[1].x-points[0].x, points[1].y-points[0].y); 
[email protected][[SKUniform uniformWithName:@"u_my_length" float:my_length]]; 
line1.strokeShader=myShader; 
[self addChild:line1]; 

這是着色器:

void main(){  

gl_FragColor=vec4(1.0*(1.0-(v_path_distance/u_my_length)),1.0*(v_path_distance/u_my_length),0.,1.0); 

} 
相關問題