web-dev-qa-db-ja.com

OpenGLとOpenGL ES 2.0-OpenGLアプリケーションを簡単に移植できますか?

私はある種のゲームフレームワークに取り組んでおり、OpenGLの初心者です。ほとんどの本はこの質問にひどく明確な答えを与えていないようで、OpenGLを使用して自分のデスクトップで開発したいのですが、OpenGL ES 2.0環境でコードを実行します。私の質問は2つあります:

  1. デスクトップでOpenGLのフレームワークをターゲットにした場合、OpenGL ES 2.0環境で変更せずに実行できますか?
  2. そうでない場合は、PCまたはMacに優れたエミュレータがあります。 OpenGLコードをOpenGL ESコードに変換する、または機能しないものにフラグを立てる、実行可能なスクリプトはありますか?
42
Heat Miser

私が最後にES作業を行ってから約3年になります。そのため、私は時代遅れであるか、単にいくつかのことを誤って覚えているだけかもしれません。

  1. いいえ、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から正しいデータタイプに変換します。

  2. 3年前に企業向けにいくつかの小さなデモを開発していましたが、 PowerVRのSDK での作業に成功しました。 WindowsでのVisual C++用です。 Linuxで試したことはありません(会社のPCで作業していたので必要ありません)。


ESでの最近の経験を反映する小さな更新。 (2011年6月7日)

  • 今日のプラットフォームはおそらくLiteプロファイルを使用しないので、おそらく固定小数点10進数について心配する必要はありません。
  • モバイル(例:iOS)にデスクトップコードを移植するときは、おそらくこれらの作業を主に行う必要がありますが、それ以外はそれほどではありません。
    • glBegin()/glEnd()を頂点配列に置き換えます
    • glClearColor()などの関数の一部の呼び出しをglClearColorf()などの呼び出しに置き換えます
    • ウィンドウと入力システムを書き直す
    • openGL ES 2.0をターゲットにしてシェーダー機能を取得する場合は、 持ってる 固定機能パイプラインの組み込み動作をシェーダーで完全に置き換える-少なくとも固定機能パイプラインを再実装する基本的なもの
  • 本当に重要です。モバイルシステムがメモリに制約がない場合を除き、グラフィックチップにテクスチャ圧縮を使用することを検討する必要があります。たとえば、iOSデバイスでは、PVRTC圧縮されたデータをチップにアップロードします
41
Ivan Vučica

新しいガジェットが使用するOpenGL ES 2.0では、古い固定関数パイプラインがなくなっているため、独自の頂点シェーダーとフラグメントシェーダーも提供する必要があります。これは、シェーディング計算などを自分で行う必要があることを意味します。これはかなり複雑になりますが、GLSLチュートリアルに既存の実装を見つけることができます。

それでも、GLESはデスクトップOpenGLのサブセットであるため、両方のプラットフォームで同じプログラムを実行できます。

4
Tronic

デスクトップとESの間でGL翻訳を提供する2つのプロジェクトを知っています。

  • glshim :1.xサポートへの実質的な固定パイプライン、基本的なES 2.xサポート。

  • Regal :ES 2.xのすべて。

4
lunixbochs

私の理解では、OpenGL ESはOpenGLのサブセットです。 glBegin()やglEnd()のようなイミディエイトモードのものを使用しない場合は、問題ないはずです。過去数か月の間にOpenGLをあまり使用していませんが、ES 1.0で作業しているとき、glBegin/glEndを使用しない限り、標準のOpenGLから学んだすべてのコードが機能しました。

IPhoneシミュレーターがOpenGL ESコードを実行することは知っています。 Android 1つについてはわかりません。

これは Windowsエミュレータです

3
Ronald

オプション3)Qtなどのライブラリを使用して、組み込みのラッパー関数を使用してOpenGLコードを処理できます。これにより、OpenGLに1つのコードベース(または最小限のコードベース)を使用して、ほとんどすべてのプラットフォームでビルドするオプションが提供されます。サポートするプラットフォームごとに移植する必要はありません。 Qtは、使用する関数に基づいてOpenGLコンテキストを選択することもできます。

0
steventaitinger