2016-09-24 4 views
0

多くのスプライトをレンダリングしたいので、シェーダーを使用して各スプライトに色を付ける(レインボーエフェクトの場合)必要があります。 (スプライトのテクスチャは最初はグレースケールで表示されています)SpriteBatchと頂点カラーを使用してスプライトごとに色を設定しますか?

最初に、シェーダの外で計算した色を渡したユニフォームでそれを行いました。それは問題なく動作しましたが、遅すぎました。

私はフレームごとにそのユニフォームを何度も設定していたので、遅すぎることがわかりました。私は、次を発見した:

https://gamedev.stackexchange.com/questions/83145/set-color-by-uniform-per-sprite-using-libgdx-spritebatch

[...] OpenGLでスプライトが簡単に頂点カラーを定義することによって行うことができる着色します。この場合の頂点はSpriteBatch.draw()で定義されているため、SpriteBatch.setColor()で色合いを設定する必要があります。 [...]

そして、私はそうしてみました:(レンダリングで

):

 batch.setShader(shader); 
     batch.setColor(.5f, .3f, 1, 1); 
     sprite.draw(batch); 
     batch.setColor(1, 1, 1, 1); 
     batch.setShader(null); 

頂点シェーダ:

void main() { 
v_color = a_color; 
v_texCoords = a_texCoord0; 
gl_Position = u_projTrans * a_position; 
} 

フラグメントシェーダ:

void main() { 
    v_color = a_color*gl_Color*2.0; 
    gl_FragColor = v_color * texture2D(u_texture, v_texCoords); 
} 

私はGLSLシェーダに精通していないので、今は何も描画していないのかもしれません。私は何かが不足していると思うし、私は何を理解することができません。

色でスプライトの色合いを変更するにはどうすればよいですか?それは速く動作するように?

+0

カスタムシェーダは必要ありません。デフォルトのSpriteBatchシェーダはすでに色味付けをサポートしています。 – Xoppa

答えて

1

SpriteクラスとTextureRegionクラスには大きな違いがあります。スプライトは独自の頂点データを格納するため、SpriteBatchではなくスプライト上でsetColorを呼び出して色付けします。スプライトは、バッチに設定されている色を無視します。テクスチャとTextureRegionsは、バッチに設定されている最新の色を使用します。

また、フラグメントシェーダで頂点属性変数を使用することはできません。すでにa_colorを頂点シェーダのv_colorにコピーしているので、フラグメントシェーダでv_colorを使用しています。 gl_Colorで何をしようとしているのか分かりません。

+0

申し訳ありません! – red1575

関連する問題