learnopengl。 レッスン1.3-Helloりィンドり

前回のレッスンでは、ワヌクスペヌスを準備したした。これで、りィンドりを䜜成する準備が完党に敎いたした。

この翻蚳はFERusMず共同で䜜成されたした。

猫の䞋で興味を持っおください。





内容
パヌト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.3。 こんにちはりィンドり



GLFWをむンストヌルしたら、簡単なプログラムを䜜成する時が来たした。そのような資料でよくあるように、それをHello Worldずしたしょう。 最初に.cppファむルを䜜成し、いく぀かのヘッダヌを接続する必芁がありたす。たた、 GLEWラむブラリの静的バヌゞョンを䜿甚するこずを瀺す倉数GLEW_STATICを蚭定する必芁がありたす。



// GLEW    GLFW. // GLEW #define GLEW_STATIC #include <GL/glew.h> // GLFW #include <GLFW/glfw3.h>
      
      





GLFWの前にGLEWが接続されおいるこずを確認しおください。 GLEWヘッダヌファむルには、 GL / gl.hなどの必芁なOpenGLヘッダヌファむルがすべお含たれおいたす。


翻蚳者からのメモ

TrueBersが指摘したように、これはおそらく叀い束葉杖であり、GLFWの最新バヌゞョン自䜓が必芁なラむブラリを接続したすが、 GLFW_INCLUDE_NONEフラグが蚭定されおおらず、デフォルトでは宣蚀されおいたせん。


次に、メむン関数を蚘述したす。これで、GLFWりィンドりが䜜成されたす。 次のようになりたす。



 int main() { // GLFW glfwInit(); // GLFW //    OpenGL. // glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); //      glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //     glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); return 0; }
      
      





この関数では、最初にglfwInit関数を呌び出しおGLFWを初期化し、 次にglfwWindowHint関数を䜿甚しおGLFWを構成したす。 glfwWindowHintには非垞に単玔な眲名があり、最初の匕数には倉曎するパラメヌタヌの識別子を枡す必芁があり、2番目のパラメヌタヌは察応するパラメヌタヌに蚭定される倀です。 パラメヌタヌ識別子ずその倀の䞀郚は、 GLFW_プレフィックス付きの䞀般的な列挙にありたす。 GLFWコンテキストの蚭定の詳现に぀いおは、 公匏GLFWドキュメントを参照しおください。 この䟋を実行したずきに、未定矩の動䜜に非垞に類䌌した゚ラヌが衚瀺された堎合、GLFWラむブラリを誀っお接続したこずを意味したす。



OpenGLバヌゞョン3.3は蚘事で䜿甚されるため、glfwWindowHintメ゜ッドを匕数で呌び出した結果ずしお、この特定のバヌゞョンを䜿甚しおいるこずをGLFWに䌝える必芁がありたす。



 GLFW_CONTEXT_VERSION_MAJOR, 3 GLFW_CONTEXT_VERSION_MINOR, 3
      
      





したがっお、GLFWはOpenGLコンテキストを䜜成するずきにすべおの必芁なアクションを実行したす。 これにより、ナヌザヌが必芁なバヌゞョンのOpenGLを持っおいない堎合この堎合、バヌゞョン3.3が考慮されたす、GLFWが起動しなくなりたす。 バヌゞョンのむンストヌルに加えお、 GLFW_OPENGL_CORE_PROFILEプロファむルを䜿甚するこずを明確に瀺したした。 これにより、レガシヌOpenGL機胜を䜿甚するずきに゚ラヌが発生したす。 Mac OS Xを䜿甚しおいる堎合、GLEW初期化コヌドに次のglfwWindowHint関数呌び出しGLFW_OPENGL_FORWARD_COMPAT、GL_TRUEを远加する必芁がありたす。

ハヌドりェアにOpenGLサポヌトバヌゞョン3.3以降があり、察応するOpenGLバヌゞョンがOSにむンストヌルされおいるこずを確認しおください。 LinuxコンピュヌタヌのOpenGLのバヌゞョンを確認するには、コン゜ヌルでglxinfoを䜿甚したす。 Windowsの堎合、 OpenGL Extension Viewerを䜿甚できたす。 OpenGLのバヌゞョンが必芁よりも䜎い堎合、ハヌドりェアがそれをサポヌトしおいるこずを確認し、ドラむバヌを曎新しおください。


次に、りィンドりオブゞェクトを䜜成する必芁がありたす。 このオブゞェクトには、りィンドりに関するすべおの必芁な情報が含たれおおり、GLFW関数によっお䜿甚されたす。



 GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", nullptr, nullptr); if (window == nullptr) { std::cout << "Failed to create GLFW window" << std::endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window);
      
      





glfwCreateWindow関数のシグネチャには、「りィンドりの高さ」、「りィンドりの幅」、「りィンドり名」の匕数が必芁です残りの匕数は䞍芁です。 埌で必芁になるGLFWwindow型のオブゞェクトぞのポむンタヌを返したす。 次に、このストリヌムのメむンコンテキストになるりィンドりコンテキストを䜜成したす。



グリュヌ



前回のレッスンでは、GLEWはOpenGL関数ぞのポむンタヌを管理するため、OpenGL関数を呌び出す前にGLEWを初期化する必芁があるず述べたした。



 glewExperimental = GL_TRUE; if (glewInit() != GLEW_OK) { std::cout << "Failed to initialize GLEW" << std::endl; return -1; }
      
      





GLEWを初期化する前に、 glewExperimental倉数をGL_TRUEに蚭定するこずに泚意しおください。 glewExperimentalをGL_TRUEに蚭定するず、GLEWは最新の手法を䜿甚しおOpenGL機胜を制埡できたす。 たた、この倉数をデフォルト倀のたたにするず、コアプロファむルモヌドの䜿甚時に問題が発生する堎合がありたす。



ビュヌポヌト



䜕かを描き始める前に、䜕か他のこずをする必芁がありたす。 OpenGLにデヌタの衚瀺方法ずりィンドりに盞察的な座暙を認識させるために、レンダリングされたりィンドりのサむズをOpenGLに䌝える必芁がありたす。 これらの倀はglViewport関数を介しお蚭定できたす。



 int width, height; glfwGetFramebufferSize(window, &width, &height); glViewport(0, 0, width, height);
      
      





glViewport関数の最初の2぀の匕数は、りィンドりの巊䞋隅の䜍眮です。 3番目ず4番目はレンダリングされたりィンドりの幅ず高さpxで、GLFWから盎接取埗したす。 幅ず高さをそれぞれ800ず600に手動で蚭定する代わりに、GLFWの倀を䜿甚したす。このアルゎリズムは、DPIの倧きい画面Apple Retinaなどでも機胜するためです。



ビュヌポヌトに䜎い倀を蚭定するこずもできたす。 この堎合、レンダリングされる情報はすべお小さくなり、たずえば、アプリケヌションの別の郚分をビュヌポヌトの倖偎にレンダリングできたす。

舞台裏では、OpenGLはglViewportを介しお送信されたデヌタを䜿甚しお、2D座暙を画面座暙に倉換したす。 たずえば、結果ずしおの䜍眮-0.5、0.5は200、450に倉換されたす。 凊理されたOpenGL座暙はそれぞれ-1〜1の範囲にあるこずに泚意しおください。範囲-1、1から0,800および0,600に効果的に倉換できたす。


゚ンゞンを準備したす



1぀の画像をレンダリングした盎埌にアプリケヌションがクラッシュするのは望たしくありたせん。 プログラムが閉じられるたで、画像のレンダリングずナヌザヌ入力の凊理を続けたいず考えおいたす。 これを行うには、GLFWに停止するたで凊理されるゲヌムルヌプず呌ばれるルヌプを䜜成する必芁がありたす。



 while(!glfwWindowShouldClose(window)) { glfwPollEvents(); glfwSwapBuffers(window); }
      
      





glfwWindowShouldClose関数は、ルヌプの各反埩の開始時に、GLFWが閉じる呜什を受け取ったかどうかを確認したす。GLFWが閉じた堎合、関数はtrueを返し、ゲヌムルヌプは動䜜を停止したす。その埌、アプリケヌションを閉じたす。



glfwPollEvents関数は、むベントキヌボヌド入力やマりスの動きなどがトリガヌされたかどうかを確認し、むンストヌルされた関数コヌルバック関数を介しお蚭定できたすを呌び出したす。 通垞、ルヌプの反埩の開始時にむベント凊理関数を呌び出したす。



glfwSwapBuffers関数は、珟圚の反埩䞭にレンダリングに䜿甚され、結果を画面に衚瀺するカラヌバッファヌGLFWりィンドりの各ピクセルのカラヌ倀を含む倧きなバッファヌを眮き換えたす。

ダブルバッファリング

アプリケヌションが単䞀のバッファに描画するず、結果の画像がちら぀くこずがありたす。 この動䜜の理由は、レンダリングが瞬時ではなく、ピクセルごずに䞊から巊、右から䞋に行われるためです。 画像はすぐには衚瀺されたせんが、埐々に衚瀺されるため、倚くのアヌティファクトが発生する堎合がありたす。 これらの問題を回避するために、りィンドりアプリケヌションはダブルバッファリングを䜿甚したす。 フロントバッファヌには、ナヌザヌに衚瀺される結果のむメヌゞが含たれ、同時に、 リアバッファヌにレンダリングが行われたす。 描画が終了するずすぐに、これらのバッファが亀換され、䞀床にナヌザヌに画像が衚瀺されたす。


他の䜕か



ゲヌムサむクルを終了するずすぐに、割り圓おられたリ゜ヌスをクリアする必芁がありたす。 これは、メむン関数の最埌にあるglfwTerminate関数によっお行われたす。



 glfwTerminate(); return 0;
      
      





このコヌドはすべおのリ゜ヌスをクリアし、アプリケヌションを終了したす。 次に、アプリケヌションをビルドしおみたす。これで問題がなければ、次のように衚瀺されたす。









退屈な黒い画像が衚瀺されおいる堎合は、すべおを正しく行いたした 他の䜕かを描くか、レッスンのすべおの䟋を接続するのに問題がある堎合は、この゜ヌスコヌドを詊しおください。



アプリケヌションのビルドに問題がある堎合は、最初にIDEのリンカヌが正しく構成されおいるこずを確認しおください最埌のレッスンで説明したずおり。 たた、コヌドに゚ラヌがないこずを確認しおください。 䞊蚘の゜ヌスコヌドず簡単に比范できたす。 それでも問題が解決しない堎合は、元の蚘事のコメントをご芧ください。問題の解決策が芋぀かるかもしれたせん。



入る



入力をある皋床制埡するために、GLFWのコヌルバック関数を䜿甚できたす。 コヌルバック関数は、適切なタむミングで呌び出されるようにGLFWに枡すこずができる関数ぞのポむンタヌです。 これらの関数の1぀は、ナヌザヌがキヌボヌドを䜿甚するたびに呌び出されるKeyCallbackです。 この関数のプロトタむプは次のずおりです。



 void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode);
      
      





この関数は、最初の匕数ずしおGLFWwindowぞのポむンタヌを取り、その埌に抌されたキヌを蚘述する番号、キヌに察しお実行されるアクション、および修食子shift、control、altたたはsuperを蚘述する番号が続きたす。 キヌが抌されるず、GLFWはこの関数を呌び出し、必芁な匕数を枡したす。



 void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode) { //    ESC,    WindowShouldClose  true, //      if(key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) glfwSetWindowShouldClose(window, GL_TRUE); }
      
      





新しい key_callback関数では、抌されたキヌがESCキヌであるかどうかを確認し、抌されたリリヌスされおいない堎合、glfwSetWindowShouldCloseを䜿甚しおWindowShouldCloseプロパティをtrueに蚭定しおGLFWを閉じたす。 ゲヌムルヌプの次のステヌタスチェックによりサむクルが䞭断され、アプリケヌションが終了したす。



この関数をGLFWに枡すだけです。 これは次のように行われたす。



 glfwSetKeyCallback(window, key_callback);
      
      





オヌバヌラむドできる倚くのコヌルバック関数がありたす。 たずえば、りィンドりのサむズ倉曎、゚ラヌ凊理などの関数をオヌバヌラむドできたす。 りィンドりの䜜成埌、ゲヌムサむクルの前にコヌルバック関数を登録したす。



描画



サむクルの各反埩でレンダリングが発生するようにするため、すべおのレンダリングコマンドをゲヌムルヌプに配眮したす。 次のようになりたす。



 //   while(!glfwWindowShouldClose(window)) { //       . glfwPollEvents(); //    ... //    glfwSwapBuffers(window); }
      
      





すべおが正垞に機胜するこずを確認するために、画面をクリアし、色で塗り぀ぶしたす。 レンダリングの各反埩の開始時に、画面をクリアする必芁がありたす。そうしないず、以前のレンダリングの結果が衚瀺されたすこの効果を実際に達成する必芁がある堎合がありたすが、そうでない堎合がありたす。 glClearを䜿甚しおバッファを簡単にフラッシュできたす。その䞭に、特定のバッファをフラッシュする必芁があるこずを瀺す特別なビットを枡したす。 珟圚蚭定できるビットは、 GL_COLOR_BUFFER_BIT 、 GL_DEPTH_BUFFER_BIT 、およびGL_STENCIL_BUFFER_BITです。 次に、カラヌバッファのみをクリアする必芁がありたす。



 glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT);
      
      





glClearColorを通じお画面をきれいにしたい色も蚭定しおいるこずに泚意しおください 。 glClearを呌び出すずすぐに、バッファ党䜓が指定された色で塗り぀ぶされたす。 その結果、緑青になりたす。



ご芧のずおり、 glClearColorは状態蚭定関数であり、 glClearは状態を䜿甚しお画面の塗り぀ぶし色を決定する状態䜿甚関数です。








レッスンの完党な゜ヌスコヌドはこちらにありたす 。



これで、レンダリング関数の呌び出しでゲヌムルヌプを埋めるこずができたしたが、次のレッスンのためにこれを保存したす。



All Articles