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

Similar documents
2 レンダリング方程式 レンダリングの完全なモデル化

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

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

PowerPoint Presentation

スライド 1

Fair Curve and Surface Design System Using Tangent Control

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

スライド 1

Microsoft PowerPoint - CEDEC2009_PG79_V3C

WebGL Safari WebGL WebGL Safari Kageyama (Kobe Univ.) / 5

PowerPoint プレゼンテーション

ライティングの基本要素ライト ( 光源 ) の位置や種類 強さを決め モデルやシーンの見せ方を決めることをライティングとよぶ また モデルの表面での光の反射の度合いを調節することで ライティングの効果を変化させることができる 今回は ライティングの基本的な要素を解説し SketchUp のライティン

WebGL Safari WebGL Kageyama (Kobe Univ.) Visualization / 55

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()

しずおかアプリ部 なるほど 3D グラフィック描画の仕組み いろんな職業の が る資料なので説明を簡単にしてある部分があります 正確には本来の意味と違いますが上記理由のためです ご了承ください monolizm LLC

Computer Graphics

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

/*p7-1-1*/

OpenGL & GLUTの基本関数の説明

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

0 21 カラー反射率 slope aspect 図 2.9: 復元結果例 2.4 画像生成技術としての計算フォトグラフィ 3 次元情報を復元することにより, 画像生成 ( レンダリング ) に応用することが可能である. 近年, コンピュータにより, カメラで直接得られない画像を生成する技術分野が生

C.1 GLSL ES 言語リファレンス この付録は WebGL 用のシェーダをプログラムするために使われるGLSL ES 言語のリファレンスである GLSL ESの詳細は GLSL_ES_Specifi

CG

XAML Do-It-Yourself シリーズ 第 12 回 3D グラフィックス -1-

Graphics with Processing モデリング 塩澤秀和 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

簡単な図面を書いてみよう 『 3D編 』

tc15_tutorial02

Microsoft PowerPoint - info_eng3_05ppt.pptx

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

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

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

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

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

Microsoft PowerPoint - 9.レンダリング2.pptx

iOS用OpenGL ESプログラミングガイド (TP )

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

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

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

Microsoft Word - 演習9.docx

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

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

また おすすめはしませんが C: Program Files Adobe Adobe After Effects [version] Support Files Plug-ins に配置することによって After Effects からのみ使用できます macos の場合 /Library/Appl

WebGL References Kageyama (Kobe Univ.) Visualization *4 2 / 54

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

Presentation

謗域・ュ逕ィppt

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

Microsoft Word - povray.docx

AutoCAD道場-なぜ「レイアウト」がいいのか?

. フォントを OS にインストールする インターネット等で入手したフリーのフォントをインストールすることにより Windows に標準でインストールされているフォント以外のものを利用することができます 多数のフォントをインストールするとパソコンの動作が遅くなります 必要なフォント以外はインストール

Mapmakerfor の手順下絵を準備 作者の設定した大きさで作成する場合 下絵にする地図を挿入 トリミングと大きさの調整 大きさを調整した画像を保存 下絵を背景に設定 作成画面の大きさを調整 1 自分で用意した下絵を背景にする場合 下絵を背景に設定 作成画面の大きさを調整 画像が大きい場合シート

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

スライド 1

cp-7. 配列

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

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

インテル® インテグレーテッド・グラフィックス上でリアルタイム・アップスケーリングを実現するチェッカーボード・レンダリング

WingneoINFINITY 公図自動結合 簡易マニュアル

CG

PowerPoint プレゼンテーション

はじめに - マニュアルエディター機能の概要 - Dojoの種類とマニュアルエディター機能解除について マニュアルレイアウトの生成 - マニュアルレイアウトの生成 基本編集 4 - 表紙の挿入 4 - 目次の挿入 5 - 一括変換 6 4 マニュアルビルド 9 4- MS Word 9

演算増幅器

ピクセル同期を利用した順不同半透明描画 (更新)

memo

スライド 1

ダイアログボックス内内でのパラメータ設定 : las ファイルを例として説明します 他の形式もことわりがない限り同様の操操作です 1 元パス : 変換換対象の点群群データのファイル (*.las) を保存しているフォルダを指指定します las ファイルが 1 つの場合合 直接 las ファイルが所在

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

NB

Transcription:

ゲームグラフィックス特論 第 13 回遅延レンダリング

2 Render To Texture テクスチャにレンダリング

3 レンダリング結果を素材として利用する 映り込みや屈折などの光学的効果 1. 視点を変更してレンダリングする 2. レンダリング結果をテクスチャとしてマッピングする このレンダリング結果は直接には画面に表示されない 素材を作成するために画面表示を行わずにレンダリングする オフスクリーンレンダリング かつては フレームバッファの表示領域外 ダブルバッファリング時のバックバッファ, など レンダリング結果をテクスチャメモリに転送する必要がある

4 フレームバッファオブジェクト 標準のフレームバッファ あらかじめ用意されている 描き込んだ図形はディスプレイに表示される フレームバッファオブジェクト Frame Buffer Object, FBO ユーザが自分で用意する 図形を描き込んでもディスプレイには表示されない テクスチャとして直接参照できる FBO を使えばテクスチャメモリに直接レンダリングできる Render To Texture

5 フレームバッファオブジェクトの作成 フレームバッファは複数のバッファの集合体 カラーバッファ ( 色 ) デプスバッファ ( 深度 ) ステンシルバッファ ( 型抜き ) それぞれのバッファとして使うメモリを確保する テクスチャにより確保する レンダリング結果をテクスチャとして利用する場合 レンダーバッファにより確保する レンダリング結果をテクスチャとして利用しない場合 確保したメモリを組み合わせてフレームバッファを構成する 使わないバッファのメモリは準備する必要は無い 準備しないバッファへの読み書きは禁止しておく

6 カラーバッファ用テクスチャの確保 #define FBOWIDTH 512 // フレームバッファオブジェクトの幅 #define FBOHEIGHT 512 // フレームバッファオブジェクトの高さ GLuint cb; // カラーバッファ用のテクスチャ名 glgentextures(1, &cb); glbindtexture(gl_texture_2d, cb); glteximage2d(gl_texture_2d, 0, GL_RGBA, FBOWIDTH, FBOHEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); これは多分どうでもいい ( その他のテクスチャ設定 ) glbindtexture(gl_texture_2d, 0); GL_RGBA だと [0,1] にクランプされる GL_RGBA32F なら実数 ( 単精度 ) が使える ( 浮動小数点テクスチャ ) レンダリングによって書き込むのでここで画像を読み込む必要は無い

7 デプスバッファ用テクスチャの確保 Gluint db; // デプスバッファ用のテクスチャ名 // デプスバッファ用のテクスチャを用意する glgentextures(1, &db); glbindtexture(gl_texture_2d, db); glteximage2d(gl_texture_2d, 0, GL_DEPTH_COMPONENT, FBOWIDTH, FBOHEIGHT, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, nullptr); これも多分どうでもいい デプスバッファなので ( その他のテクスチャ設定 ) glbindtexture(gl_texture_2d, 0);

8 フレームバッファオブジェクトの作成 // フレームバッファオブジェクトを作成する glgenframebuffers(1, &fb); glbindframebuffer(gl_framebuffer, fb); // カラーバッファとしてテクスチャを結合する glframebuffertexture2d(gl_framebuffer, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, cb, 0); // デプスバッファとしてテクスチャを結合する glframebuffertexture2d(gl_framebuffer, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, db, 0); // フレームバッファオブジェクトの結合を解除する glbindframebuffer(gl_framebuffer, 0);

9 レンダーバッファをデプスバッファに使う Gluint rb; // デプスバッファ用のレンダーバッファ名 // デプスバッファ用のレンダーバッファを用意する glgenrenderbuffers(1, &rb); glbindrenderbuffer(gl_renderbuffer, rb); glrenderbufferstorage(gl_renderbuffer, GL_DEPTH_COMPONENT, FBOWIDTH, FBOHEIGHT); // レンダーバッファの結合を解除する glbindrenderbuffer(gl_renderbuffer, 0);

10 フレームバッファオブジェクトの作成 // フレームバッファオブジェクトを作成する glgenframebuffers(1, &fb); glbindframebuffer(gl_framebuffer, fb); // カラーバッファとしてテクスチャを結合する glframebuffertexture2d(gl_framebuffer, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, cb, 0); // デプスバッファとしてレンダーバッファを結合する glframebufferrenderbuffer(gl_framebuffer, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rb); // フレームバッファオブジェクトの結合を解除する glbindframebuffer(gl_framebuffer, 0);

11 カラーバッファを使わない場合 // フレームバッファオブジェクトを作成する glgenframebuffers(1, &fb); glbindframebuffer(gl_framebuffer, fb); // フレームバッファオブジェクトにデプスバッファのテクスチャを結合する glframebuffertexture2d(gl_framebuffer, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, db, 0); // カラーバッファは無いので読み書きしない gldrawbuffer(gl_none); glreadbuffer(gl_none); シャドウマッピングに使うデプステクスチャ作成など // フレームバッファオブジェクトの結合を解除する glbindframebuffer(gl_framebuffer, 0);

12 フレームバッファオブジェクトへの描画 // フレームバッファオブジェクトを結合する glbindframebuffer(gl_framebuffer, fb); // ビューポートはフレームバッファオブジェクトのサイズ以下にする glviewport(0, 0, FBOWIDTH, FBOHEIGHT); // シーンの描画 glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); glflush(); // FBO への描き込み完了を待つなら glfinish(); // フレームバッファオブジェクトの結合を解除する glbindframebuffer(gl_framebuffer, 0);

13 応用例 FBO の使い方の実例

14 応用例 シャドウマッピング 映り込み処理

15 シャドウマッピング 1. フレームバッファオブジェクトを作成する カラーバッファは用いない / 読み書きしない デプスバッファはテクスチャ ( デプスマップ ) 2. 描画先をフレームバッファオブジェクトに切り替える 3. 光源側から見たシーンを描く 使用した投影変換行列とモデルビュー変換行列を保存しておく 4. 描画先を通常のフレームバファに戻す 5. 視点側から見たシーンを描く テクスチャをデプスマップとしてマッピングする

16 映り込み処理 ( 宿題のヒントに実装例 ) 1. フレームバッファオブジェクトを作成する カラーバッファはテクスチャ デプスバッファはレンダーバッファ 2. 描画先をフレームバッファオブジェクトに切り替える 3. 図形の鏡像をフレームバッファオブジェクトに描く 4. 描画先を通常のフレームバッファに戻す 5. 本来の図形を描く 6. 床を描く フレームバッファオブジェクトのカラーバッファに使ったテクスチャをマッピングする

17 Multiple Render Target 一度に複数の画像を生成する

18 マルチプルレンダーターゲット フレームバッファオブジェクト カラーバッファを複数持たせることができる マルチプルレンダーターゲット フラグメントシェーダが同時に複数のカラーバッファに描き込む機能 最終的なレンダリング結果は複数の画像を合成したもの 環境光の反射光, 拡散反射光, 鏡面反射光 映り込み, 透過光 物体表面の座標値, 物体表面の法線ベクトル 物体の識別子, 材質の識別子 マルチパスレンダリング 色情報ではないもの 浮動小数点テクスチャ かつてはレンダリング結果をフレームバッファ上で合成していた

19 複数のカラーバッファの準備 GLint cb, sb, ab; // 拡散反射光を格納するテクスチャを用意する glgentextures(1, &cb); glbindtexture(gl_texture_2d, cb); glteximage2d(gl_texture_2d, 0, GL_RGBA,( 中略 ), nullptr); // 鏡面反射光を格納するテクスチャを用意する glgentextures(1, &sb); glbindtexture(gl_texture_2d, sb); glteximage2d(gl_texture_2d, 0, GL_RGBA,( 中略 ), nullptr); // 環境光の反射光を格納するテクスチャを用意する glgentextures(1, &ab); glbindtexture(gl_texture_2d, ab); glteximage2d(gl_texture_2d, 0, GL_RGBA,( 中略 ), nullptr); glbindtexture(gl_texture_2d, 0);

20 フレームバッファオブジェクトの作成 // フレームバッファオブジェクトを作成 glgenframebuffers(1, &fb); glbindframebuffer(gl_framebuffer, fb); // フレームバッファオブジェクトに拡散反射光の格納先のテクスチャを結合 glframebuffertexture2d(gl_framebuffer, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, cb, 0); // フレームバッファオブジェクトに鏡面反射光の格納先のテクスチャを結合 glframebuffertexture2d(gl_framebuffer, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, sb, 0); // フレームバッファオブジェクトに環境光の反射光の格納先のテクスチャを結合 glframebuffertexture2d(gl_framebuffer, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, ab, 0); // フレームバッファオブジェクトの結合を解除 glbindframebuffer(gl_framebuffer, 0);

21 レンダーターゲット /* ** レンダーターゲットのリスト */ const GLenum bufs[] = { GL_COLOR_ATTACHMENT0, // カラーバッファ (拡散反射光) GL_COLOR_ATTACHMENT1, // 鏡面反射光 GL_COLOR_ATTACHMENT2, // 環境光の反射光 }; デフォルトのフレームバッファ (GL_FRONT_LEFT, GL_FRONT_RIGHT, GL_BACK_LEFT, GL_BACK_RIGHT) と GL_COLOR_ATTACHMENTn と を混在して 指定することはできない 複数のバッファを表す GL_FRONT, GL_BACK, GL_LEFT, GL_RIGHT, GL_FRONT_AND_BACK を指定することはできない

22 レンダーターゲットの指定 // フレームバッファオブジェクトを結合する glbindframebuffer(gl_framebuffer, fb); // レンダーターゲットを指定する gldrawbuffers(sizeof bufs / sizeof bufs[0], bufs); レンダーターゲットの数 (bufs の要素数 ) // シーンの描画 glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); glflush(); // レンダーターゲットを元に戻す gldrawbuffer(gl_back); // ダブルバッファリングのとき // フレームバッファオブジェクトの結合を解除する glbindframebuffer(gl_framebuffer, 0);

23 フラグメントシェーダの例 #version 150 core #extension GL_ARB_explicit_attrib_location : enable GLSL 3.3 in vec4 iamb; //(#version 環境光の反射光 330) A in vec4 idiff; // 拡散反射光 D 以降では不要 in vec4 ispec; // 鏡面反射光 S out (layout = 0) vec4 diffuse; // bufs[0] に指定したバッファ out (layout = 1) vec4 specular; // bufs[1] に指定したバッファ out (layout = 2) vec4 ambient; // bufs[2] に指定したバッファ void main() { diffuse = idiff; specular = ispec; ambient = iamb; }

24 法線ベクトル放射照度マップ深度 放射照度 環境遮蔽 MRT を使った 遅延レンダリング 環境遮蔽を考慮した放射照度

25 環境遮蔽を考慮した放射照度 アルベド 視線の反射ベクトル 環境マップ 拡散反射光強度 フレネル係数 映り込み 合成結果

26 Post Processing Effect 画像処理による映像効果

27 遅延レンダリング ある種の映像効果はレンダリング後に適用する Screen Space Ambient Occlusion (SSAO) グロー効果 ブルーム効果 モーションブラー Motion Blur as a Post-Processing Effect (GPU Gems 3, Chapter 27) ある種のアンチエリアシング手法 Morphological Antialiasing (MLAA) Reshetov, Alexander. "Morphological antialiasing." Proceedings of the Conference on High Performance Graphics 2009. ACM, 2009. Fast Approximate Anti Aliasing (FXAA) Lottes, T. "Fast approximate anti-aliasing." (2009). Subpixel Morphological Antialiasing (SMAA) Jimenez, Jorge, et al. "SMAA: Enhanced subpixel morphological antialiasing." Computer Graphics Forum. Vol. 31. No. 2pt1. Blackwell Publishing Ltd, 2012. 複雑な光学効果による陰影を可視面に対してのみ行う デプスバッファ法による隠面消去処理で捨てられてしまう無駄を避ける

28 残光エフェクト ( デザイン情報学科 15 期篠原史典氏 )

Screen Space Motion Blur 29

30 遅延レンダリングの手順 テクスチャメモリに画像を用意する 画像の読み込み Render To Texture Multiple Render Target クリッピング空間を覆う 1 枚のポリゴンを描く バーテックスシェーダ ほとんど何もしない クリッピング座標 (-1, -1)-(1, 1) からテクスチャ座標 (0, 0)-(1, 1) を生成する フラグメントシェーダ バーテックスシェーダから渡されたテクスチャ座標でテクスチャをサンプリングして画像処理を行う

31 通常のフレームバッファへに切り替える // フレームバッファオブジェクトの結合を解除する glbindframebuffer(gl_framebuffer, 0); // レンダーターゲットを元に戻す gldrawbuffer(gl_back); // シングルバッファリングなら GL_FRONT // ビューポートを表示領域のサイズに合わせる glviewport(0, 0, width, height); // 隠面消去処理は行わない gldisable(gl_depth_test); 先に保存しておくか OS あるいはウィンドウシステムから取得する

32 1 枚のポリゴンを描く // クリッピング空間いっぱいの矩形ポリゴン static const GLfloat pv[][2] = { { -1.0f, -1.0f }, { 1.0f, -1.0f }, { 1.0f, 1.0f }, { -1.0f, 1.0f }, }; // 表示領域を覆うポリゴンを描く GLuint vao; glgenvertexarrays(1, &vao); glbindvertexarray(vao); GLuint vbo; glgenbuffers(1, &vbo); glbindbuffer(vbo); glbufferdata(gl_array_buffer, sizeof pv, pv, GL_STATIC_DRAW); glvertexattribpointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0); glenablevertexattribarray(0); gldrawarrays(gl_triangle_fan, 0, sizeof pv / sizeof pv[0]);

33 バーテックスシェーダ #version 150 core in vec2 pv; out vec2 tc; // 矩形の頂点位置 // フラグメントシェーダに送るテクスチャ座標 void main() { tc = pv * 0.5 + 0.5; // (-1,-1)-(1,1) (0,0)-(1,1) の変換 gl_position = vec4(pv, 0.0, 1.0); }

34 フラグメントシェーダの例 #version 150 core uniform sampler2d diffuse; // 拡散反射光のテクスチャユニット uniform sampler2d specular; // 鏡面反射光のテクスチャユニット uniform sampler2d ambient; // 環境光のテクスチャユニット in vec2 tc; // 補間されたテクスチャ座標 out vec4 fc; // フラグメントの色 void main() { vec4 d = texture(diffuse, tc); vec4 s = texture(specular, tc); vec4 a = texture(ambient, tc); fc = d + s + a; // 足してるだけ }

35 輪郭強調フィルタ (4 近傍 ) #version 150 core uniform sampler2d diffuse; // 拡散反射光のテクスチャユニット uniform sampler2d specular; // 鏡面反射光のテクスチャユニット uniform sampler2d ambient; // 環境光のテクスチャユニット in vec2 tc; // 補間されたテクスチャ座標 out vec4 fc; // フラグメントの色 void main() { vec4 d = (texture(diffuse, tc) * 5.0 - textureoffset(diffuse, tc, ivec2( 0, -1)) - textureoffset(diffuse, tc, ivec2(-1, 0)) - textureoffset(diffuse, tc, ivec2( 1, 0)) - textureoffset(diffuse, tc, ivec2( 0, 1))) * 0.25; fc = d + texture(specular, tc) + texture2d(ambient, tc); } 0-1 0-1 5-1 0-1 0

36 宿題 FBO を使って平面への映り込み処理を実装してください. 次のプログラムは市松模様のついた平面の上を物体が移動します. https://github.com/tokoik/ggsample13 この市松模様のついた平面に物体が映り込むようにしてください. プログラムの各所を調べればヒントがあるかもしれません. 変更するのは ggsample13.cpp と ggsample13tile.vert / ggsample13tile.frag だけです ( 多分 ). ggsample13.cpp, ggsample13tile.vert, ggsample13tile.frag をアップロードしてください アップロード先 https://www.wakayama-u.ac.jp/~tokoi/lecture/gg/upload/ 根性があったら映り込みをぼかしてください. さらにシャドウマップ法を使って影を付けてください. シャドウマップ法にも FBO を使ってください.

37 宿題プログラムの生成画像 元のプログラム 期待する結果

38 映り込み処理の実装のヒント 鏡像は元のオブジェクトの上下 (y 軸 ) を反転します これによりポリゴンの表裏が反転しますので, 正しく陰影付けするには法線ベクトルを反転する必要があります ggsample13.vert をコピーして鏡像用のバーテックスシェーダ ggsample13mirror.vert を作成し法線ベクトル n を反転 ( 負号をつける ) // 正像用のプログラムオブジェクト GgSimpleShader simple("ggsample13.vert", "ggsample13.frag"); // 鏡像用のプログラムオブジェクト GgSimpleShader mirror("ggsample13mirror.vert", "ggsample13.frag"); 背面カリングも反転 ( 表面をカリング ) します glcullface(gl_front); max(dot(n, l), 0.0) を abs(dot(n, l)) にすれば simple.vert と共用にできるけど

39 カラーバッファのテクスチャの作成 // フレームバッファオブジェクトの解像度 const GLsizei fbowidth(1024), fboheight(1024); この場合はウィンドウのサイズを気にしなくてよい // カラーバッファ用のテクスチャを用意する GLuint cb; glgentextures(1, &cb); glbindtexture(gl_texture_2d, cb); glteximage2d(gl_texture_2d, 0, GL_RGBA, fbowidth, fboheight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); gltexparameteri(gl_texture_2d, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); gltexparameteri(gl_texture_2d, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); gltexparameteri(gl_texture_2d, GL_TEXTURE_MIN_FILTER, GL_LINEAR); gltexparameteri(gl_texture_2d, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

40 レンダーバッファの作成 // デプスバッファ用のレンダーバッファを用意する GLuint rb; glgenrenderbuffers(1, &rb); glbindrenderbuffer(gl_renderbuffer, rb); glrenderbufferstorage(gl_renderbuffer, GL_DEPTH_COMPONENT, fbowidth, fboheight);

41 フレームバッファオブジェクトの作成 // 映り込み用のフレームバッファオブジェクトを作成する GLuint fb; glgenframebuffers(1, &fb); glbindframebuffer(gl_framebuffer, fb); // FBO のカラーバッファにテクスチャを取り付ける glframebuffertexture2d(gl_framebuffer, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, cb, 0); // FBO のデプスバッファにレンダーバッファを取り付ける glframebufferrenderbuffer(gl_framebuffer, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rb);

42 鏡像の変換行列とその光源位置を求める // 正像のビュー変換行列を mv に求める const GgMatrix mv(gglookat(0.0f, 3.0f, 8.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f)); // 視点座標系の光源位置を求める mv.projection(lightproperty.position, normal); // 鏡像のビュー変換行列を mr に求める const GgMatrix mr(mv * ggscale(1.0f, -1.0f, 1.0f)); // 鏡像の視点座標系における光源位置 GLfloat reflect[4]; mr.projection(reflect, normal);

43 FBO にレンダリング開始 // ビューポートをフレームバッファオブジェクトのサイズに合わせる glviewport(0, 0, fbowidth, fboheight); // フレームバッファオブジェクトを結合する glbindframebuffer(gl_framebuffer, fb); // フレームバッファオブジェクトの画面消去 glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); // 鏡像用のシェーダの選択 mirror.use(); mirror.selectlight(light.get()); light->loadlightposition(reflect);

44 FBO に鏡像をレンダリング // 前面をカリングする glcullface(gl_front); // 鏡像をフレームバッファオブジェクトに描画 drawobjects(mirror, mp, mr, object.get(), material.get(), objects, t); // 背面のカリングに戻す glcullface(gl_back); // フレームバッファオブジェクトの結合を解除する glbindframebuffer(gl_framebuffer, 0); // ビューポートをウィンドウのサイズに戻す glviewport(0, 0, window.getwidth(), window.getheight());

45 正像をレンダリング // 画面消去 glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); // 正像用のシェーダの選択 simple.use(); simple.selectlight(light.get()); light->loadlightposition(normal); // 正像の描画 drawobjects(simple, mp, mv, object.get(), material.get(), objects, t);

46 床面はカラーテクスチャを参照して描画 // 床面用のシェーダの選択 floor.use(); floor.selectlight(light.get()); // 床面の描画 floor.selectmaterial(tile.get()); floor.loadmatrix(mp, mv.rotatex(-1.5707963f)); glactivetexture(gl_texture0); glbindtexture(gl_texture_2d, cb); rectangle->draw();

47 拡張課題 映り込みをぼかす さらに影を追加する