私が読んだところでは、OpenGL ES 2.0はOpenGL 2.1のようなものではありません。
"それは何もそうではありません"と定義します。デスクトップGL 2.1には、ES 2.0にはない一連の機能があります。しかし、両方で動作する2つのサブセットのほとんどが共通しています(ただし、テクスチャ画像の読み込みには注意が必要ですが、そこには大きな違いがあります)。
デスクトップGL 3.xには、拡張されていないES 2.0ではない多くの機能が用意されています。 Framebufferオブジェクトは3.xではコアですが、2.0では拡張されています(さらに、別の拡張機能を持たずに1つの宛先イメージしか取得できません)。変換フィードバック、整数テクスチャ、均一バッファオブジェクト、ジオメトリシェーダがあります。これらはすべて、ES 2.0で利用できない、または拡張機能を介してのみ利用可能な特定のハードウェア機能です。プラットフォーム固有のものもあります。
でも、デスクトップGL 3.xで使用できるAPIの便利な機能がいくつかあります。私はこの本を読み始めた場合、私は、Androidに移植するエンジンを計画している場合たとえばなど、明示的な属性の場所(layout(location=#)
)、VAOs、
は、私が(もちろんNDKを使用して;)私の時間を無駄にしていますか)?
これはむしろ、あなたが何をしようとしているのか、それを動作させるために準備していることによって決まります。少なくとも、OpenGL ES 2.0が何をするのかを読んで、デスクトップGLとどのように違うのかを知る必要があります。
実際のハードウェア機能を避けるのは簡単です。テクスチャ(または複数のテクスチャ)へのレンダリングは、あなたのアルゴリズムによって必要とされるものです。変換フィードバック、ジオメトリシェーダなどです。どのくらい必要なのかは、実行しようとしていることに依存しており、アルゴリズムによっては選択肢がある場合もあります。
キャッチされる可能性が高いのは、の便利なデスクトップGL 3.xの機能です。例:
layout(location = 0) in vec4 position;
これはES 2.0では不可能です。同様の定義は次のようになります。
attribute vec4 position;
ES 2.0をで動作しますが、それはないposition
属性原因は属性インデックス0に関連付けられるだろう。これは、プログラムがリンクされる前にglBindAttribLocation
を使用してコードで行わなければなりません。デスクトップGLもこれを可能にしますが、あなたがリンクした本はそれをしません。明らかな理由から(これは3.3版の本であり、古いバージョンのGLとの互換性を維持しようとするものではない)。
均一バッファは別です。本書では、特に共有のパースペクティブマトリックスの場合には、リベラルを使用しています。これは簡単で効果的なテクニックです。しかし、ES 2.0にはその機能はありません。それはプログラムごとのユニフォームしか持っていません。
この場合も、必要に応じて共通のサブセットにコードすることができます。つまり、明示的な属性の場所、均一なバッファ、頂点配列オブジェクトなどを使用して意図的に捨てることができます。しかし、その本はちょうどあなたがそれをするのを助けるつもりはありません。
あなたの時間は無駄でしょうか?さて、この本はOpenGL 3.3 APIを教えるためのものではありません(それはそうしていますが、それは意味がありません)。この本はあなたにグラフィックスプログラミングを教えてくれます。 3.3 APIを使用するだけです。ハードウェアベースのものを除いて、そこで学ぶスキルは、使用しているAPIやシステムにシェーダを使用して転送されます。
このようにすれば、グラフィックスのプログラミングがあまりよくわからない場合は、どのAPIを使用して学習しても問題ありません。概念をマスターしたら、さまざまなドキュメントを読んで、それらの概念を新しいAPIに簡単に適用する方法を理解することができます。
完璧な - ちょうど私が必要なもの。ありがとうございました。 :) – zeboidlund
レイアウト修飾子は実際にはES 2.0で利用可能です。 GLSLで "#extension GL_EXT_separate_shader_objects:enable"を指定する必要がありますが、引き続き "in"ではなく "attribute"を使用します。 –
@NicolBolasが間違っています。この仕様では、「ARB_explicit_attrib_location機能のタックスも」と明記されています – Speed