44

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

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

5 に答える 5

41

最後に ES 作業を行ってから約 3 年が経過しているため、時代遅れであるか、単にいくつかのことを間違って覚えている可能性があります。

  1. いいえ、ES はサブセットであるため、デスクトップ用の OpenGL をターゲットにすることは、OpenGL ES をターゲットにすることと同じではありません。glBegin()ES は即時モード関数 ( / glEnd()、 、...)を実装していませんglVertex*()。頂点配列は、パイプラインにデータを送信する主な方法です。

    さらに、対象とするプロファイルによって異なります。少なくとも Lite プロファイルでは、ES は浮動小数点関数を実装する必要はありません。代わりに、固定小数点関数を取得します。最初の 16 ビットが小数点の前の数字を意味し、次の 16 ビットが小数点の後の数字を意味する 32 ビット整数を考えてください。

    つまり、フロートを使用する場合、単純なコードでも移植できない可能性gl*f()があります (関数の呼び出しを関数の呼び出しに置き換える必要がありgl*x()ます。

    Trolltech の例(具体的にはqtwidget.cppファイル。これは Qt の例ですが、それでも...)でこの問題を解決する方法を確認してください。あなたは彼らがこの電話をかけるのを見るでしょう:

    q_glClearColor(f2vt(0.1f), f2vt(0.1f), f2vt(0.2f), f2vt(1.0f));

    これは、glClearColorf() への呼び出しを置き換えることを意図しています。さらに、引数を float から正しいデータ型に自動的に変換するマクロ( float から vertex 型をf2vt()意味する) を使用します。

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


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

  • 現在のプラットフォームはおそらく Lite プロファイルを使用していないため、固定小数点数について心配する必要はありません。
  • デスクトップ コードをモバイル (iOS など) に移植する場合、おそらく主に次のことを行う必要があります。
    • glBegin()/glEnd()を頂点配列に置き換える
    • glClearColor()などの関数への呼び出しを、次のような呼び出しに置き換えます。glClearColorf()
    • ウィンドウと入力システムを書き直します
    • OpenGL ES 2.0 をターゲットにしてシェーダー機能を取得する場合、固定機能パイプラインの組み込み動作をシェーダーに完全に置き換える必要があります。少なくとも、固定機能パイプラインを再実装する基本的なものです。
  • 非常に重要: モバイル システムがメモリに制約されていない限り、グラフィック チップにテクスチャ圧縮を使用することを検討する必要があります。たとえば、iOS デバイスでは、PVRTC で圧縮されたデータをチップにアップロードします。
于 2009-07-25T11:08:18.097 に答える
4

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

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

于 2010-01-18T04:48:19.403 に答える
3

私の理解では、OpenGLESはOpenGLのサブセットです。glBegin()やglEnd()のような即時モードのものの使用を控えるなら、大丈夫だと思います。過去数か月間、OpenGLをあまり使用していませんが、ES 1.0を使用しているときは、glBegin / glEndを使用しない限り、標準のOpenGLから学習したすべてのコードが機能しました。

iPhoneシミュレーターがOpenGLESコードを実行していることは知っています。Androidのものについてはよくわかりません。

これがWindowsエミュレーターです。

于 2009-07-24T18:20:01.450 に答える