- 追加された行はこの色です。
- 削除された行はこの色です。
- GLEWについて へ行く。
*GLEWとは [#h9946d06]
GLEW(OpenGL Extension Wrangler Library)はOpenGL拡張をロードしてくれるライブラリである.
GLEWを用いることでOpenGL拡張を手軽に用いることができる
*GLEWライブラリのビルドとインストール [#ydd38797]
#include(build_glew,title)
*GLEWを用いたプロジェクトのビルド [#p9db0c84]
***インクルードファイル [#n7057264]
以下のようにglew.hをインクルードする.
#include <GL/glew.h>
GLUTも用いる場合は,glew, glutの順にインクルードする.
#include <GL/glew.h>
#include <GL/glut.h>
glew.h内でgl.hをインクルードしており,glew.hの前にgl.hがインクルードされると,
GLEWはプロプロセッサにより警告を出すようにされているため,glut.hの前にインクルードする.
***ライブラリファイル [#ua9b6daf]
プロジェクトのプロパティで,構成プロパティ→リンカ→入力→追加の依存ファイル に glew32.lib を追加する or
ソースファイルの先頭にプラグマを用いて以下のように指定する.
#pragma comment(lib, "glew32.lib")
***初期化 [#z7224593]
GLEWを用いてOpenGL拡張を用いる前に,glewInit()を用いて初期化する必要がある.
GLenum err = glewInit();
if(err == GLEW_OK){
cout << "GLEW OK : Glew Ver. " << glewGetString(GLEW_VERSION) << endl;
}
else{
cout << "GLEW Error : " << glewGetErrorString(err) << endl;
}
ただし,glewInit()を呼び出す前にレンダリングコンテキストを生成しておかなかればならない.
GLUTの場合,glutInit(),glutCreateWindow()を行った後にglewInit()を呼び出せばよい.
***使用できる拡張のチェック [#aa13b3d2]
もしある拡張が利用可能ならば,GLEW_拡張名 という名前の変数が定義されているので,
if(GLEW_VERSION_2_1 && GLEW_ARB_vertex_shader && GLEW_ARB_fragment_shader){
・・・
}
のようにチェックすることができる.最初のGLEW_VERSION_2_1はOpenGLのバージョンをチェックしている.
また,拡張名をそのまま用いてチェックしたい場合は,glewIsSupported()を用いる.
if(!glewIsSupported("GL_VERSION_2_1 "
"GL_ARB_vertex_shader "
"GL_ARB_fragment_shader "
"GL_ARB_geometry_shader4 "
)){
cout << "ERROR: Support for necessary OpenGL extensions missing." << endl;
exit(0);
}
glewIsSupported()はGLEW ver1.3.0以降が必要なので注意.1.3.0より前のバージョンのGLEWではglewGetExtension()が用いられていた.
*Rendering Contexts for OpenGL [#yd9f10dc]
レンダリングコンテキスト(RC)はWindowsのウィンドウシステムとOpenGLをリンクするものであり,
スレッドから発信したOpenGLコマンドはこのレンダリングコンテキストを通してウィンドウシステムに送られ,実行される.
描画はリンク付けされたウィンドウ上でなされる.
Win32 APIなどを用いてウィンドウ上にウィジットなどを描画する際にはデバイスコンテキスト(DC)が良く用いられる.
OpenGLアプリケーション生成時にはDCにRCを関連付けることでOpenGL描画を行う.
RCはDCとよく似ていているが,DCにはWindowsの[[Graphics Device Interface(GDI):http://ja.wikipedia.org/wiki/Graphics_Device_Interface]]
命令を指定するのに対して,RCはOpenGLに関する情報を持ち,OpenGL命令を渡す.
OpenGLコマンドを使用するスレッドはcurrent rendering context(Current RC)を持つ必要があり,Current RCなしでOpenGL命令を呼び出しても何も起こらない.
そのため,アプリケーション側がスレッドを生成したとき,RCも生成して,関連付ける必要がある(GLUTなどでは内部的にこれをやってくれている).
注意として,1つのアプリケーションが多数のスレッドを持つことはできるが,1つのスレッドが持てるCurrent RCは1つのみである.
***Multiple Rendering Contexts [#f20ab18e]