私はある種のゲームフレームワークに取り組んでおり、OpenGLの初心者です。ほとんどの本はこの質問にひどく明確な答えを与えていないようで、OpenGLを使用して自分のデスクトップで開発したいのですが、OpenGL ES 2.0環境でコードを実行します。私の質問は2つあります:
私が最後にES作業を行ってから約3年になります。そのため、私は時代遅れであるか、単にいくつかのことを誤って覚えているだけかもしれません。
いいえ、ESはサブセットであるため、OpenGLデスクトップをターゲットにすることは、OpenGL ESをターゲットにすることとは異なります。 ESはイミディエイトモード関数(glBegin()
/glEnd()
、glVertex*()
、...)を実装していません。頂点配列は、パイプラインにデータを送信する主な方法です。
さらに、対象とするプロファイルによって異なります。少なくともLiteプロファイルでは、ESは浮動小数点関数を実装する必要はありません。代わりに、固定小数点関数を取得します。最初の16ビットが小数点の前の桁を意味し、次の16ビットが小数点の後の桁を意味する32ビット整数と考えてください。
つまり、単純なコードmightでも、浮動小数点数を使用している場合は移植できません(gl*f()
関数への呼び出しを次のように置き換える必要があります) gl*x()
関数の呼び出し。
Trolltechの例 (具体的には_qtwidget.cpp
_ファイル;これはQtの例ですが、それでも...)でこの問題を解決する方法を参照してください。あなたは彼らがこの電話をかけるのを見るでしょう:
q_glClearColor(f2vt(0.1f), f2vt(0.1f), f2vt(0.2f), f2vt(1.0f));
これは、glClearColorf()の呼び出しを置き換えることを目的としています。さらに、マクロf2vt()
を使用します-意味floatから頂点タイプ-自動的に引数をfloatから正しいデータタイプに変換します。
3年前に企業向けにいくつかの小さなデモを開発していましたが、 PowerVRのSDK での作業に成功しました。 WindowsでのVisual C++用です。 Linuxで試したことはありません(会社のPCで作業していたので必要ありません)。
ESでの最近の経験を反映する小さな更新。 (2011年6月7日)
glBegin()
/glEnd()
を頂点配列に置き換えますglClearColor()
などの関数の一部の呼び出しをglClearColorf()
などの呼び出しに置き換えます新しいガジェットが使用するOpenGL ES 2.0では、古い固定関数パイプラインがなくなっているため、独自の頂点シェーダーとフラグメントシェーダーも提供する必要があります。これは、シェーディング計算などを自分で行う必要があることを意味します。これはかなり複雑になりますが、GLSLチュートリアルに既存の実装を見つけることができます。
それでも、GLESはデスクトップOpenGLのサブセットであるため、両方のプラットフォームで同じプログラムを実行できます。
私の理解では、OpenGL ESはOpenGLのサブセットです。 glBegin()やglEnd()のようなイミディエイトモードのものを使用しない場合は、問題ないはずです。過去数か月の間にOpenGLをあまり使用していませんが、ES 1.0で作業しているとき、glBegin/glEndを使用しない限り、標準のOpenGLから学んだすべてのコードが機能しました。
IPhoneシミュレーターがOpenGL ESコードを実行することは知っています。 Android 1つについてはわかりません。
これは Windowsエミュレータです
オプション3)Qtなどのライブラリを使用して、組み込みのラッパー関数を使用してOpenGLコードを処理できます。これにより、OpenGLに1つのコードベース(または最小限のコードベース)を使用して、ほとんどすべてのプラットフォームでビルドするオプションが提供されます。サポートするプラットフォームごとに移植する必要はありません。 Qtは、使用する関数に基づいてOpenGLコンテキストを選択することもできます。