2016-11-05 19 views
3

iPad用アプリケーションとiOS 10を作成しています。 Objective-CとSpriteKitを使用しています。ある色から別の色へSKShapeNode線の色勾配を描きます。

1つの色で始まり、別の色で終わる線を描画する必要があります(たとえば、赤から緑へ)。

これは私の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にバッファリングバインディングがありません。'

は、それはあなたがこの問題を解決することができます

iOSの10で動作しませんu_path_lengthとv_path_distanceのように見えますか? 問題の別の解決方法を提案できますか?

+0

これはいくつかの方法で助けることができるかどうか分からない、またはそれは、パフォーマンスに影響しますあなたのケース:http://stackoverflow.com/q/34422374または、あなたはこれを見ることができます:http://stackoverflow.com/a/36261550/3402095 – Whirlwind

+0

@Whirlwindあなたの提案をありがとうございますが、あなたがリンクしたソリューションは、テクスチャとして使用することができる画像を作成します。問題は、SKShapeNodeがテクスチャ(テクスチャサイズを制御できない)でうまく動作しないことです。シェーダを使用したいのです。 これらの行の多くを画面に描画する必要があります(少なくとも100)。現時点では、私はシェイダー(私の意見では最高のソリューション)またはSKSpriteNodeで資産(私はすでに作業コードを持っている)からの画像でSKShapeNodeを使用することを考えています。 – danyadd

+0

理想的には、1つのSKShapeNodeが1回の描画呼び出しを必要とするため、SKShapeNodeを使用しないでください。つまり、あなたはすぐにパフォーマンスの問題にぶつかるかもしれません。バッチで描くことができるSKSpriteNodeとは異なり、SKShapeNodesはドキュメント内で指されているように、控えめに使用することはできません。だから私は個人的にそれが10-15以上のインスタンスが同時に画面上にあることができればそれを避けるだろう。 – Whirlwind

答えて

1

Info.plistファイルでbool値がYESのPrefersOpenGLキーを追加すると、エラー(Metal関連)が消えます。 もちろん、私のアプリケーションではMetalは使用されません。 これはiOS 10のバグだと思います。

私は別の問題に直面しました.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); 

} 
関連する問題