1

私はこのクールなraywenderlichチュートリアルからOpenGLES2.0シェーダーを研究していますが、なぜスプライトには4つの頂点があると言われているのか疑問に思いました。頂点が4つを超える場合はありますか?

ばかげているように聞こえますが、スプライトの表示部分の境界を形成するには、必要な数の頂点が必要であると予想していました。言い換えれば、アルファチャネルはスプライトを区切る方法だと思いました。

次に、ゲームで弾丸の衝突方法を確認し(テンプレートを使用して開始しました)、スプライトの境界ボックスを使用します。ボックスは4つの頂点を意味します:)なので、私は驚かないでください。しかし、それでも、私はCocos2Dが目に見えないピクセルを検出する方法を持っていることを期待していました。

誰かが私がこれをもう少し明確にするのを手伝ってもらえますか?可視ピクセルのみを検出する弾丸衝突検出を行う方法は他にもありますか?[いくつかの答えを見つけましたが、受け入れられず、多くの手順を踏むようです。Cococs2dメソッドが組み込まれている可能性があると思いました]。

それとも、OpengGL ES 2.0でシェーダーを学習した後、これを理解する必要がありますか?

4

1 に答える 1

4

スプライトは画面に表示されるテクスチャであり、スケーリング、回転、位置、色などのプロパティが適用されています。

テクスチャはメモリ内の画像であるため、長方形です。長方形を描くには、4つの頂点が必要です。歴史的に、GPUは、ハードウェアに実装するのが最も簡単だったため、4乗の2の累乗テクスチャでのみ機能していました。後のテクスチャは任意の長方形にすることができ、最新のiOSデバイス(iPhone 3GSだと思います)では、NPOTテクスチャ(2の累乗ではない)を使用することもできます。しかし、全体として、テクスチャは常に長方形です。

テクスチャを部分的に透明にするために、アルファチャネルがあります。これは、ピクセルの透明度を制御することを除けば、3つのRGBチャネルの1つと同じように機能します。一部のテクスチャフォーマットでは、アルファチャネルはオンまたはオフ(1ビットアルファ)のみを保存します。

そのため、GPUがテクスチャを画面にレンダリングするときに、関連するアルファ値が0のすべてのピクセルがまったく描画されず、背景のピクセルが透けて見えるようになります。

衝突ポリゴンを取得するために画像の表示部分をトレースするには、比較的複雑なアルゴリズムを実行する必要があります。たとえば、PhysicsEditorはこのようなメカニズムを使用して、画像から物理衝突情報を生成します(0:15のビデオを参照)。

GPUは、次の理由でその手法を使用しません。

  • 最初のトレースにはコストがかかります
  • 結果のポリゴンは複雑になります(100以上の頂点)
  • ポリゴンの複雑さは画像によって大きく異なり、レンダリングの最適化が困難になります。

基本的に、可視ピクセルのみを検索、保存、レンダリングすることに集中するよりも、テクスチャ全体を調べて0アルファピクセルをレンダリングしない方がはるかに簡単で高速です。

于 2012-08-11T13:28:28.857 に答える