3D OpenGL / DirectXの世界は初めてで、OpenGL 4.1とGLSLの仕様が本日リリースされたことがわかりました。
私の友人がOGL v2.1のレッドブックをくれましたが、私が読んだ限りでは、3.xと4.xは2.xとは大きく異なり、多くのものが非推奨になりました。
この本を使用して3DおよびCGの基本を学習し始めることはできますか、それとも新しいコピーを見つける方が良いですか
3D OpenGL / DirectXの世界は初めてで、OpenGL 4.1とGLSLの仕様が本日リリースされたことがわかりました。
私の友人がOGL v2.1のレッドブックをくれましたが、私が読んだ限りでは、3.xと4.xは2.xとは大きく異なり、多くのものが非推奨になりました。
この本を使用して3DおよびCGの基本を学習し始めることはできますか、それとも新しいコピーを見つける方が良いですか
回答:
このような時代では、私はいつもスチームハードウェアの調査に向かう:http://store.steampowered.com/hwsurvey/ -あなたはDX10 / 11クラスのシステムの市場浸透のほぼ80%であるが表示されます。これは、GL3.3以上とほぼ同等です。この80%はVista / 7ユーザーに制限されています-XPでDX10 / 11 GPUを追加すると、90%を超えます。
ここでは少し筋金入りのゲーマーについて話していることに留意して、ターゲットオーディエンスについて考え始める必要があります。これらはあなたがターゲットにしたい人ですか?代わりに、より下位のハードウェアを備えたものを目指していますか?Intelグラフィックスはどうですか?MacとLinuxのユーザーはどうですか?これらはすべてあなたが自分で答える必要がある質問なので、広く一般的なガイドラインが得られるでしょう。
それに加えて、何かを出荷する目的で今日学習し始めている場合、そこに着くまでに最低約1年の期間を見ているという事実を考慮する必要があります(話をしない限り)本当に些細な/単純なケースについて)。gfx機能の上昇傾向が続く中で、それまでにGL3.3 +ハードウェアの100%に近い取り込みを検討しています。
GL2.1以下では、GL2.1のシェーダーとVBOサブセットに制限されている場合でも、非常に多くのくだらない古いナンセンスを学習して使用することになります(ダウンレベルGLSLバージョンは使いにくい、およびストリーミングVBOs)はGL_ARB_map_buffer_rangeなく、すべてが、使用できない- GL3.3 +導入している多くのよりよい(そしてよりパフォーマンス)、あなたはプレイヤーのハードウェアの活用を作ることでしょう多くのものを処理する方法(と彼らはに感謝しますよ本当にあなたと協力したくないAPIと戦うのではなく、生産的なコードを書くのにより多くの時間を費やすことになります。
そしてもちろん、ドライバーの状況は恐ろしいものです。難しいが本当の事実は、WindowsのGLドライバーが残念な状態にあることです。NVはサポートすべきでないものをサポートし、AMDはサポートすべきものをサポートしません。Intelでは、GL機能に制限する必要があります。 D3Dの同等物。GL_VERSIONが新しいほど、ドライバのバグに遭遇する可能性が高くなりますが、GL3.3の場合、現在はかなり安定しています。
したがって、要約は、他の情報(ターゲットオーディエンスなど)がない場合、GL3.3をベースラインとしてターゲットにすることです(可能であれば、コードベースを混乱させない、より高いGL_VERSIONから機能をプルします)非常に具体的かつ明確に特定された理由が低くなる場合を除きます(そして、「しかし古いハードウェアを持っている人はどうですか」という漠然とした概念を使用するのではなく、そのことを完全に100%確信したいと思います)。後者の場合、GL2.1を下回ることはありません。その場合でも、できるだけ多くの3.x機能を取り入れたいと考えています。
2.1と3の交点に固執することをお勧めします。OpenGL2.1のみをサポートするハードウェアとドライバーはまだたくさんありますが、OpenGL 3コアが推奨するプラクティスの方が優れています。このチュートリアルは、始めるのに非常に適しています(3で非推奨になった機能のないOpenGL 2.0について説明します)。
私はそれが無駄ではないと言うでしょう。
どうして?さて、世界のその他の国はOpenGL 3.xおよび4.0をサポートしていますが、Mac OS XはまだOpenGL 2.1のみをサポートしています。また、すべてではありませんが、ほとんどのポータブルプラットフォームで使用されているOpenGL ESは、1.0、1.1、2.0のすべてのバージョンで広くサポートされています。これらは、それぞれOpenGL 1.4、1.5、2.1にほぼ匹敵します。
そのため、OpenGL ES 1.0が地球の表面から完全に消えるまで、OpenGL 2.xを知っていても無駄にはなりません。
もちろん、OpenGL 3.xまたは4.0をサポートするプラットフォームでOpenGL 3.xまたは4.0を使用しても価値がないと言っているわけではありません。
更新:Mac OS X Lion(10.7)のリリース時点で、MacでOpenGL 3.2コアプロファイルがサポートされるようになりました。このリリースでは、APIを簡素化するためにOpenGL 1.xの大部分を廃止します。古いバージョンのOS X(およびローエンドのIntelグラフィックス)のユーザーは、OpenGL 2.0および2.1に制限されています。それでもなお、OpenGL 2.xを知ることは依然として有用であり、かなり長い間そうであり続けるでしょう。
mh01の答えは基本の多くをカバーしていたので、いくつかの補足を追加します。
ES 2.0対デスクトップGL 2.1対デスクトップGL 3.3について話しましょう。この説明では、「GL XY」という用語はデスクトップOpenGLバージョンXYを指し、「ES XY」はOpenGL ES XYを指します。
構造的には、ES 2.0はGL 2.1と比べてコアGL 3.3と共通しています。GL 3.3とES 2.0はどちらも純粋なシェーダーベースです。どちらも純粋なバッファオブジェクトベースです。Etc. GL 2.1には、ES 2.0に簡単に移植できないGL 2.1アプリの作成を容易にする多くのパフォーマンスとコーディングトラップがあります。
ただし、シェーディング言語構文の点では、GLSL ES 1.00(ES 2.0へのマッピング)は、GL 3.3よりもGL 2.1のGLSLによく似ています。attribute
およびvarying
キーワード3.3コアには存在しません。in
andを使用しますout
。これは、3つ以上のシェーダーステージを処理する場合にはるかに一貫性があり、合理的です(そのため、ES 3.0はGL 3.3構文を採用しました)。
GL 3.3で学んだ概念をES 2.0 にマップするのは簡単です。そのため、さまざまなツールを使用してGL 3.3を学習すれば、ES 2.0の世界での作業方法を理解できます。もちろん、サブセットがどこにあるのかを把握する必要があります(つまり、GL 3.3でできること、ES 2.0ではできないこと)が、概念は同じです。
GLSLの構文をマッピングして、シェーダーを一方から他方にコピーできるようにするのは少し難しくなります。しかし、実際に必要なのは、適切な場所にあるいくつかの#definesだけです。また、GLSL 3.30にはhighp
(デスクトップGLSLでは何もしない)などのいくつかのES互換機能があります。
したがって、GL 2.1ではなくGL 3.3から学習すると、ES 2.0で何かを得られます。
新しいバージョンでのみ公開されるOpenGLへの大きな変更を必要としないゲームの場合、3.x +のみを使用すると、nvidia 8シリーズ以上に制限されます(他のグラフィックスベンダーでは確認できません)。したがって、3.x以上の機能を使用していない場合は、人為的な制限を作成するだけで、古いが強力なグラフィックカードを使用しているユーザーがゲームをプレイできないようにします。
このため、前方互換性のあるサブセットと新しいバージョンを学習し、ゲームを効果的にプッシュできる最も低いバージョンを選択することを強くお勧めします。あなたはできる
また、OpenGL:ES 2.0は固定機能パイプラインを削除するため、2.1より3.0に相当するという別の質問に答えます。また、実行時にサポートされるglバージョンごとに異なる機能を常にサポートします。
短い答え:
いいえ。「良い部分」を学べば、今日でもOpenGL 2.1を学ぶのは良い考えです。
長い答え:
OpenGLは、基本的に「良い部分」と「レガシー機能」の2つの部分に分けることができます。
正直なところ、レガシー関数(「固定関数」)を学習することにはあまり利点がありません。ただし、OpenGL 2.1のかなりの部分(優れた部分)は、比較的小さな変更を加えて現在でも利用できます。
そのため、OpenGL 2.1の一部を学ぶことは有益です。特に、最近ではOpenGL ES 2が非常に人気があり、ES 2はほとんどの場合(正確ではありませんが)OpenGL 2.1のサブセットです。スマートフォンでの3Dプログラミングには、OpenGL ES 2が必須です。
それでは、「良い」とは何ですか?基本的に、OpenGL 3.xの「コアプロファイル」(「互換性プロファイル」とは対照的に)および/またはOpenGL ES 2にあるもの。
glLoadIdentity
ように機能するかを知ることは有益ですが、そのような機能は時代遅れであり、避けるべきですglLightfv
、その他の固定機能のライト機能は避ける必要があります。glBegin
、glVertex
、glColor
、glEnd
:それらを避けてください。簡単な実験には良いかもしれませんが、同じことをする他のより良い方法があります。私が最初にこの回答を投稿した質問は重複していることが判明したため、ここに再投稿しています。
最初に現代のものを学び、必要になるまでレガシーのものが存在しないふりをすることをお勧めします。
古いものは、たとえば、OpenGL 1.5またはそれ以上(古いクラッピーネットブックおよび古いMacOSシステムで見つけることができる)、OpenGL ES 1.x(古いiPhoneおよびAndroid 1.6以前)、またはOpenGL SC(ジェット戦闘機でディスプレイをプログラミングしている場合はSaftey Criticalサブセット)。たとえば、MinecraftはOpenGL 1.3に対して構築されているため、非常に古いハードウェアをサポートできます(ただし、「高度な」オプションもあります)。
また、画面上のピクセルを取得したいだけで、「正しい」方法でそれを行うことを気にしない場合にも役立ちます。
-1.0から1.0のビューポートの設定やシェーダーなしでのレンダリングなど、学習時にOpenGLがデフォルトで行う機能の一部に依存すると便利です。これにより、1回ですべてを行うことなく学習できます。
ただし、それ以外は可能であればスキップする必要があります。