GLUT
GLUTとは,GL Utility Toolkitの略で,Processingの様に用意されている関数の内部を書くだけで,Windowを作ったり,マウスイベント,キーボードイベントをアサインできるライブラリである.
/* MakeWindowUsingGlut_1.c */
/*
OSXとWindows,LinuxでOpenGL関係のヘッダファイルの名前が違うため
以下の様に記述する.
*/
#ifdef __APPLE__
#include <OpenGL/opengl.h>
#include <GLUT/glut.h>
#else
#include <GL/gl.h>
#include <GL/glut.h>
#endif
void display(void)
{
//この関数の中身がMainLoop.関数の名前は自由につけられる.
//(Processingでいう所のdraw関数にあたる)
}
int main(int argc, char *argv[])
{
//C言語の場合の一番最初に実行される関数
//(Processingでいう所のsetup関数にあたる)
// OpenGL/GLUT 環境の初期化
glutInit(&argc, argv);
// ウィンドウを開く.引数はWindowの名前.
glutCreateWindow("MakeWindowsUsingGlut_1");
// ウィンドウへの描画MainLoop関数の登録
glutDisplayFunc(display);
// メインループ開始
glutMainLoop();
return 0;
}
/* MakeWindowUsingGlut_2.c */
#ifdef __APPLE__
#include <OpenGL/opengl.h>
#include <GLUT/glut.h>
#else
#include <GL/gl.h>
#include <GL/glut.h>
#endif
// プロトタイプ宣言
void display();
void reshape(int width, int height);
void mouse(int button, int state, int x, int y);
void motion(int x, int y);
void keyboard(unsigned char key, int x, int y);
// 標準で呼ばれるように設定する関数displayとreshape
void display(void)
{
//実際に塗りつぶす.
//GL_COLOR_BUFFER_BITという定数タグで,glClearColorで指定した色を呼び出す
glClear(GL_COLOR_BUFFER_BIT);
//最後に「これまで書いてきた命令を使って描画!」という命令を下す
//なぜ「Swap Buffers」なのかは後で述べる
glutSwapBuffers();
}
void reshape(int width, int height){
//Windowの大きさや形を変更した時に呼ばれる関数とする
//引数として1番目に変更された後の幅,2番目に変更された後の高さが入ってくる
//最後に自動的にdisplay関数を呼ぶという設定
glutPostRedisplay();
}
void mouse(int button, int state, int x, int y){
//マウスがクリックされた時に呼ばれる関数とする
//正確には,ボタンを離した時も呼ばれるため,クリックすると2度この関数が呼ばれる
//xとyには座標,
//buttonには左ボタンを表す定数タグGLUT_LEFT_BUTTONか
//右ボタンGLUT_RIGHT_BUTTONが入ってくる
//stateには,GLUT_DOWN(押した時), GLUT_UP(離した時)が入ってくる
//組み合わせを if(button == )で指定する
if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){
//左クリックされた時
float redColor = 0.0;
float greenColor = 1.0;
float blueColor = 1.0;
//塗りつぶす色を再指定する
glClearColor(redColor, greenColor, blueColor, 0.0);
}
else if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN){
//右クリックされた時
float redColor = 1.0;
float greenColor = 0.0;
float blueColor = 1.0;
glClearColor(redColor, greenColor, blueColor, 0.0);
}
glutPostRedisplay();
}
void motion(int x, int y){
//マウスがウィンドウ上でドラッグされた時に呼ばれる関数とする
//xとyにはマウスが動いた時のxとy
float redColor = (float)x / 640.0;
float greenColor = (float)y / 480.0;
float blueColor = 1.0;
glClearColor(redColor, greenColor, blueColor, 0.0);
glutPostRedisplay();
}
void keyboard(unsigned char key, int x, int y){
//キーボードが押された時に呼ばれる関数とする
//xとyは,キーボードが押された時のマウス座標が入ってくる
float redColor = 0.0;
float greenColor = 0.0;
float blueColor = 0.0;
if(key == 'r'){
redColor = 1.0;
greenColor = 0.0;
blueColor = 0.0;
}
else if(key == 'g'){
redColor = 0.0;
greenColor = 1.0;
blueColor = 0.0;
}
else if(key == 'b'){
redColor = 0.0;
greenColor = 0.0;
blueColor = 1.0;
}
glClearColor(redColor, greenColor, blueColor, 0.0);
glutPostRedisplay();
}
// main関数
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
// 描画モードの設定,色モードはRGBA, ダブルバッファを設定する
// ダブルバッファについては後の項で述べる
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
// ウィンドウの初期サイズを決める
glutInitWindowSize(640, 480);
// ウィンドウの生成
glutCreateWindow("MakeWindowUsingGlut_2");
// ウィンドウへのdisplay, reshape, mouse, motion, keyboard関数の登録
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc(keyboard);
//塗りつぶす色を指定: RGBAでそれぞれ0.0~1.0まで
//透明度は0.0の時不透明〜1.0で完全に透明
glClearColor(1.0, 1.0, 1.0, 0.0);
// メインループ開始
glutMainLoop();
return 0;
}