コンピュータグラフィックスS 演習資料

Similar documents
コンピューターグラフィックスS

コンピューターグラフィックスS

免許法認定公開講座: コンピュータグラフィックス

OpenGL & GLUTの基本関数の説明

PowerPoint Presentation

/*p7-1-1*/

コンピュータグラフィックス特論Ⅱ

コンピュータグラフィックス特論Ⅱ

コンピュータグラフィックス特論Ⅱ

コンピュータグラフィックス特論Ⅱ

演算増幅器

ARToolKit プログラムの仕組み 1: ヘッダファイルのインクルード 2: Main 関数 3: Main Loop 関数 4: マウス入力処理関数 5: キーボード入力処理関数 6: 終了処理関数 3: Main Loop 関数 1カメラ画像の取得 2カメラ画像の描画 3マーカの検出と認識

コンピュータグラフィックス特論Ⅱ

コンピューターグラフィックスS

コンピュータグラフィックスS 演習資料

スライド 1

2 2 GLUI 2 GLUI 2.1 GLUI GLUI OpenGL OpenGL glut OpenGL glut C++ Linux, Windows (Visual C++, gcc), Macintosh glut glut GUI glut GUI CG glmultmatrix()

スライド 1

コンピューターグラフィックスS

2 2 2 OpenGL (R,G,B,A) 2.1 OpenGL (x y) width height pixels void glreadpixels(glint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum t

Microsoft PowerPoint - info_eng3_05ppt.pptx

Fair Curve and Surface Design System Using Tangent Control

コンピュータグラフィックス第8回

問 1 図 1 の図形を作るプログラムを作成せよ 但し ウィンドウの大きさは と し 座標の関係は図 2 に示すものとする 図 1 作成する図形 原点 (0,0) (280,0) (80,0) (180,0) (260,0) (380,0) (0,160) 図 2 座標関係 問 2

2 2 2 OpenGL (R,G,B,A) 2.1 OpenGL (x y) width height pixels void glreadpixels(glint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum t

1 1. Program 1 OpenCV (OpenCV Sample001) 1 /* 2 - > - > - >VC++ 3 ( ) 4 C:\opencv\build\include 5 ( ) 6 C:\opencv\build\x86\vc10\lib 7 - > - > - > - >

コンピュータグラフィックス基礎              No

Microsoft PowerPoint - kougi2.ppt

memo

スライド 1

GrWinを用いたグラフィクス・プログラミング

Microsoft PowerPoint - kougi4.ppt

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

沼津工業高等専門学校

データ構造とアルゴリズム論

C#の基本

Microsoft PowerPoint - [150421] CMP実習Ⅰ(2015) 橋本 CG編 第1回 幾何変換.pptx

CG

Taro-2分探索木Ⅰ(公開版).jtd

Field Logic, Inc. 標準モード 3D モデル作成 配置編 Field Logic, Inc. 第 1 版

Microsoft Word - povray.docx

画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

JAPLAシンポジウム資料 2009/12/5

PowerPoint Presentation

Taro-ポインタ変数Ⅰ(公開版).j

NCVIEW / NCVIEW Neo 2017 リリースノート A) 新機能概要 B) 主な改善 修正内容 (NCVIEW / NCVIEW Neo 2016 以降の改善 修正内容が記載されています ) C) 対応済みサポート受付番号一覧 D) 動作環境 以下文中の () に記載された番号はサポー

コンピュータグラフィックス

Graphical User Interface 描画する

PowerPoint Presentation

(4) モデルの消去 mqodeletemodel( model ); (5) 終了処理 ( プログラム終了時にやってください ) mqocleanup(); 3. 使い方 (2) 連番ファイルを読み込んで表示する場合 (1) 初期化 (ARToolKit の場合,argInit() の後に使用 )

Microsoft Word - Cプログラミング演習(10)

AquesTalk for WinCE プログラミングガイド

PowerPoint プレゼンテーション

SnNCutCnvs ステッカーウィザードを使ってデザインを作成する ここでは スターターキットに付属している A4 サイズ (210 mm 297 mm) のプリントステッカーを使用する場合の例を説明します [ ステップ 1] エリアサイズを変更します パソコンの場合 : 編集画面 >[ プロジェ

NB

PowerPoint プレゼンテーション

511_平面図の編集例

PowerPoint プレゼンテーション

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

PowerPoint プレゼンテーション

AquesTalk プログラミングガイド

アクション講座 第1回目

double rx[natom], ry[natom], rz[natom]; 原子の座標 速度 力 ポテンシャルエ double vx[natom], vy[natom], vz[natom]; ネルギーを受ける配列を準備 double fx[natom], fy[natom], fz[natom


ゲームグラフィックス特論

プログラミング実習I

PowerPoint Presentation

3D グラフィックス処理の一般過程 1. 3D グラフィックス処理の一般過程

第10章 OCR設定

産能大式フローチャート作成アドインマニュアル

< F2D D E6A7464>

内容 1 はじめに インストールの手順 起動の手順 Enterprise Architect のプロジェクトファイルを開く 内容を参照する プロジェクトブラウザを利用する ダイアグラムを開く 便利な機能.

Transcription:

コンピュータグラフィックス S 演習資料 第 4 回シェーディング マッピング 九州工業大学情報工学部システム創成情報工学科講義担当 : 尾下真樹 1. 演習準備 今回の演習も 前回までの演習で作成したプログラムに続けて変更を行う まずは シェーディングの演習のため 描画処理で 回転する一つの四角すいを描画するように変更する 画面をクリア ( ピクセルデータと Z バッファの両方をクリア ) glclear( GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT ); 変換行列を設定 ( ワールド座標系 カメラ座標系 ) glmatrixmode( GL_MODELVIEW ); glloadidentity(); gltranslatef( 0.0, 0.0, - camera_distance ); glrotatef( - camera_pitch, 1.0, 0.0, 0.0 ); gltranslatef( 0.0, -1.0, 0.0 ); 光源位置を設定 ( モデルビュー行列の変更にあわせて再設定 ) float light0_position[] = 10.0, 10.0, 10.0, 1.0 ; 地面を描画 glbegin( GL_POLYGON ); glcolor3f( 0.5, 0.8, 0.5 ); /* */ glvertex3f( 5.0, 0.0, 5.0 ); glvertex3f( 5.0, 0.0,-5.0 ); glvertex3f(-5.0, 0.0,-5.0 ); glvertex3f(-5.0, 0.0, 5.0 ); 他の描画処理は 全て 削除するかコメントアウト 中心に赤い四角すいを描画 ( 地面にめり込まないように (0,1,0) に移動 ) gltranslatef( 0.0, 1.0, 0.0 ); glrotatef( theta_cycle, 0.0, 1.0, 0.0 ); glcolor3f( 1.0, 0.0, 0.0 ); renderpyramid3(); バックバッファに描画した画面をフロントバッファに表示 glutswapbuffers(); 2. シェーディング ( 光源設定の変更 ) 本演習では 光源の設定の変更による シェーディングの効果の変化を確認する 現在のプログラムでは ワールド座標系の (10.0, 10.0, 10.0 ) の位置に 点光源を置く設定になっている 1

まず 点光源の効果をより大きくするために 光源の位置を (5.0, 3.0, 5.0) に移動してみる 光源位置を設定 ( モデルビュー行列の変更にあわせて再設定 ) float light0_position[] = 5.0, 3.0, 5.0, 1.0 ; 地面を描画 glbegin( GL_POLYGON ); glcolor3f( 0.5, 0.8, 0.5 ); glvertex3f( 5.0, 0.0, 5.0 ); glvertex3f( 5.0, 0.0,-5.0 ); glvertex3f(-5.0, 0.0,-5.0 ); glvertex3f(-5.0, 0.0, 5.0 ); 以上の修正を行い プログラムをコンパイル 実行し 点光源の効果を確認すること 地面が 原点を中心に x 方向 z 方向の幅がともに 10 の四角形として描画されており 光源の位置が (5.0, 3.0, 5.0) にあることから ちょうど 地面の右手前の角に 光が最も良く当たり 明るくなっていることが分かる 現在は 地面の四角形の 4 つの頂点に対してのみ 照明効果の計算 ( 色の計算 ) が行われ 四角面の内部の各ピクセルは 4 つの頂点の色を補間することで計算されている そのため 四角面の内部では 照明効果があまり正確ではない そこで 照明効果をより正確に表現するために 地面を x 方向 z 方向の幅がともに 1 の四角形を 10 10 =100 個並べたものとして描画するように修正してみる 光源位置を設定 ( モデルビュー行列の変更にあわせて再設定 ) float light0_position[] = 5.0, 3.0, 5.0, 1.0 ; 地面を描画 glcolor3f( 0.5, 0.8, 0.5 ); 2

このプログラムでは 並べて描画する四角形の 4 つの頂点が適切な座標になるように i, j にもとづいて頂点座標を計算している 以上の修正を行い プログラムをコンパイル 実行し さきほどのプログラムと比較して どのように描画結果が変わるかを確認すること 結果的に 描画される地面の大きさは同じだが 各四角形の頂点ごとに光源計算が行われるため 照明効果がより正確に計算され 結果的に 点光源の効果がよく分かるようになっている 次に 点光源ではなく ワールド座標系の原点から見て (5.0, 3.0, 5.0) の方向からの平行光源を設定してみる 光源位置の w 座標を 0 とすることで 点光源ではなく 平行光源となる 光源位置を設定 ( モデルビュー行列の変更にあわせて再設定 ) float light0_position[] = 5.0, 3.0, 5.0, 0.0 ; 以上の修正を行い プログラムをコンパイル 実行し さきほどのプログラムと比較して どのように描画結果が変わるかを確認すること 平行光源に変更することで 地面を構成する頂点に対して 同じ方向から光が来ることになり 結果的に 地面全体が単一の色で描画されることになる ( 地面の全ての頂点で法線が等しいため ) 最後に 演習課題として 最初の状態のように地面の右手前が照らされるのではなく 地面の左手前が照らされるように 光源の位置を修正してみよ 光源位置を設定 ( モデルビュー行列の変更にあわせて再設定 ) float light0_position[] =???,???,???,??? ; 3. テクスチャマッピング 本演習では テクスチャマッピングの例として 地面にテクスチャマッピングを適用してみる ファイルから読み込むテクスチャ画像のデータを格納するためのグローバル変数を追加する アニメーションのための変数 float theta_cycle = 0.0; 視点操作のための変数 float camera_pitch = -30.0; X 軸を中心とする回転角度 3

マウスのドラッグのための変数 int drag_mouse_r = 0; 右ボタンがドラッグ中かどうかのフラグ (1: ドラッグ中, 0: 非ドラッグ中 ) int int last_mouse_x; last_mouse_y; 最後に記録されたマウスカーソルのX 座標 最後に記録されたマウスカーソルのY 座標 テクスチャ画像データ int tex_width; int tex_height; unsigned char * tex_image = NULL; ファイルから BMP 画像を読み込むために サンプルプログラムとして用意されている BMP 画像読み込みを行う loadbitmap 関数が記述されたソースファイル (bitmap.h, bitmap.cpp) を使用する そのため まず プログラムの先頭に ヘッダファイルの読み込みを追加する GLUT ヘッダファイルのインクルード #include <GL/glut.h> Bitmap 読み込み関数のためのヘッダファイルのインクルード #include "bitmap.h" 次に 最初に呼ばれる環境初期化関数に テクスチャ画像を読み込みんで OpenGL が使うテクスチャとして登録する処理を追加する ここでは 最初に loadbitmap 関数を呼び出して kyushu.bmp というファイル名の画像を読み込んでいる その後 読み込んだ画像データを テクスチャとして設定している 環境初期化関数 void initenvironment( void ) テクスチャ画像の読み込み loadbitmap( "kyushu.bmp", &tex_image, &tex_width, &tex_height ); if ( tex_image == NULL ) return; テクスチャオブジェクトの設定 glteximage2d( GL_TEXTURE_2D, 0, GL_RGB, tex_width, tex_height, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_image ); テクスチャマッピングの方法を設定 gltexparameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); gltexparameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); gltexparameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); gltexparameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); 最後に 地面のポリゴンを描画するときに テクスチャマッピングを行うための処理を追加する テクスチャ画像を使用するように設定し 各頂点にテクスチャ座標を指定する 描画が終わったら テクスチャマッピングをオフにする ウィンドウ再描画時に呼ばれるコールバック関数 4

地面を描画 ( テクスチャマッピング ) glenable( GL_TEXTURE_2D ); gltexenvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL ); glcolor3f( 1.0, 1.0, 1.0 ); gltexcoord2f( (i+1) * 0.1, (j+1) * 0.1 ); gltexcoord2f( (i+1) * 0.1, j * 0.1 ); gltexcoord2f( i * 0.1, j * 0.1 ); gltexcoord2f( i * 0.1, (j+1) * 0.1 ); gldisable( GL_TEXTURE_2D ); 以上の処理の追加により テクスチャマッピングが行われた状態で地面が描画されるので コンパイル 実行して確認する このプログラムでは テクスチャ座標 (u,v) の (0.0, 0.0)~(1.0, 1.0) の範囲が地面に貼り付けられるように i, j にもとづいてテクスチャ座標を計算している 例えば i=0, j=0 のときには 4 頂点のテクスチャ座標は (0.1, 0.1)(0.1, 0.0)(0.0, 0.0)(0.0, 0.1) となり i=9, j=9 のときには 4 頂点のテクスチャ座標は (1.0, 1.0)(1.0, 0.9)(0.9, 0.9)(0.9, 1.0) となる なお コンパイルの際には bitmap.h と bitmap.cpp の 2 つのソースファイルを Visual Studio プロジェクトに追加して 一緒にコンパイル リンクを行う必要がある (Visual Studio プロジェクトへのソースファイルの追加方法は コンパイル方法の資料を参照する ) また 実行時には プロジェクトの実行ディレクトリ ( プロジェクトの実行ディレクトリの設定を変更していなければ プロジェクトファイルやソースファイルとディレクトリ ) に 画像ファイル kyushu.bmp を置いておく必要がある 以上の修正で テクスチャマッピングが正しく行われることを確認したら 次は テクスチャマッピングの適用方法を 以下のように 変更してみる ウィンドウ再描画時に呼ばれるコールバック関数 地面を描画 ( テクスチャマッピング ) glenable( GL_TEXTURE_2D ); gltexenvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); 5

適用方法を GL_MODULATE に変更することで 光源処理により色が変化するポリゴンのもとの色の影響を受けるようになる コンパイル 実行して 確認してみること 次に 地面を描画する際の 各頂点のテクスチャ座標 (u,v) を変更することで テクスチャの張り方を変更してみる ウィンドウ再描画時に呼ばれるコールバック関数 地面を描画 ( テクスチャマッピング ) glenable( GL_TEXTURE_2D ); gltexenvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL ); glcolor3f( 1.0, 1.0, 1.0 ); gltexcoord2f( (i+1) * 0.2, (j+1) * 0.2 ); gltexcoord2f( (i+1) * 0.2, j * 0.2 ); gltexcoord2f( i * 0.2, j * 0.2 ); gltexcoord2f( i * 0.2, (j+1) * 0.2 ); gldisable( GL_TEXTURE_2D ); 以上のように 各頂点のテクスチャ座標 (u,v) が 2 倍になるように修正し コンパイル 実行した結果を確認せよ このプログラムでは テクスチャ座標 (u,v) の (0.0, 0.0)~(2.0, 2.0) の範囲が地面に貼り付けられる テクスチャの初期化時に gltexparameteri() 関数を使ってテクスチャが繰り返されるように設定しているので (GL_REPEATE) テクスチャ座標値が 1.0 を超えた箇所には テクスチャが繰り返し貼り付けられることになる 6

最後に 演習課題として 下記の図の通り テクスチャ画像の 1/4 の領域のみを地面に貼り付けるように テクスチャ座標を適切に修正してみよ glcolor3f( 1.0, 1.0, 1.0 ); もし うまくテクスチャ座標を設定することが難しければ まずは左上 1/4 のみを地面全体に貼り付けるように各頂点のテクスチャ座標を修正して その後 各頂点のテクスチャ座標を右方向に 0.25 ずらすように修正すると良い 7