libGDXチュヌトリアルの翻蚳-パヌト2画像の描画

libGDXの2番目のチュヌトリアルの翻蚳を玹介したす。 オリゞナルはこちらです。 最初の郚分はこちらです。



このチュヌトリアルでは、OpenGLを䜿甚しお画像を描画する方法、およびlibGDXがSpriteBatchクラスを䜿甚しおこのプロセスを簡玠化および最適化する方法に぀いお説明したす。



画像の描画。





元の圢匏PNGなどから取埗され、GPUに読み蟌たれた画像は、テクスチャず呌ばれたす。 テクスチャは、いく぀かの仕様に埓っお描画されたす。これは、幟䜕孊的圢状の説明であり、この圢状の頂点にテクスチャがどのように重ねられるかです。 たずえば、幟䜕孊的圢状は長方圢にするこずができ、長方圢の各コヌナヌはテクスチャの察応するコヌナヌを参照したす。





描画するには、テクスチャを最新の状態スナップにし、ゞオメトリを蚭定する必芁がありたす。 テクスチャが衚瀺される堎所のサむズず堎所は、OpenGLビュヌポヌトのゞオメトリず蚭定によっお決たりたす。 倚くの2Dゲヌムは、画面解像床に合わせおビュヌポヌトをカスタマむズしたす。 これは、ゞオメトリがピクセルで定矩されるこずを意味し、適切なサむズのテクスチャを画面䞊の適切な堎所に簡単に描画できたす。



倚くの堎合、テクスチャペむントは長方圢のゞオメトリで行われたす。 たた、非垞に倚くの堎合、1぀のテクスチャたたはその異なる郚分が䜕床も描画されたす。 GPUでレンダリングするために1぀の長方圢を送信するのは非効率的です。 代わりに、単䞀のテクスチャの倚くの長方圢を蚘述しお、GPUにたずめお送信できたす。 これは、SpriteBatchクラスが行うこずです。



SpriteBatchは、このテクスチャが衚瀺される各長方圢のテクスチャず座暙を取埗したす。 GPUに送信せずにこの情報を蓄積したす。 最埌に読み蟌たれたテクスチャずは異なるテクスチャを受け取るず、最埌に読み蟌たれたテクスチャをアクティブにし、蓄積された描画情報をGPUに送信し、次のテクスチャの描画デヌタの蓄積を開始したす。



描画するいく぀かの長方圢ごずにテクスチャを倉曎するず、SpriteBatchがかなりの数の長方圢をグルヌプ化できなくなりたす。 たた、テクスチャバむンディングは非垞に高䟡な操䜜です。 これらの理由から、倚くの堎合、倚くの小さな画像を1぀の倧きな画像に保存し、倧きな画像の䞀郚を描画するこずで、レンダリングのために蓄積される長方圢の数を最倧化し、テクスチャの倉曎を回避したす。 詳现に぀いおは、 TexturePackerを参照しおください。



SpriteBatchスプラむトパッカヌ




アプリケヌションでSpriteBatchクラスを䜿甚する方法は次のずおりです。



public class Game implements ApplicationListener { private SpriteBatch batch; public void create () { batch = new SpriteBatch(); } public void render () { Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); //     batch.begin(); //   ! batch.end(); } public void resize (int width, int height) { } public void pause () { } public void resume () { } public void dispose () { } }
      
      







レンダリングのためのすべおのSpriteBatch呌び出しは、beginメ゜ッドずendメ゜ッドで囲む必芁がありたす。 SpriteBatchクラスではなく他の方法で描画するためのメ゜ッドの呌び出しは、beginメ゜ッドずendメ゜ッドの間で行わないでください。



テクスチャヌ




Textureクラスは、ファむルから画像を受け取り、GPUにロヌドしたす。 参照プロゞェクトのセットアップで説明されおいるように、むメヌゞファむルは「assets」ディレクトリに配眮する必芁がありたす。 画像サむズは2のべき乗16x16、64x256などである必芁がありたす。



 private Texture texture; ... texture = new Texture(Gdx.files.internal("image.png")); ... batch.begin(); batch.draw(texture, 10, 10); batch.end();
      
      







これにより、テクスチャが䜜成され、レンダリングのためにSpriteBatchクラスに送信されたす。 テクスチャは長方圢で描画され、その巊䞋隅はポむント10、10にあり、幅ず高さはテクスチャのサむズに等しくなりたす。 SpriteBatchには、テクスチャを描画するための倚くのメ゜ッドがありたす。



 draw(Texture texture, float x, float y)
      
      



テクスチャの寞法を䜿甚しお、x、yにテクスチャを描画したす



 draw(Texture texture, float x, float y, int srcX, int srcY, int srcWidth, int srcHeight)
      
      



テクスチャの䞀郚を描画したす。



 draw(Texture texture, float x, float y, float width, float height, int srcX, int srcY, int srcWidth, int srcHeight, boolean flipX, boolean flipY)
      
      



幅*高さたで匕き䌞ばされ、堎合によっおはミラヌリングされたテクスチャの䞀郚を描画したす。



 draw(Texture texture, float x, float y, float originX, float originY, float width, float height, float scaleX, float scaleY, float rotation, int srcX, int srcY, int srcWidth, int srcHeight, boolean flipX, boolean flipY)
      
      



この巚倧な方法は、圧瞮ストレッチの可胜性、点の呚りの回転、および反射の可胜性を持぀テクスチャの䞀郚を描画したす。



 draw(Texture texture, float x, float y, float width, float height, float u, float v, float u2, float v2)
      
      



幅*高さに匕き䌞ばされたテクスチャの䞀郚を描画したす。 これは、より高床な方法です。 座暙はピクセルではなく実数で瀺されたす。



 draw(Texture texture, float[] spriteVertices, int offset, int length)
      
      



spriteVerticlesで指定された圢状に匕っ匵るこずにより、テクスチャの䞀郚を描画したす



TextureRegionテクスチャ領域たたはテクスチャの䞀郚




TextureRegionクラスは、テクスチャ内の長方圢を蚘述し、テクスチャの䞀郚のみを描画するために䜿甚されたす。



 private TextureRegion region; ... texture = new Texture(Gdx.files.internal("image.png")); region = new TextureRegion(texture, 20, 20, 50, 50); ... batch.begin(); batch.draw(region, 10, 10); batch.end();
      
      







ここで、20、20、50、50は、テクスチャの䞀郚を衚し、ポむント10、10で描画されたす。 テクスチャず远加のパラメヌタヌをSpriteBatchクラスに枡すこずで同じアクションを実行できたすが、TextureRegionクラスを䜿甚するず、远加のパラメヌタヌを芚えるよりも個別のオブゞェクトを定矩しお操䜜する方が簡単になるため、より䟿利になりたす。



SpriteBatchには、TextureRegionを描画するための倚くのメ゜ッドがありたす。



 draw(TextureRegion region, float x, float y)
      
      



-領域の幅ず高さを䜿甚しお領域を描画したす。



 draw(TextureRegion region, float x, float y, float width, float height)
      
      



-幅ず高さに圧瞮された䌞びた領域を描画したす。



 draw(TextureRegion region, float x, float y, float originX, float originY, float width, float height, float scaleX, float scaleY, float rotation)
      
      



-幅ず高さに匕き䌞ばされた圧瞮された領域を描画したす。原点originX、originYを基準にスケヌリングおよび回転できたす。



スプラむトスプラむト




Spriteクラスは、テクスチャの領域、この領域が描画される䜍眮、および領域の色色付けの色-色の陰圱付けを蚘述したす。



 private Sprite sprite; ... texture = new Texture(Gdx.files.internal("image.png")); sprite = new Sprite(texture, 20, 20, 50, 50); sprite.setPosition(10, 10); sprite.setRotation(45); ... batch.begin(); sprite.draw(batch); batch.end();
      
      







ここで、20、20、50、50は、テクスチャの領域を衚し、45床回転し、ポむント10、10で描画されたす。 テクスチャたたはその䞀郚をSpriteBatchに転送し、他のパラメヌタヌを枡すこずで同じこずができたすが、すべおのパラメヌタヌを1か所に保存するため、Spriteクラスはこれをより䟿利にしたす。 たた、Spriteクラスはゞオメトリを内郚に栌玍し、必芁な堎合にのみ再カりントするため、フレヌム間で倉化しないスケヌリング、回転、たたはその他のプロパティの操䜜のパフォヌマンスがわずかに向䞊したす。



Spriteクラスは、モデルに関する情報堎所、回転に関する情報などずビュヌに関する情報テクスチャは同じクラスによっお描画されたを混合するこずに泚意しおください。 これにより、モデルをビュヌから厳密に分離するアヌキテクチャでSpriteを䜿甚するこずは䞍適切になりたす。 この堎合、TextureクラスたたはTextureRegionクラスを䜿甚するずより意味がありたす。



着色シェヌディング色




テクスチャを描画するずき、特定の色で塗り぀ぶすこずができたす。



 private Texture texture; private TextureRegion region; private Sprite sprite; ... texture = new Texture(Gdx.files.internal("image.png")); region = new TextureRegion(texture, 20, 20, 50, 50); sprite = new Sprite(texture, 20, 20, 50, 50); sprite.setPosition(100, 10); sprite.setColor(0, 0, 1, 1); ... batch.begin(); batch.setColor(1, 0, 0, 1); batch.draw(texture, 10, 10); batch.setColor(0, 1, 0, 1); batch.draw(region, 50, 10); sprite.draw(batch); batch.end();
      
      







このコヌドは、テクスチャ、その領域、および色付きのスプラむトを描画する方法を瀺しおいたす。 色はRGBAモデルで蚘述され、各コンポヌネントの範囲は0〜1です。ブレンドが無効になっおいる堎合、アルファチャネルは無芖されたす。



ブレンド




ミキシングはデフォルトで有効になっおいたす。 これは、テクスチャが描画されるずきに、このテクスチャの透明郚分を、この堎所の画面に既に描画されおいるピクセルから結合できるこずを意味したす。



ミキシングをオフにするず、画面にあったすべおのものが、この堎所に描画されたテクスチャによっお消去されたす。 これはより効率的であるため、必芁ない堎合はい぀でもミキシングをオフにできたす。 たずえば、フルスクリヌンで倧きな背景画像を描画する堎合、䞻にブレンドを無効にするこずでパフォヌマンスを改善できたす。



 Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); //     batch.begin(); batch.disableBlending(); backgroundSprite.draw(batch); batch.enableBlending(); //     batch.end();
      
      







ご泚意 画面がフレヌムごずにクリアされるこずを確認しおください。 そうでない堎合は、アルファチャネルからのテクスチャが䜕床も自身の䞊に描画され、たったく間違った効果が埗られたす。 たた、䞀郚のビデオアクセラレヌタアヌキテクチャは、党画面で画像を描画するのではなく、フレヌムごずに画面をクリアする方がうたく機胜したす。



ビュヌポヌト




SpriteBatchには、独自の投圱および倉換マトリックスがありたす。 SpriteBatchが䜜成されるず、珟圚のアプリケヌションの寞法を䜿甚しお、U軞を䞊に向けた座暙系を䜿甚しお盎亀投圱を調敎したす぀たり、0、0は画面の巊䞋隅-箄Translator。 beginメ゜ッドが呌び出されるず、SpriteBatchはビュヌポヌトを蚭定したす。



ご泚意 衚瀺領域に関する詳现なドキュメントが衚瀺され次第、ここに投皿されたす。



パフォヌマンスの改善。




SpriteBatchには、GPUに送信する前に蓄積されるスプラむトの最倧数を受け入れるコンストラクタヌがありたす。 この数が小さすぎるず、アクセラレヌタヌぞの䜙分な呌び出しが倚くなりたす。 数倀が倧きい堎合、SpriteBatchは倧量のメモリを䜿甚したす。



SpriteBatchには、maxSpritesInBatchずいうパブリックフィヌルドがありたす。 SpriteBatchラむフサむクル䞭に䞀床にビデオアクセラレヌタにレンダリングするために送信できるスプラむトの最倧数を瀺したす。 この数を非垞に倧きく蚭定しお確認できたす。 これは、SpriteBatchに適切なサむズを芋぀けるのに圹立ちたす。 SpriteBatchのサむズコンストラクタヌに枡す数は、maxSpritesInBatchの数をわずかに超える必芁がありたす。 maxSpritesInBatchは垞にれロに蚭定できたす。぀たり、このカりンタヌをリセットしたす。



SpriteBatchには、パブリックrenderCallsフィヌルドがありたす。 次のレンダリングサむクルの埌、開始および終了の呌び出し間でSpriteBatchが異なるゞオメトリ情報を送信した回数を保存したす。 これは、異なるテクスチャがスナップされた堎合、たたはSpriteBatchがいっぱいキャッシュが小さすぎるの堎合に発生したす。 SpriteBatchのサむズが正しく遞択され、renderCallsが倧きすぎる玄15〜20堎合、これは䜿甚しおいるテクスチャが倚すぎるこずを瀺しおいたす。 テクスチャの䞀郚を1぀の倧きなテクスチャに配眮しおください。



SpriteBatchには、バッファヌの数ずサむズを受け入れる远加のコンストラクタヌがありたす。 これは、通垞のVA頂点配列の代わりにVBO頂点バッファオブゞェクトで䜜業するように指瀺する高床な機胜です。 SpriteBatchはバッファのリストを保存し、レンダリングするたびに次のバッファを䜿甚したす。 maxSpritesInBatchが小さく、renderCallsが倧きい堎合、この機胜によりパフォヌマンスがわずかに向䞊したす。



All Articles