learnopengl。 レッスン1.1-OpenGL

こんにちは。 数週間前、私はOpenGL孊習蚘事の䞀連の翻蚳を始めたした。 しかし、蚘事4で、あるhabrovchaninは、私の翻蚳が元の蚘事で提䟛されたトレヌニング資料を配垃するラむセンスに違反する可胜性があるこずに気付きたした。 実際、私の翻蚳はラむセンスに違反したした。 この問題を解決するために、私はその䞀連のレッスンの著者に頌りたしたが、それでも通垞の答えを埗るこずができたせんでした。 この理由で、私は別の䜜者に連絡したした。それは、OpenGLのよりクヌルなレッスンのセットおそらくそれ以䞊であるJoey de Vriesです。 そしお、圌は䞀連のレッスンを翻蚳する完党な蚱可を䞎えたした。 圌のレッスンは最埌のセットよりもはるかに広範囲であるため、これらの翻蚳は長い間続きたす。 そしお、私はそれが面癜いず玄束したす。 猫の䞋で興味を持っおください。



たた、岐路に立たされたした。蚘事を䜜成しないように、1぀の蚘事でりィンドりずコンテキストを䜜成するなど、すべおの基本を説明したすが、この堎合、誰もがこのような巚倧な蚘事をマスタヌできるわけではありたせん たたは、以前のように、元の階局に基づいお翻蚳したす。 2番目のオプションを遞択するこずにしたした。



Vulkanレッスンを犠牲にしお残念ながら、珟時点ではVulkan APIをサポヌトしおいないビデオカヌドが䞍足しおいるため、このAPIのレッスンを曞くのは難しいので、このAPIのレッスンはビデオカヌドの曎新埌にのみ行われたす。



内容
パヌト1.はじめに



  1. Opengl
  2. りィンドり䜜成
  3. こんにちはりィンドり
  4. こんにちはトラむアングル
  5. シェヌダヌ
  6. テクスチャヌ
  7. 倉換
  8. 座暙系
  9. カメラ


パヌト2.基本的な照明



  1. 色
  2. 照明の基本
  3. 玠材
  4. テクスチャマップ
  5. 光源
  6. 耇数の光源


パヌト3. 3Dモデルをダりンロヌドする



  1. Assimpラむブラリ
  2. メッシュポリゎンクラス
  3. 3Dモデルクラス


パヌト4.高床なOpenGL機胜



  1. 深床テスト
  2. ステンシルテスト
  3. 色混合
  4. 顔のクリッピング
  5. フレヌムバッファ
  6. キュヌビックカヌド
  7. 高床なデヌタ凊理
  8. 高床なGLSL
  9. 幟䜕孊シェヌダヌ
  10. むンスタンス化
  11. スムヌゞング


パヌト5.高床な照明



  1. 高床な照明。 Blinn-Fongモデル。
  2. ガンマ補正
  3. シャドりカヌド
  4. 党方向シャドりマップ






パヌト1.1-OpenGL





゚ントリヌ



旅を始める前に、OpenGLずは䜕かを理解する必芁がありたす。 基本的に、OpenGLはAPIアプリケヌションプログラミングむンタヌフェむスずしお理解されおおり、グラフィックスず画像の管理に䜿甚できる機胜の倧きなセットを提䟛したす。 しかし、実際には、OpenGLはKhronos Groupによっお開発および保守されおいる仕様です。



OpenGL仕様には、各特定の関数の結果がどうなるか、䜕をすべきかが蚘述されおいたす。 そしお、すでにこれらの仕様の実装は開発者にかかっおいたす。 たた、仕様には実装の詳现が蚘茉されおいないため、少なくずも仕様に準拠しおいる限り、さたざたなOpenGL実装には存圚する暩利がありたす。



OpenGLラむブラリを開発する人々は、倚くの堎合、ビデオカヌドのメヌカヌです。 賌入する各ビデオカヌドは、この䞀連のビデオカヌド甚に開発された䞀連のラむブラリのOpenGLの特定のバヌゞョンをサポヌトしおいたす。 Appleシステムを䜿甚する堎合、OpenGLラむブラリはAppleによっおサポヌトされたす。Linuxでは、これらのラむブラリのサプラむダずナヌザヌの適応のバヌゞョンの組み合わせがありたす。 たた、䜿甚しおいるOpenGLのバヌゞョンが奇劙な動䜜を瀺しおいる堎合、高い確率でこれがビデオカヌドメヌカヌの間違いであるこずを意味したす。



ほずんどの実装はビデオカヌドのメヌカヌによっお開発されおいるため、バグを修正するには、ビデオカヌドのドラむバヌを曎新する必芁がありたす。 これが、ほずんどすべおのレッスンでビデオカヌドのドラむバヌの曎新が掚奚される理由の1぀です。


Khronosは、OpenGLのすべおのバヌゞョンのすべおの仕様を公開しおいたす。 興味のある読者は、ここでOpenGL 3.3の仕様これが䜿甚するOpenGLのバヌゞョンですを芋぀けるこずができたす。 仕様は、すべおの機胜の動䜜芏則を完党に瀺しおいたす。



コアプロファむルず即時モヌド



以前は、OpenGLの䜿甚にはむミディ゚むトモヌド固定機胜パむプラむンずも呌ばれるでの開発が含たれおいたした。これはグラフィックスの描画に䜿いやすいものでした。 OpenGLのほずんどの機胜はラむブラリに隠されおおり、開発者はOpenGLによっお実行される蚈算を理解する自由がありたせんでした。



開発者は開発の柔軟性を芁求し、埌に仕様がより柔軟になり、開発者はグラフィックスのレンダリングプロセスをさらに制埡できるようになりたした。 即時モヌドは䜿いやすく、理解しやすいものでしたが、非垞に非効率的でした。 このため、仕様ではむミディ゚むトモヌドが非掚奚であるこずが瀺され、バヌゞョン3.2以降、すべおの叀い機胜を陀倖するコアプロファむルモヌドを䜿甚するようにプログラマヌを動機付け始めたした。



コアプロファむルを䜿甚する堎合、OpenGLは最新のプラクティスの䜿甚を匷制したす。 廃止された関数を䜿甚しようずするず、OpenGLぱラヌをスロヌし、レンダリングを停止したす。 最新のプラクティスを䜿甚する利点は、柔軟性ず効率性ですが、残念ながら孊習がより困難になりたす。 むミディ゚むトモヌドは倧きな抜象化であり、OpenGLによっお実行される実際の䜜業の倚くを隠すため、孊習は簡単でしたが、OpenGLが実際にどのように機胜するかを把握するのは困難です。 最新のアプロヌチでは、開発者がOpenGLずグラフィカルプログラミング党般を完党に理解する必芁があり、これは少し耇雑ですが、このスキヌムにより柔軟性ず効率が向䞊したす。



これが、チュヌトリアルがCore-Profile OpenGLバヌゞョン3.3に基づいおいる理由です。

少し耇雑ですが、それだけの䟡倀がありたす。



OpenGLの倚くの新しいバヌゞョンが既にリリヌスされおいたす4.5の執筆時点。 答えは非垞に簡単です。 バヌゞョン3.3以降のすべおの叀いバヌゞョンのOpenGLは、基本的な仕組みを倉曎しない限り、さたざたな䟿利な機胜を远加したせん。 新しいバヌゞョンは、同じ操䜜を実行するためのわずかに効率的たたは䟿利な方法を提䟛するだけです。 その結果、OpenGL 3.3に適甚可胜なすべおの抂念ず技術をOpenGLの新しいバヌゞョンに適甚できたす。



OpenGLの最新バヌゞョンの䜿甚には1぀の問題がありたす。 最新のグラフィックカヌドのみが最新のAPIを実行できたす。


拡匵機胜



OpenGLの優れた機胜は、拡匵機胜のサポヌトです。 ビデオカヌドの補造元が新しいテクノロゞたたはレンダリングの広範な新しい最適化を導入しおいるずきに、このむベントに関連する拡匵機胜がドラむバヌに衚瀺されたす。 アプリケヌションが実行されおいるハヌドりェアが拡匵機胜をサポヌトしおいる堎合、開発者は、この拡匵機胜によっお提䟛される機胜を䜿甚しお、グラフィックスをより高床に、たたは効率的にレンダリングできたす。 したがっお、グラフィックプログラマは、OpenGLの新しいバヌゞョンでの実装を埅たずに、ビデオカヌドでテクノロゞのサポヌトを確認するだけで、新しいテクノロゞを䜿甚できたす。 倚くの堎合、䞀郚の拡匵機胜の需芁が高い堎合、次のバヌゞョンのOpenGLの䞀郚ずしお実装されたす。



開発者は、拡匵機胜の利甚可胜性を確認するたたは拡匵機胜ラむブラリを䜿甚するだけです。 このアプロヌチにより、プログラマは自分の拡匵機胜に基づいおアクションをより効率的に実行できたす。



if(GL_ARB_extension_name) { //    .    } else { //   :  -. }
      
      





OpenGL 3.3では、拡匵機胜はほずんど必芁ありたせんが、必芁な堎合は必芁な指瀺が提䟛されたす。



ステヌトマシン



OpenGLは、本質的に倧きな状態マシンです。OpenGLの動䜜を定矩する倉数のセットです。 OpenGLの状態は、基本的にOpenGLのコンテキストを指したす。 OpenGLを䜿甚するプロセスでは、いく぀かのオプションを蚭定しお状態を倉曎し、バッファヌを管理しおから、珟圚のコンテキストを䜿甚しお描画するこずがよくありたす。



OpenGLに、䞉角圢ではなく線などの描画を開始したいこずを䌝えるず、OpenGLの描画方法を制埡するオプションを倉曎しお、OpenGLの状態を倉曎したす。 OpenGLの状態を倉曎した埌、線を描画するために、埌続のすべおの描画関数は䞉角圢ではなく線を描画したす。



OpenGLを䜿甚しながら、コンテキストを倉曎するいく぀かの状態倉曎機胜、およびOpenGLの珟圚の状態に応じおアクションを実行するいく぀かの状態倉曎機胜を実行したす。 OpenGLが倧芏暡なステヌトマシンであるずいう事実を念頭に眮いおいる限り、ほずんどの機胜は明らかです。



オブゞェクト



OpenGLラむブラリはCで蚘述され、耇数のブランチがありたすが、これは䞻にCラむブラリです。 ほずんどのC蚀語構成䜓は高氎準蚀語に翻蚳されおいないため、OpenGLは倚数の抜象化を䜿甚しお開発されおいたす。 そのような抜象化の1぀は、OpenGLのオブゞェクトシステムです。



OpenGLのオブゞェクトは、OpenGL状態のサブセットを衚すオプションのセットです。 たずえば、りィンドりのレンダリング構成を蚘述するオブゞェクトを䜜成できたす。 サむズ、色数などを蚭定できたす。 このようなオブゞェクトは、Cのような構造で衚すこずができたす。



 struct object_name { GLfloat option1; GLuint option2; GLchar[] name; };
      
      





プリミティブ型

OpenGLを䜿甚する堎合は、OpenGLで定矩されたプリミティブを䜿甚するこずをお勧めしたす。 フロヌトを䜿甚する代わりに、添付のGLで蚘述したす。 int、uint char、boolなどに぀いおも同じです。 OpenGLは、䞀郚のオペレヌティングシステムが異なるマヌクアップを持぀可胜性があるため、クロスプラットフォヌムを提䟛するために、GLプリミティブのメモリマヌクアップを定矩したす。 OpenGLプリミティブを䜿甚するず、アプリケヌションの完党なクロスプラットフォヌム性を実珟できたす。


オブゞェクトを䜿甚するたびに、基本的に次のように蚘述したす。



 // OpenGL  struct OpenGL_Context { ... object* object_Window_Target; ... };
      
      





 //   GLuint objectId = 0; glGenObject(1, &objectId); //     glBindObject(GL_WINDOW_TARGET, objectId); //    ,   GL_WINDOW_TARGET glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800); glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600); //        glBindObject(GL_WINDOW_TARGET, 0);
      
      





この小さなコヌドは、OpenGLでの䜜業䞭によく遭遇するものです。 最初に、オブゞェクトを䜜成し、そのオブゞェクトぞのリンクを識別番号idの圢匏で保存したす。 オブゞェクトの実際のデヌタは実装に隠されおいたす。 次に、オブゞェクトをコンテキストの必芁な郚分にアタッチしたす䟋のりィンドりタヌゲットオブゞェクトの堎所は `GL_WINDOW_TARGET`ずしお指定されたす。 次に、りィンドりオプションの倀を蚭定し、最埌にidを0に蚭定しおオブゞェクトを解攟したす。蚭定した倀は匕き続きオブゞェクトに栌玍され、 objectIdを介しおアクセスし、オブゞェクトをGL_WINDOW_TARGETにバむンドしお再び埩元できたす。

このコヌドは、OpenGLの動䜜の䟋を瀺しおいたす。 その埌、実際の䟋を瀺したす。


これらのオブゞェクトの䞻な機胜は、アプリケヌションで倚くのオブゞェクトを宣蚀し、オプションを蚭定し、OpenGL状態を䜿甚しお操䜜を開始するたびに、オブゞェクトを垌望の蚭定にバむンドできるこずです。 たずえば、これは、3Dモデルデヌタたたはこのモデルに描画したいものがあるオブゞェクトです。 耇数のオブゞェクトを所有するず、レンダリングプロセス䞭にそれらを簡単に切り替えるこずができたす。



さあ始めたしょう



これで、仕様ずラむブラリの䞡方に぀いおOpenGLに぀いお少し孊びたした。 おおよその䜜業アルゎリズムずOpenGLで䜿甚されるいく぀かの機胜を孊びたした。 䜕かを誀解しおもがっかりしないでください。すべおの手順を順を远っお説明し、OpenGLのすべおの耇雑さを理解するのに十分な䟋を参照したす。 開始する準備ができたら、OpenGLコンテキストの䜜成を開始できたす。最初のりィンドりはここにありたす。



远加のリ゜ヌス






All Articles