OpenGLプログラミング/モダンOpenGL イントロダクション

OpenGLに関するドキュメントのほとんどは、特に"固定パイプライン"において、非推奨の機能を使用しています。 OpenGL 2.0 およびそれ以降に付属する プログラマブルパイプライン では、プログラマブルな部分は シェーダ で処理され、 GLSLというCライクな言語で書かれます。
この文書の対象は、OpenGLを学んでいる方で、最新のOpenGLを最初から使用したい方です。 プログラマブルパイプラインはより柔軟ですが、固定パイプラインほどには直感的ではありません。 しかし、最初は 簡単なコード で始めることを確認しておきます。 OpenGL 1.x 向けの NeHe's チュートリアルと同様のアプローチを使用し、例やチュートリアルで プログラマブル・パイプライン の背後にある理論をより良く理解できるようにしています。
最初は頂点配列やシェーダが、古い即時モードや固定レンダリングパイプラインに比べて、扱うのに苦労しそうに見えるかもしれません 。 しかし、最終的に、特にバッファ·オブジェクトを使用している場合、あなたのコードは 非常にクリーン になり、グラフィックスも さらに速くなります。
このページのコード例は、 パブリックドメイン にあります。 自由に望むままに手を加えてみましょう。
このドキュメントをお友達にも広めましょう! ウィキブックスはさらなる周知と貢献を歓迎しています:)
備考:
OpenGL, GLUT, およびGLEW を使用する準備ができていることを確認しておく必要があります。
"http://en.wikibooks.org/w/index.php?title=Special:PrefixIndex&prefix=OpenGL+Programming/Installation&"&HYPERLINK "http://en.wikibooks.org/w/index.php?title=Special:PrefixIndex&prefix=OpenGL+Programming/Installation&"prefix=OpenGL+Programming%2FInstallationHYPERLINK "http://en.wikibooks.org/w/index.php?title=Special:PrefixIndex&prefix=OpenGL+Programming/Installation&"&namespace=0 the installation pages をチェックして、あなたのシステムのすべてのものを準備しましょう。
これらのライブラリをOpenGLのスタックに据え付けるために、APIs, Libraries and acronymsをチェックしましょう。
備考: GLUTを選んだのは、ポータブルレイヤーが得られるもののなかで最小限のものだったからです。 高度な機能を使用することはなく、ほとんどすべてのコードは素のOpenGLなので、あなたが新しいゲームやアプリケーションを作成するときに、GLFW、SDL、およびSFMLといった別の、より一般的なライブラリに移行しても問題は無いはずです。 これらのライブラリに切り替える方法を扱う具体的なチュートリアルを書くこともあるかもしれません。
始めはシンプルにいきましょう :) 初めて起動するまでに長い時間をかけてハックするような複雑なプログラムで苦労するのではなく、ここでの目標は、一歩一歩を経て改善していけるような、基本的ながらも機能的なプログラムを取得することです、
三角形は、3Dプログラミングにおいて最も基本的な単位です。 実際、あなたがビデオゲームで見るすべては三角形で作られています! 小さいものや、テクスチャのついた三角形もありますが、それでもやはり三角形です :)
プログラムマブルパイプラインで三角形を表示するために、最低限必要なものは:
私たちの例のための make を設定するのは非常に簡単です。これを ファイル名 Makefile に書きます:
アプリケーションをコンパイルするには、ターミナルで次のように入力します:
より複雑なMakefileは次のようになります:
このようにすると、 make clean とタイプすることで、三角形のバイナリおよび生成されることのある中間オブジェクトファイルを削除できます。 そこにある .PHONY ルールは、 "all" と "clean" がファイルではないということをmakeに伝えるためのもので、そうすることで実際に同じディレクトリ内にそのような名前のファイルがある場合でも混乱しなくなります。.
別のプログラミング環境を使用したい場合は、Setting Up OpenGL セクションを参照してください。
triangle.cファイルを作成してみましょう:
init_resourcesでは、GLSLのプログラムを作成します。 onDisplayでは、三角形を描画します。 In free_resourcesでは、GLSLのプログラムを破棄します。
最初の三角形は2Dで表示されます - そのうちもっと複雑なものへと踏み入っていきましょう。 私たちは三角形を、その3点の2D (x,y) 座標で記述します。 デフォルトでは、OpenGLの座標は [-1, 1] の範囲内にあります。.
今のところは、このデータ構造を記憶にとどめておいて、後ほどコードの中に書いていきましょう。 注:座標は-1と+1の間にありますが、ウィンドウは正方形ではありません!次のレッスンで、アスペクト比を固定する方法を見ていきます。
このGLSLプログラムは、配列の各点をひとつひとつ取得し、それらを画面上のどこに置くのかを伝えます。 この場合、ポイントは既に2Dスクリーン座標になっているので、変更しません。私たちのGLSLプログラムは、このようになります:
さて、このシェーダをOpenGLにコンパイルさせる必要があります。mainの上で init_resources をスタートさせましょう:
glShaderSourceに文字列としてソースを渡しています (後ほど別のより便利なやりかたでシェーダーコードを読み込んでいきます)。 型は GL_VERTEX_SHADERに指定しています。
OpenGLに画面の位置の3点を持たせると、その間のスペースを埋めて三角形を作ります。 3点間の画素それぞれについて、フラグメントシェーダが呼び出されます。 私たちのフラグメントシェーダでは、各ピクセルを青色に染めたいと伝えています:
同様にそれをGL_FRAGMENT_SHADER型でコンパイルします。 init_resources 手続きを継続していきましょう:
GLSLプログラムは、頂点シェーダとフラグメントシェーダの組み合わせです。 通常、それらは一緒にはたらき、そして頂点シェーダがフラグメントシェーダに追加情報を渡すこともできます。
#includeの下にグローバル変数を作成し、プログラムハンドルを格納します:
こちらは、プログラム内の頂点シェーダーとフラグメントシェーダーを link する方法です。 init_resources 手続きに続けて:
前述のとおり、三角形の各頂点はcoord2d属性を使用して頂点シェーダに渡します。 こちらがそれをCコードで宣言する方法です。
まず、第2のグローバル変数を作成しましょう:
init_resources手続きを以下で締めくくりましょう:
これでもう、三角形の頂点を頂点シェーダに渡すことができます。onDisplay 手続きを書いていきましょう。各セクションはコメントで説明されています:
glVertexAttribPointer は、 init_resources で作成したデータ·バッファからの各頂点を取得して、頂点シェーダに渡すようOpenGLに指示します。 これらの頂点は、各ポイントの画面上の位置を定義し、形成する三角形のピクセルにはフラグメントシェーダによって色がつけられます。
備考:次のチュートリアルでは、頂点バッファオブジェクトという、少し複雑な、グラフィックカードに頂点を格納するための新しい方法を紹介します。
唯一残っている部分は free_resourcesで、プログラムを終了するときにクリーンアップするためのものです。 このような特定のケースではそれほど重要ではありませんが、アプリケーションをこのような方法で構成しておくのは良いことです:
最初のOpenGL 2.0プログラムは完成です!
次のチュートリアルでは、最初のミニマルなコードにさらなる堅牢性を加えていきます。 tut02 のコードを是非お試しください (最下段のコードへのリンクを参照)。
このコードでお気軽に実験をしてみましょう:
次のチュートリアルでは、いくつかのユーティリティ関数を追加して、簡単にシェーダを書いたりデバッグできるようにしていきます。