戻る
三角形描画
June 25, 2020
三角形を書くというよりは, openglの処理の流れの全体像を見ていくというのが目的だ. 流れは以下.
- glfwInitで開始
- glfwWindowHintでバージョンやコンテクスト指定
- glfwCreateWindowでWindow生成
- glfwMakeContextCurrentでwindowをコンテクストカレントにする
- glfwSetFrameBufferSizeCallbackでwindowがリサイズされた時の処理を指定
- gladLoadGLLoaderでopenglの関数をロード
- glCreateShader(GL_VERTEX_SHADER)でvertex shader作成
- glShaderSourceでvertex shaderのソース読み込み
- glCompileShaderでvertex shaderコンパイル
- glGetShaderivでコンパイル情報取得
- glCreateShader(GL_FRAGMENT_SHADER)でfragment shader作成
- glShaderSourceでfragment shaderのソース読み込み
- glCompileShaderでfragment shaderコンパイル
- glGetShaderivでコンパイル情報取得
- glCreateProgramでshader program作成
- glAttachShaderでshader programにvertex shader, fragment shaderを登録
- glLinkProgramでshader programと登録したshaderをリンク
- glGetProgramivでリンク情報取得
- glDeleteShaderでvertex shader, fragment shaderを破棄
- glGenVertexArraysでVAO(Vertex Array Object)生成
- glGenBuffersでVBO(Vertex Buffer Object)生成
- glBindVertexArrayでVAO指定
- glBindBufferでGL_ARRAY_BUFFERのVBO指定
- glBufferDataでvertexデータをGL_ARRAY_BUFFERに送る
- glVertexAttribPointerでGL_ARRAY_BUFFERが読み込むデータの解釈を決める
- glEnableVertexAttribArrayで指定したインデックスを作動
- glBindBuffer(GL_ARRAY_BUFFER,0)でGL_ARRAY_BUFFERからVBOをunbind
- glBindVertexArray(0)でVAOをunbind
- glfwWindowShouldCloseがfalseならばメインループ続行
- 入力処理
- glClearColorでglClearの初期化色を指定
- glClearでバッファ初期化
- glUseProgramでshader programを指定
- glBindVertexArrayでVAOを指定
- glDrawArraysで三角形描画
- glfwSwapBuffersで描画したバッファを反映
- glfwPollEventsでイベント記録
- glDeleteVertexArraysでVAO破棄
- glDeleteBuffersでVBO破棄
- glDeleteProgramでshader program破棄
int glfwinit(void)
glfwを初期化, 成功時にGL_TRUE(=1), 失敗時にGL_FALSE(=0)を返す.
GLFWwindow *glfwCreateWindow(int width, int heightk, const char *title, GLFWmonitor *monitor, GLFWwindow *share)
- width: 作成するウィンドウの横幅の画素数, 1以上
- height: 作成するウィンドウの高さの画素数, 1以上
- title: 作成するウィンドウのタイトルバーに表示する文字列
- monitor: フルスクリーンモードの時に表示するモニタを指定, フルスクリーンでなければNULL
- share: 他のウィンドウハンドルを指定すればね そのウィンドウとリソース(テクスチャなど)を共有する.
void glfwMakeContextCurrent(GLFWwindow *const window)
ウィンドウのレンダリングコンテクストをカレントにする. *のあとのconstはポインタ自体がconstというだけで参照先がconstというわけではない.
glfwMakeColor(GLfloat R, GLfloat G, GLfloat B, GLfloat A);
それぞれ0-1のレンジ. Aは不透明度, 0で透明, 1で不透明.
描画ループの説明に入る. glfwWindowShouldClose()でウィンドウが閉じるべきかをイベントから判断する. glClear()でバッファを消去する. 描画の処理をし, glfwSwapBuffer()で初めてディスプレイ上に描画が反映される. このように表示バッファと内部の描画処理のバッファの二つがありこれをダブルバッファリングという. イベント駆動の場合はglfwWaitEvents()で待機, 時間経過で動く場合はglfwPollEvents()関数を用いる.
glClear(GLbitfield mask)
maskには塗り潰すバッファを指定する. GL_COLOR_BUFFER_BITの場合カラーバッファのみをクリアする.
glfwSwapBuffers(GLFWindow *const window)
windowに指定したウィンドウのカラーバッファを入れ替える.
glfwWaitEvents(void) イベント発生を待つ. メインループ以外では実行すべきではない. タイムアウト付きのglfwWaitEventsTimeout(double sec)もある.
void glfwPollEvents(void) マウス操作などのイベントを取り出し, それを記録する.
void glfwTerminate(void)
GLFWの終了処理を行う.
void glfwSwapInterval(int interval)
カラーバッファ入れ替えで待つV-Syncの最小回数
OpenGLのデータ型
C++の型は処理系依存のものが多いので統一的な扱いをするためにライブラリ側が型を用意する事はよくある事だ. これで処理が重くなる事は全くないので積極的に使うことができる.
OpenGLのデータ型 |
最小ビット数 |
説明 |
GLboolean |
1 |
論理値 |
GLbyte |
8 |
|
GLubyte |
8 |
|
GLchar |
8 |
|
GLshort |
16 |
|
GLushort |
16 |
|
GLint |
32 |
|
GLuint |
32 |
|
GLint64 |
64 |
|
GLuint64 |
64 |
|
GLfloat |
32 |
|
GLdouble |
64 |
|
GLintptr |
|
|
GLsizeptr |
32 |
|
GLint |
32 |
|