トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

OpenGL

[OpenGL]

OpenGL学習

以下をざっと読んでLWJGLに適用する

  OpenGLを使うとき知っておくと便利な基礎知識

 GLUとはOpenGLを補助するライブラリで、gluLookAtやgluPerspectiveなどがあります。
 それぞれ視点などを設定します。
 結論から言いますと、GLUは現在でも使えないことは無いと思いますが、基本的により高機能なGLMを使います。
 後で詳しく説明しますが、gluLookAtやgluPerspectiveはgl_ModelViewProjectionMatrixという組み込みの変数に値を設定しています。
 しかし、現在ではglm::LookAtやglm::Perspective等によってC++側でModelViewProjection行列を作成し、シェーダー側にuniform変数として送るのが主流のようです。

  GLFWでウィンドウを表示する

  • この記事と同じことをClojureでやる
    • GLEWは使わない
    • GL/createCapabilities を呼び出す必要がある

+ スクリーンショット sample.glfw.png

+ ソースコード src/main/clojure/sample/glfw.clj

  GLSLシェーダーを触ってみよう

 OpenGLが世界を描画するにあたって、描画までの一通りの流れをパイプラインといいます。
 下の画像にはその流れをざっくりと示しています。
 
 その中でも大切なのがバーテックスシェーダとフラグメントシェーダです。
 これらは私たちプログラマーがGLSLという言語を使って記述していきます。

古めのOpenGLによる実装

 ただ実はglBeginやglEndはOpenGL 3.0で廃止予定、OpenGL 3.1で廃止されています。
 じゃあなんで使ったのかというと、説明するのに便利だったからです。
 
 OpenGLは現在VBOという仕組みを用いて描画を行うのが主流

+ スクリーンショット sample.old_gl.png

+ ソースコード src/main/clojure/sample/old_gl.clj

GLSL

 GLSLはC言語を拡張した言語でGPU内での処理を記述していきます。
 
 拡張子についてはシェーダーだと分かれば基本何でもいいです。
 「.vert/.frag」としている人が多いですが、「.vertexshader/.fragmentshader」としている人もいたりします。
  • 流れ
 glCreateShader()でシェーダーオブジェクトを作成
 作成したシェーダーオブジェクトにglShaderSource()でソースコードを読み込む
 glCompileShaderでコンパイルします。
 glCreateProgram()でプログラムオブジェクトを作成
 glAttachShader()でシェーダーオブジェクトをシェーダープログラムへ登録
 glDeleteShader()でシェーダーオブジェクトの削除
 glLinkProgram()シェーダープログラムをリンク
 glUseProgram()でシェーダーを有効化します

+ スクリーンショット sample.new_gl.png

  • お手本のシェーダーファイルを用意する

+ ソースコード src/main/resources/shader.vert

+ ソースコード src/main/resources/shader.frag

  • 続けて、シェーダーを読み込んでオブジェクトにするソースをClojureで用意する

+ ソースコード src/main/clojure/sample/shader.clj

  • メインのソースをClojureで用意する

+ ソースコード src/main/clojure/sample/new_gl.clj

  頂点配列とVBO

  • この内容が一番知りたかった
sample.glfw.png sample.new_gl.png sample.old_gl.png
お名前: コメント: