2012-03-09 25 views
11

私が読んだところでは、OpenGL ES 2.0はではありません。OpenGL 2.1のような何かです。OpenGL ES 2.0とOpenGL 3との類似点と相違点

私が知りたいことは、OpenGL 3がOpenGL ES 2.0に匹敵するかどうかです。言い換えれば、私はデスクトップとAndroidの両方のためのゲームエンジンを作ろうとしているので、OpenGL 3.x +とOpenGL ES 2.0に関して特に気をつけなければならない違いはありますか?

これには、OpenGL 4.xのバージョンも含まれます。

たとえば、私がthis本を読むことを開始したら、エンジンをAndroidに移植する予定がある場合は時間を無駄にします(もちろんNDKを使用します))?

答えて

20

私が読んだところでは、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に簡単に適用する方法を理解することができます。

+0

完璧な - ちょうど私が必要なもの。ありがとうございました。 :) – zeboidlund

+0

レイアウト修飾子は実際にはES 2.0で利用可能です。 GLSLで "#extension GL_EXT_separate_shader_objects:enable"を指定する必要がありますが、引き続き "in"ではなく "attribute"を使用します。 –

+1

@NicolBolasが間違っています。この仕様では、「ARB_explicit_attrib_location機能のタックスも」と明記されています – Speed

1

OpenGL ES 2.0(および3.0)は、ほとんどがデスクトップOpenGLのサブセットです。

最も大きな違いは、ESには従来の固定機能パイプラインがないことです。固定機能パイプラインとは何ですか? GLSLでgl_Vertexgl_Normalgl_Colorgl_MultiTexCoordgl_FogCoordgl_ModelViewMatrixなどの固定機能のデータにアクセスする変数のいずれかを使用してなどglVertexglColorglNormalglLightglPushMatrixglPopMatrixglMatrixMode、と関係することは何も...固定機能パイプラインからのさまざまな他の行列。

これらの機能のいずれかを使用している場合は、あなたのためにいくつかの作業が必要になります。 OpenGL ES 2.0と3.0は単純なシェーダです。あなたには「3d」は提供されません。すべての投影、ライティング、テクスチャ参照などを自分で書く必要があります。

もしあなたがすでにそうしているのであれば(ほとんどの現代のゲームがそうするでしょうが)、あまり仕事をしていないかもしれません。一方、あなたが私の経験から非常に非常に一般的です(ほとんどのチュートリアルはまだそのものを使用する)それらの古い非推奨のOpenGLの機能を使用している場合。その後、あなた自身でそれらの機能を再現しようとすると、あなたは少しだけ仕事をしています。

オープンソースライブラリregalがあります。これはNVidiaによって開始されたと思います。それはそのものを再現するはずです。固定機能システム全体がかなり非効率であったことに注意してください。これは非難された理由の1つですが、迅速に作業を進めるための方法かもしれません。

関連する問題