OpenGL
をテンプレートにして作成
[
トップ
|
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
OpenGLに関して
-[[OpenGL - サンプルコード]]
-[[OpenGL - Vertex array]]
-[[OpenGL - VBO]]
-[[OpenGL - PBO]]
-[[OpenGL - FBO]]
-[[OpenGL - VAO]]
-[[GLEWについて]]
-----
#contents
-----
*freeglut [#b142c707]
***freeglutについて [#f1238cad]
GLUTはversion3.7 (1998年) を最後として,それ以降開発され...
[[freeglut:http://freeglut.sourceforge.net/]]はGLUT(OpenG...
GLUTからfreeglutに乗り換えるときは,単純にインクルードす...
***ダウンロードとインストール [#c3b3d84a]
#include(build_freeglut,title)
*TIPS [#i5035d09]
**平面クリップ [#y8fac125]
平面クリップを行うには,[[glClipPlane:http://www.opengl.o...
void glClipPlane(GLenum plane, const GLdouble *equation);
planeにはクリップ平面番号(GL_CLIP_PLANE0, GL_CLIP_PLANE1...
最大数は,GL_MAX_CLIP_PLANESを参照することで調べられる.
equationには平面方程式(ax+by+cz+d=0)の係数(a,b,c,d)を格納...
ax+by+cz+d<0の範囲がクリップされる.
平面クリップのON/OFFは,
glEnable(GL_CLIP_PLANE0);
glDisable(GL_CLIP_PLANE0);
**マルチサンプリングによるアンチエリアシング [#m4b6b092]
-描画する前にマルチサンプリングをONにする
glEnable(GL_MULTISAMPLE);
-GLUTの場合,glutInitDisplayModeにGLUT_MULTISAMPLEを追加...
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH...
-サンプリングの対応状況を調べる
GLint buf, sbuf;
glGetIntegerv(GL_SAMPLE_BUFFERS, &buf);
cout << "number of sample buffers is " << buf << endl;
glGetIntegerv(GL_SAMPLES, &sbuf);
cout << "number of samples is " << sbuf << endl;
buf,sbufが0ならばGPUが対応していない or ビデオカードの設...
NVIDIAのGPUの場合,
++NVIDIAコントロールパネルの3D設定の管理を開く.
++グローバル設定の「アンチエリアシング - モード」を「アプ...
++「アンチエリアシング - 設定」が選択できるようになってい...
-サンプリング本数をアプリケーションから設定する場合は,
上記「アンチエリアシング - モード」を「アプリケーションに...
ピクセルフォーマットを手動で設定する必要がある.
wglChoosePixelFormatARBを用いると設定は可能だがGLUTでは使...
freeglutを用いている場合は,freeglutのソースコードをいじ...
変更箇所は,
--freeglut_init.c : 89行目の/* SampleNumber */のところを...
変更後ライブラリをビルドし直す.~
私はサンプリング設定を変えるたびにライブラリをビルドし直...
プログラム実行時のコマンドラインオプションでサンプリング...
例えば,
glapp.exe -sample 8
とすればサンプリング数が8となる.
この設定のためには,freeglut_init.cの807行目あたりに
else if( strcmp(argv[i], "-sample") == 0 )
{
if( ++i >= argc )
fgError( "-sample parameter must be followed by ...
fgState.SampleNumber = atoi(argv[i]);
argv[i-1] = NULL;
argv[i] = NULL;
(*pargc) -= 2;
}
を追加する.
**DualViewなどでのフルスクリーン(Windows Only) [#j0018709]
GLUT,freeglutではglutFullScreen関数で全画面表示できる.
標準ではマルチディスプレイの場合,スパン設定なら問題ない...
メイン画面上でしかフルスクリーンにならない.
これは,DualViewではメインディスプレイのサイズがAPIが与え...
DualViewでは仮想的なスパン画面が設定されているので,これ...
freeglutのソースコードを変更する.freeglut_init.c の fghI...
fgDisplay.ScreenWidth = GetSystemMetrics( SM_CXSCREE...
fgDisplay.ScreenHeight = GetSystemMetrics( SM_CYSCREE...
の部分を
fgDisplay.ScreenWidth = GetSystemMetrics( SM_CXVIRTU...
fgDisplay.ScreenHeight = GetSystemMetrics( SM_CYVIRTU...
とすればよい.
glutFullScreen命令を呼んだときだけ変えたいときや別の関数...
freeglut_window.c内のglutFullScreen関数の,
#code(C){{
rect.left = 0;
rect.top = 0;
rect.right = fgDisplay.ScreenWidth;
rect.bottom = fgDisplay.ScreenHeight;
}}
を
#code(C){{
rect.left = 0;
rect.top = 0;
rect.right = GetSystemMetrics(SM_CXVIRTUALSCREEN);
rect.bottom = GetSystemMetrics(SM_CYVIRTUALSCREEN);
}}
などとする.
また,マルチディスプレイ用のフルスクリーン命令を新たに作...
この関数をコピーして名前を変えて,上記の変更をすればよい.
新しい関数を追加した場合(例えば,glutFullScreenMultiとす...
-freeglut_ext.hに関数宣言を追加
FGAPI void FGAPIENTRY glutFullScreenMulti( int left, ...
-freeglut_ext.cの最初の方の #define CHECK_NAME(x) に追加
CHECK_NAME(glutFullScreenMulti);
-freeglutdll.defに関数名(glutFullScreenMulti)を追加
また,任意のマルチディスプレイに対応するために,
関数の宣言を
void FGAPIENTRY glutFullScreenMulti( int left, int top, ...
として,上記の変更点を以下のようにする.
#code(C){{
if(!left && !right && !top && !bottom){
rect.left = 0;
rect.top = 0;
rect.right = GetSystemMetrics(SM_CXVIRTUALSCREEN);
rect.bottom = GetSystemMetrics(SM_CYVIRTUALSCREEN);
}
else{
rect.left = left;
rect.top = top;
rect.right = right;
rect.bottom = bottom;
}
}}
関数を呼び出すときにフルスクリーンの範囲を指定する.
**画像読み込み [#f3631798]
***OpenCVを利用 [#r3b986aa]
#code(C){{
#pragma comment(lib, "cv120.lib")
#pragma comment(lib, "cxcore120.lib")
#pragma comment(lib, "cvaux120.lib")
#pragma comment(lib, "highgui120.lib")
#include "cv.h"
#include "cxcore.h"
#include "highgui/highgui.h"
/*!
* OpenCVで画像読込み -> OpenGLテクスチャ登録
* @param[in] fn ファイル名
* @param[inout] tex_name テクスチャ名(0なら新たに生成)
* @param[in] mipmap ミップマップ使用フラグ
* @param[in] compress テクスチャ圧縮使用フラグ
*/
static int LoadGLTexture(const string &fn, GLuint &tex_na...
{
IplImage* img = cvLoadImage(fn.c_str(), CV_LOAD_IMAGE_CO...
if(!img){
return 0;
}
GLuint iformat, format;
int w, h, c;
w = img->width;
h = img->height;
c = img->nChannels;
// 画像フォーマット
format = GL_BGRA;
if(c == 1){
format = GL_LUMINANCE;
}
else if(c == 3){
format = GL_BGR;
}
// OpenGL内部の格納フォーマット
if(compress){
iformat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
if(c == 1){
iformat = GL_COMPRESSED_LUMINANCE_ARB;
}
else if(c == 3){
iformat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT ;
}
}
else{
iformat = GL_RGBA;
if(c == 1){
iformat = GL_LUMINANCE;
}
else if(c == 3){
iformat = GL_RGB;
}
}
//glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
// テクスチャ作成
if(tex_name == 0){
glGenTextures(1, &tex_name);
glBindTexture(GL_TEXTURE_2D, tex_name);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, G...
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (...
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CL...
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CL...
if(mipmap){
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, ...
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 6);
}
glTexImage2D(GL_TEXTURE_2D, 0, iformat, w, h, 0, format...
if(mipmap){
glGenerateMipmapEXT(GL_TEXTURE_2D);
}
}
else{
glBindTexture(GL_TEXTURE_2D, tex_name);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, format, G...
if(mipmap){
glGenerateMipmapEXT(GL_TEXTURE_2D);
}
}
glBindTexture(GL_TEXTURE_2D, 0);
return 1;
}
}}
ミップマップ作成にglGenerateMipmapEXTを使っている.
これはもともとFBO拡張の一部であるが,FBOなしでも使え,
ハードウェアによるアクセラレーションにも対応しているので...
代わりに,
gluBuild2DMipmaps(GL_TEXTURE_2D, iformat, w, h, format, ...
を用いてもよい.
**描画の画像保存 [#m6735e6c]
#code(C){{
bool SaveFrameBuffer(const string &fn, int w, int h)
{
int c = 3;
vector<unsigned char> img_buf(w*h*c);
int format = GL_BGRA;
if(c == 3){
format = GL_BGR;
}
glRasterPos2i(0, h);
glReadPixels(0, 0, w, h, format, GL_UNSIGNED_BYTE, &img_...
IplImage *cvimg;
cvimg = cvCreateImage(cvSize(w, h), IPL_DEPTH_8U, 3);
for(int i = 0; i < w; ++i){
for(int j = 0; j < h; ++j){
int idx = 3*(w*(h-j-1)+i);
//int idx = 3*(j*w+i);
int r, g, b;
r = img_buf[idx+0];
g = img_buf[idx+1];
b = img_buf[idx+2];
SetPixel(cvimg, i, j, r, g, b);
}
}
cvSaveImage(fn.c_str(), cvimg);
return true;
}
}}
*リンク集 [#tc599c2d]
**リファレンスなど [#hb624915]
-[[OpenGL.org:http://www.opengl.org/]]
-[[OpenGL Programming Guide:http://glprogramming.com/red/]]
-[[OpenGL Reference Manual:http://glprogramming.com/blue/]]
-[[OpenGL 2.1 Reference:http://www.opengl.org/sdk/docs/ma...
-[[GLUT API, version 3:http://opengl.jp/glut/]]
**GUIライブラリ [#v242b1ed]
-[[GLUT for Win32:http://www.xmission.com/~nate/glut.html]]
-[[freeglut:http://sourceforge.net/projects/freeglut/]]
-[[AntTweakBar GUI library:http://www.antisphere.com/Wiki...
-[[SDL:http://www.libsdl.org/]]
-[[GLUI:http://sourceforge.net/projects/glui/]]
**拡張ライブラリ [#t4c18768]
-[[glux:http://code.google.com/p/glux/]]
-[[GLEW:http://glew.sourceforge.net/glew.html]]
-[[OpenML:http://www.khronos.org/openml/]]
**3Dモデルダウンロード [#t3464473]
-[[CMU Graphics Lab Motion Capture Database:http://mocap....
-[[The Stanford 3D Scanning Repository:http://graphics.st...
CG分野で有名なStanford Bunny, Happy Buddha, Dragon, Armad...
-[[3DXtras:http://www.3dxtras.com/]] : 著作権フリーのさま...
-[[3D CHAYA:http://www.3dchaya.com/]] : 日本の城や刀など...
-[[3D Total:http://www.3dtotal.com/]] : 様々なモデル.STU...
-[[Rodluc2001:http://www.rodluc.com/]] : 西洋の城など.OB...
-[[ホンダ ウェブプラモ:http://www.honda.co.jp/hondafan/We...
終了行:
OpenGLに関して
-[[OpenGL - サンプルコード]]
-[[OpenGL - Vertex array]]
-[[OpenGL - VBO]]
-[[OpenGL - PBO]]
-[[OpenGL - FBO]]
-[[OpenGL - VAO]]
-[[GLEWについて]]
-----
#contents
-----
*freeglut [#b142c707]
***freeglutについて [#f1238cad]
GLUTはversion3.7 (1998年) を最後として,それ以降開発され...
[[freeglut:http://freeglut.sourceforge.net/]]はGLUT(OpenG...
GLUTからfreeglutに乗り換えるときは,単純にインクルードす...
***ダウンロードとインストール [#c3b3d84a]
#include(build_freeglut,title)
*TIPS [#i5035d09]
**平面クリップ [#y8fac125]
平面クリップを行うには,[[glClipPlane:http://www.opengl.o...
void glClipPlane(GLenum plane, const GLdouble *equation);
planeにはクリップ平面番号(GL_CLIP_PLANE0, GL_CLIP_PLANE1...
最大数は,GL_MAX_CLIP_PLANESを参照することで調べられる.
equationには平面方程式(ax+by+cz+d=0)の係数(a,b,c,d)を格納...
ax+by+cz+d<0の範囲がクリップされる.
平面クリップのON/OFFは,
glEnable(GL_CLIP_PLANE0);
glDisable(GL_CLIP_PLANE0);
**マルチサンプリングによるアンチエリアシング [#m4b6b092]
-描画する前にマルチサンプリングをONにする
glEnable(GL_MULTISAMPLE);
-GLUTの場合,glutInitDisplayModeにGLUT_MULTISAMPLEを追加...
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH...
-サンプリングの対応状況を調べる
GLint buf, sbuf;
glGetIntegerv(GL_SAMPLE_BUFFERS, &buf);
cout << "number of sample buffers is " << buf << endl;
glGetIntegerv(GL_SAMPLES, &sbuf);
cout << "number of samples is " << sbuf << endl;
buf,sbufが0ならばGPUが対応していない or ビデオカードの設...
NVIDIAのGPUの場合,
++NVIDIAコントロールパネルの3D設定の管理を開く.
++グローバル設定の「アンチエリアシング - モード」を「アプ...
++「アンチエリアシング - 設定」が選択できるようになってい...
-サンプリング本数をアプリケーションから設定する場合は,
上記「アンチエリアシング - モード」を「アプリケーションに...
ピクセルフォーマットを手動で設定する必要がある.
wglChoosePixelFormatARBを用いると設定は可能だがGLUTでは使...
freeglutを用いている場合は,freeglutのソースコードをいじ...
変更箇所は,
--freeglut_init.c : 89行目の/* SampleNumber */のところを...
変更後ライブラリをビルドし直す.~
私はサンプリング設定を変えるたびにライブラリをビルドし直...
プログラム実行時のコマンドラインオプションでサンプリング...
例えば,
glapp.exe -sample 8
とすればサンプリング数が8となる.
この設定のためには,freeglut_init.cの807行目あたりに
else if( strcmp(argv[i], "-sample") == 0 )
{
if( ++i >= argc )
fgError( "-sample parameter must be followed by ...
fgState.SampleNumber = atoi(argv[i]);
argv[i-1] = NULL;
argv[i] = NULL;
(*pargc) -= 2;
}
を追加する.
**DualViewなどでのフルスクリーン(Windows Only) [#j0018709]
GLUT,freeglutではglutFullScreen関数で全画面表示できる.
標準ではマルチディスプレイの場合,スパン設定なら問題ない...
メイン画面上でしかフルスクリーンにならない.
これは,DualViewではメインディスプレイのサイズがAPIが与え...
DualViewでは仮想的なスパン画面が設定されているので,これ...
freeglutのソースコードを変更する.freeglut_init.c の fghI...
fgDisplay.ScreenWidth = GetSystemMetrics( SM_CXSCREE...
fgDisplay.ScreenHeight = GetSystemMetrics( SM_CYSCREE...
の部分を
fgDisplay.ScreenWidth = GetSystemMetrics( SM_CXVIRTU...
fgDisplay.ScreenHeight = GetSystemMetrics( SM_CYVIRTU...
とすればよい.
glutFullScreen命令を呼んだときだけ変えたいときや別の関数...
freeglut_window.c内のglutFullScreen関数の,
#code(C){{
rect.left = 0;
rect.top = 0;
rect.right = fgDisplay.ScreenWidth;
rect.bottom = fgDisplay.ScreenHeight;
}}
を
#code(C){{
rect.left = 0;
rect.top = 0;
rect.right = GetSystemMetrics(SM_CXVIRTUALSCREEN);
rect.bottom = GetSystemMetrics(SM_CYVIRTUALSCREEN);
}}
などとする.
また,マルチディスプレイ用のフルスクリーン命令を新たに作...
この関数をコピーして名前を変えて,上記の変更をすればよい.
新しい関数を追加した場合(例えば,glutFullScreenMultiとす...
-freeglut_ext.hに関数宣言を追加
FGAPI void FGAPIENTRY glutFullScreenMulti( int left, ...
-freeglut_ext.cの最初の方の #define CHECK_NAME(x) に追加
CHECK_NAME(glutFullScreenMulti);
-freeglutdll.defに関数名(glutFullScreenMulti)を追加
また,任意のマルチディスプレイに対応するために,
関数の宣言を
void FGAPIENTRY glutFullScreenMulti( int left, int top, ...
として,上記の変更点を以下のようにする.
#code(C){{
if(!left && !right && !top && !bottom){
rect.left = 0;
rect.top = 0;
rect.right = GetSystemMetrics(SM_CXVIRTUALSCREEN);
rect.bottom = GetSystemMetrics(SM_CYVIRTUALSCREEN);
}
else{
rect.left = left;
rect.top = top;
rect.right = right;
rect.bottom = bottom;
}
}}
関数を呼び出すときにフルスクリーンの範囲を指定する.
**画像読み込み [#f3631798]
***OpenCVを利用 [#r3b986aa]
#code(C){{
#pragma comment(lib, "cv120.lib")
#pragma comment(lib, "cxcore120.lib")
#pragma comment(lib, "cvaux120.lib")
#pragma comment(lib, "highgui120.lib")
#include "cv.h"
#include "cxcore.h"
#include "highgui/highgui.h"
/*!
* OpenCVで画像読込み -> OpenGLテクスチャ登録
* @param[in] fn ファイル名
* @param[inout] tex_name テクスチャ名(0なら新たに生成)
* @param[in] mipmap ミップマップ使用フラグ
* @param[in] compress テクスチャ圧縮使用フラグ
*/
static int LoadGLTexture(const string &fn, GLuint &tex_na...
{
IplImage* img = cvLoadImage(fn.c_str(), CV_LOAD_IMAGE_CO...
if(!img){
return 0;
}
GLuint iformat, format;
int w, h, c;
w = img->width;
h = img->height;
c = img->nChannels;
// 画像フォーマット
format = GL_BGRA;
if(c == 1){
format = GL_LUMINANCE;
}
else if(c == 3){
format = GL_BGR;
}
// OpenGL内部の格納フォーマット
if(compress){
iformat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
if(c == 1){
iformat = GL_COMPRESSED_LUMINANCE_ARB;
}
else if(c == 3){
iformat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT ;
}
}
else{
iformat = GL_RGBA;
if(c == 1){
iformat = GL_LUMINANCE;
}
else if(c == 3){
iformat = GL_RGB;
}
}
//glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
// テクスチャ作成
if(tex_name == 0){
glGenTextures(1, &tex_name);
glBindTexture(GL_TEXTURE_2D, tex_name);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, G...
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (...
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CL...
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CL...
if(mipmap){
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, ...
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 6);
}
glTexImage2D(GL_TEXTURE_2D, 0, iformat, w, h, 0, format...
if(mipmap){
glGenerateMipmapEXT(GL_TEXTURE_2D);
}
}
else{
glBindTexture(GL_TEXTURE_2D, tex_name);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, format, G...
if(mipmap){
glGenerateMipmapEXT(GL_TEXTURE_2D);
}
}
glBindTexture(GL_TEXTURE_2D, 0);
return 1;
}
}}
ミップマップ作成にglGenerateMipmapEXTを使っている.
これはもともとFBO拡張の一部であるが,FBOなしでも使え,
ハードウェアによるアクセラレーションにも対応しているので...
代わりに,
gluBuild2DMipmaps(GL_TEXTURE_2D, iformat, w, h, format, ...
を用いてもよい.
**描画の画像保存 [#m6735e6c]
#code(C){{
bool SaveFrameBuffer(const string &fn, int w, int h)
{
int c = 3;
vector<unsigned char> img_buf(w*h*c);
int format = GL_BGRA;
if(c == 3){
format = GL_BGR;
}
glRasterPos2i(0, h);
glReadPixels(0, 0, w, h, format, GL_UNSIGNED_BYTE, &img_...
IplImage *cvimg;
cvimg = cvCreateImage(cvSize(w, h), IPL_DEPTH_8U, 3);
for(int i = 0; i < w; ++i){
for(int j = 0; j < h; ++j){
int idx = 3*(w*(h-j-1)+i);
//int idx = 3*(j*w+i);
int r, g, b;
r = img_buf[idx+0];
g = img_buf[idx+1];
b = img_buf[idx+2];
SetPixel(cvimg, i, j, r, g, b);
}
}
cvSaveImage(fn.c_str(), cvimg);
return true;
}
}}
*リンク集 [#tc599c2d]
**リファレンスなど [#hb624915]
-[[OpenGL.org:http://www.opengl.org/]]
-[[OpenGL Programming Guide:http://glprogramming.com/red/]]
-[[OpenGL Reference Manual:http://glprogramming.com/blue/]]
-[[OpenGL 2.1 Reference:http://www.opengl.org/sdk/docs/ma...
-[[GLUT API, version 3:http://opengl.jp/glut/]]
**GUIライブラリ [#v242b1ed]
-[[GLUT for Win32:http://www.xmission.com/~nate/glut.html]]
-[[freeglut:http://sourceforge.net/projects/freeglut/]]
-[[AntTweakBar GUI library:http://www.antisphere.com/Wiki...
-[[SDL:http://www.libsdl.org/]]
-[[GLUI:http://sourceforge.net/projects/glui/]]
**拡張ライブラリ [#t4c18768]
-[[glux:http://code.google.com/p/glux/]]
-[[GLEW:http://glew.sourceforge.net/glew.html]]
-[[OpenML:http://www.khronos.org/openml/]]
**3Dモデルダウンロード [#t3464473]
-[[CMU Graphics Lab Motion Capture Database:http://mocap....
-[[The Stanford 3D Scanning Repository:http://graphics.st...
CG分野で有名なStanford Bunny, Happy Buddha, Dragon, Armad...
-[[3DXtras:http://www.3dxtras.com/]] : 著作権フリーのさま...
-[[3D CHAYA:http://www.3dchaya.com/]] : 日本の城や刀など...
-[[3D Total:http://www.3dtotal.com/]] : 様々なモデル.STU...
-[[Rodluc2001:http://www.rodluc.com/]] : 西洋の城など.OB...
-[[ホンダ ウェブプラモ:http://www.honda.co.jp/hondafan/We...
ページ名: