• 検索結果がありません。

第3章 OpenGL の基礎

N/A
N/A
Protected

Academic year: 2021

シェア "第3章 OpenGL の基礎"

Copied!
23
0
0

読み込み中.... (全文を見る)

全文

(1)

. . . . . . .. . . .

3

OpenGL

の基礎

畔上 秀幸 名古屋大学 情報科学研究科 複雑系科学専攻 April 20, 2012 1 / 23

(2)

. . . .

§3.1

はじめに

(目標)

(3)

. . . .

§3.2 OpenGL

とは

. OpenGLとは . . . .. . . .

OpenGL (Open Graphics Library)は Silicon Graphics, Inc. が中心となっ て 2 次元,3 次元図形の描画のために開発した API (Application Program Interface)である [4].

特徴

UNIX系 OS と Windows と Macintosh のいずれでも動く.

リアルタイムでインタラクティブに表示を変えることができる.

主な用途

CAD,CG モデラーで使われている.

(4)

. . . .

§3.3 OpenGL

の構成

GLUT(OpenGL Utility Toolkit)と OpenGL本体で構成される.

GLUT

OpenGL GLU GL

描画ハードウェア OpenGL アプリケーションプログラム

ウィンドウシステム

GLUTは GUI Toolkit の一つである.

ウィンドウのオープン

マウス,キーボードの入力などのイベント処理

(5)

. . . .

§3.4

空のウィンドウ

空のウィンドウを開く. . program3 1.c . . . .. . . . #include <GL/glut.h> static void display(void); int main(int argc,

char *argv[]) { glutInit(&argc, argv); glutCreateWindow(argv[0]); glutDisplayFunc(display); glutMainLoop(); return 0; } . . .. . . .

static void display(void) {

}

(6)

. . . .

§3.4

空のウィンドウ

(cnt.)

. glutInit() . . . .. . . . #include <GL/glut.h>

void glutInit(int *argc, char **argv);

GLUTを初期化する. 引数には main の引数を渡す. . glutCreateWindow() . . . .. . . . #include <GL/glut.h>

int glutCreateWindow(char *name);

ウィンドウを開く.

引数name はそのウィンドウのタイトルバーに表示される.

(7)

. . . .

§3.4

空のウィンドウ

(cnt.)

. glutDisplayFunc() . . . .. . . . #include <GL/glut.h>

void glutDisplayFunc(void (*func)(void));

ウィンドウの再描画が必要なときに,関数のポインタfuncで指定 した関数が実行される. . glutMainLoop() . . . .. . . . #include <GL/glut.h> void glutMainLoop(void); ループ処理に入り,イベントの待ち受け状態になる. 7 / 23

(8)

. . . .

§3.5

矩形を描く

. program3 2.c . . . .. . . .

int main(int argc, char *argv[]) { ... /* Windowの設定*/ glutInitDisplayMode(GLUT_RGBA); glutInitWindowSize(250, 250); glutInitWindowPosition(100, 200); glutCreateWindow(argv[0]); /* 背景色*/ glClearColor(0.0, 0.0, 0.0, 0.0); /* 画面にモノを描画*/ glutDisplayFunc(display); ... }

(9)

. . . .

§3.5

矩形を描く

(cnt.)

. . .. . . .

static void display(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); glBegin(GL_POLYGON); glVertex2f(0.5, 0.5); glVertex2f(-0.5, 0.5); glVertex2f(-0.5, -0.5); glVertex2f(0.5, -0.5); glEnd(); glFlush(); } 9 / 23

(10)

. . . .

§3.5

矩形を描く

(cnt.)

. glutInitDisplayMode() . . . .. . . .

void glutInitDisplayMode(unsigned int mode);

ディスプレイの表示モードを設定する.

modeにGLUT RGBAを指定することで RGBA (赤, 緑, 青, 透明度)

の色指定,GLUT INDEX を指定することでインデックスカラー モードとなる. . glutInitWindowSize() . . . .. . . .

void glutInitWindowSize(int w, int h);

新たに開くウィンドウの幅と高さを指定する.開いた後のウィンド

(11)

. . . .

§3.5

矩形を描く

(cnt.)

. glutInitWindowPosition() . . . .. . . .

void glutInitWindowPosition(int x, int y);

新たに開くウィンドウの位置を指定する. . glClearColor() . . . .. . . .

void glClearColor(GLclampf R, GLclampf G, GLclampf B, GLclampf A); 背景色を設定する. R,G,B,Aは赤, 緑, 青, 不透明度(α 値)の強さを示す GLclampf型 (float型と等価) 0∼ 1 の値とする.(0, 0, 0) は 黒色, (1, 1, 1) は白色を表す. 11 / 23

(12)

. . . .

§3.5

矩形を描く

(cnt.)

. glClear() . . . .. . . .

void glClear(GLbitfield mask);

maskには消去するバッファ(メモリ) を指定する.

GL COLOR BUFFER BITで描画エリアの消去

GL DEPTH BUFFER BIT で隠面消去処理用奥行情報の消去

このほかに,ステンシルバッファ, オーバーレイバッファなどの消 去がある. . glFlush() . . . .. . . . void glFlush(void); 実行されていない OpenGL の命令を全部実行する.

(13)

. . . .

§3.5

矩形を描く

(cnt.)

. glBegin() ... glEnd . . . .. . . .

void glBegin(GLnum mode); ...

void glEnd(void);

図形の関数を置く環境を用意する.

mode には描画する図形のタイプを指定する.

(14)

. . . .

§3.5

矩形を描く

(cnt.)

. . .. . . . mode に指定できる図形のタイプ GL POINTS:点を打つ. GL LINES:2点を直線で結ぶ. GL LINE STRIP:折れ線を描く. GL LINE LOOP:折れ線を描き,始点と終点の間も結ぶ. v0 v1 v2 v3 v0 v1 v2 v3 v0 v1 v2 v3

(15)

. . . .

§3.5

矩形を描く

(cnt.)

. . .. . . . GL TRIANGLES / GL QUADS: 3あるいは4点を組にして,三角形 あるいは四角形を描く.

GL TRIANGLE STRIP / GL QUAD STRIP:一辺を共有しながら帯 状に三角形あるいは四角形を描く. GL TRIANGLE FAN:一辺を共有しながら扇状に三角形を描く. GL POLYGON:凸多角形を描く. v0 v1 v2 v3 v5 v4 v0 v1 v2 v3 v4

GL TRIANGLES GL TRIANGLE STRIP

v0 v1 v2 v3 v4 v0 v1 v2 v3 v4

GL TRIANGLE FAN GL POLYGON

(16)

. . . .

§3.5

矩形を描く

(cnt.)

. . .. . . .

voidglVertex2f(GLfloat x, GLfloat y)

頂点の座標値を設定

引数の型はGLfloat (floatと等価)

3, 4次元(x,y,z), (x,y,z,w)のときはglVertex3f (), glVertex4f ()

引数がdouble型のときはglVertex?d(), int型のときはglVertex?i()

引数がポインタのときはvoid glVertex??v()

voidglColor3f(GLfloat r, GLfloat g, GLfloat b)

描画色を指定

r,g,bには赤,緑,青の強さを0∼1の範囲で指定 r,g,b,aのときはvoid glColor4f( )

(17)

. . . .

§3.6

星を描く

. program3 3.c . . . .. . . . void display(void) { ...

for(i=0; i<STAR_NUM; i++){

/* 位置,輝度,大きさを乱数で決める */ x = 2.0*random_num()-1.0; y = 2.0*random_num()-1.0; brightness = random_num(); size = STAR_SIZE*random_num(); /* 0.0∼STAR_SIZEの大きさにする */ /* 星をひとつ描画 */

draw_point(x, y, brightness, size); }

glFlush(); }

(18)

. . . .

§3.6

星を描く

(cnt.)

. rand . . . .. . . . int rand(void); 0∼RAND MAX の間の擬似乱数を返す. 通常,乱数の種を設定する関数 srand()に時間などの値を入れて初 期化する.

rand() の返り値と RAND MAX は int 型であるため,1.0 をかけて 浮動小数型に変換しなければ,常に 0 になる.

(19)

. . . .

§3.6

星を描く

(cnt.)

ギザギザを目立たなくするために,境界線の周囲のピクセルに中間色 の点を配置する手法をアンチエイリアシング(anti-aliasing)と呼ぶ. . アンチエイリアス処理 . . . .. . . . /* 混合処理の設定 */ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); /* 混合処理を ON */ /* アンチエイリアス処理 */ glEnable(GL_POINT_SMOOTH); glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); 19 / 23

(20)

. . . .

§3.6

星を描く

(cnt.)

. . .. . . . アンチエイリアシングの対象設定

glEnable(GL POINT SMOOTH): 点 glEnable(GL LINE SMOOTH): 線 glEnable(GL POLYGON SMOOTH): 面

描画は速いがギザギザ(デフォルト設定)

glHint(GL POINT SMOOTH HINT, GL FASTEST);

glHint(GL LINE SMOOTH HINT, GL FASTEST);

glHint(GL POLYGON SMOOTH HINT, GL FASTEST);

綺麗だが遅い

glHint(GL POINT SMOOTH HINT, GL NICEST);

glHint(GL LINE SMOOTH HINT, GL NICEST);

(21)

. . . .

§3.7

シルピンスキーのギャスケット

シルピンスキーのギャスケットを描く. . program3 4.c . . . .. . . . length /= 2.0; /* 再帰関数 */ if(length > 0.01){

draw_gasket(x0, y0, length);

draw_gasket(mid_point(x0, x1), mid_point(y0, y1), length);

draw_gasket(mid_point(x2, x0), mid_point(y2, y0), length);

}

(22)

. . . .

§3.8

まとめ

OpenGLとは何か,OpenGL の構成,基本的な機能をみてきた. . . 1 OpenGLとは,2 次元,3 次元形状の描画のために開発された API である. . .

2 OpenGLは GLUT と OpenGL 本体で構成される.GLUT はウィン

ドウを開く機能をもつ. .

.

3 基本的なプログラムにより 2 次元図形を描けることを確認した.ア

(23)

. . . .

参考文献

[1] Mark J. Kilgard.

The OpenGL Utility Toolkit (GLUT) programming interface API version 3(日本語翻訳版). http://opengl.jp/glut/index.html. [2] 林武文,加藤清敬. OpenGLによる3次元CGプログラミング. コロナ社, 2003. [3] 床井浩平. GLUTによる「手抜き」OpenGL入門. http://www.wakayama-u.ac.jp/˜tokoi/opengl/libglut.html. [4] OpenGL公式サイト. http://www.opengl.org/. 23 / 23

参照

関連したドキュメント

(3) 共連続ポリマーブレンド中におけるカーボンナノチューブの界面局在化 (第 4 章) 第 4 章では、非相溶ポリマーブレンドの相界面に

本論文の構成は、第 1 章から第 3 章で本論文の背景と問題の所在について考察し、第 4

第二章 固定資産の減損に関する基本的な考え方 第一節 はじめに 第二節 各国の基本的な考え方と基礎概念との結びつき 第一項 米国基準 第二項 国際会計基準 第三項

Jagtiani,J., Nathan,A., and Sick,G.,[1995], "Scale economies and cost complementarities in commercial banks: On-and off-balance-sheet activities," Journal of Banking & Finance, No..

かであろう。まさに UMIZ の活動がそれを担ってい るのである(幼児保育教育の “UMIZ for KIDS” による 3

The principle is a triangulation using distances between transmitters attached to a robot arm and receivers placed around the work space of the robot.. An electric spark which works

始めに山崎庸一郎訳(2005)では中学校で学ぶ常用漢字が149字あり、そのうちの2%しかル

この 文書 はコンピューターによって 英語 から 自動的 に 翻訳 されているため、 言語 が 不明瞭 になる 可能性 があります。.. このドキュメントは、 元 のドキュメントに 比 べて