プロジェクト演習Ⅳ インタラクティブゲーム制作 プログラミング4

Slides:



Advertisements
Similar presentations
Absolute Orientation. Absolute Orientation の問題 二つの座標系の間における剛体 (rigid body) 変換を復元す る問題である。 例えば: 2 台のステレオカメラから得られた3次元情報の間の関 係を推定する問題。 2 台のステレオカメラから得られた3次元情報の間の関.
Advertisements

基礎セミ第7章 (1-4) 偏光のしくみと応用 12T5094E 龍吟. 目次 光の偏光とは? 複屈折とは? 偏光を作り出すもの (偏光プリズム、偏光板、位相板)
池内研究室 Computer Vision Laboratory 東京大学 The University of Tokyo 偏光レイトレーシング 宮崎大輔 2004 年 6 月 22 日(火) CVL セミナー.
Ruth Onn, Alfred Bruckstein (Int J Comp Vision 1990)
計測情報処理論(4) レンズの基礎.
ゲーム開発者向け最新技術論文の解説・実装講座
今回の内容 シェーディング マッピング 光の効果の表現 表面の素材の表現 オブジェクトの形状表現 光の効果の表現 表面の素材の表現
豊洲 304教室 15 JULY コンピュータグラフィックス 2008年度版.
情報処理演習 (9)グラフィックス システム科学領域 日浦 慎作.
プログラミング演習3 李 亜民クラス 第2回 ラスタライズ.
パノラマ動画像モデルによる 仮想空間表現システムの研究
影付け,映り込み,光の屈折・反射などが表現でき,リアルな画像を生成できるレイトレーシング法について説明する.
プロジェクト演習Ⅳ インタラクティブゲーム制作 プログラミング4
3DCG技法についての 調査報告 ○○県立○○高等学校 1年は組 グループ0.
       光の種類 理工学部物理科学科 07232034 平方 章弘.
知識情報演習Ⅲ(後半第1回) 辻 慶太(水)
平成23年8月 情報学群 岡田 守 このスライドは, 前川佳徳編著による「コンピュータグラフィックス」(オーム社)を基に作成されている.
Copyright 2011 アイデアクラフト 開米瑞浩 All rights reserved.
WWW上の3次元空間表現 A three-dimesional space expression on WWW
レンダリングにおいて写実性を高めるための処理である,シェーディングとテクスチャマッピングについて述べる.
第3回:ボールを上下に動かそう! (オブジェクトの移動、一次元)
プロジェクト演習Ⅳ インタラクティブゲーム制作 プログラミング4
高山建志 五十嵐健夫 テクスチャ合成の新たな応用と展開 k 情報処理 vol.53 No.6 June 2012 pp
第11回 オブジェクト(ベクトル,頂点,面)のクラス化とフラットシェーディング
コンピュータグラフィックスS 第6回 第6回 レンダリング・パイプライン システム創成情報工学科 尾下 真樹
プロジェクト演習Ⅱ インタラクティブゲーム制作 イントロダクション2
CGと形状モデリング 授業資料 長井 超慧(東京大学)
レイトレーシング法による 太陽光シミュレーション
顔部品の検出システムの構築 指導教員 廉田浩 教授 1DS04188W  田中 甲太郎.
基礎プログラミング演習 第10回.
コンピュータグラフィックスS 第13回 第13回 演習(4):シェーディング、マッピング システム創成情報工学科 尾下 真樹
CG講座 裏 Mental-ray編.
Computer Graphics 第3回 座標変換 芝浦工業大学情報工学科 青木 義満
CGと形状モデリング 授業資料 1,2限: 大竹豊(東京大学) 3,4限: 俵 丈展(理化学研究所)
Cプログラミング演習 第7回 メモリ内でのデータの配置.
電界中の電子の運動 シミュレータ作成 精密工学科プログラミング基礎 資料.
ポリゴンメッシュ (1) - データ構造とレンダリングに必要な計算 -
点・線分・多角形を レンダリングする方法 東京大学 精密工学専攻 大竹豊.
OpenGLライブラリを用いた3次元フラクタルの描画
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
構造情報に基づく特徴量を用いた グラフマッチングによる物体識別 情報工学科 藤吉研究室  EP02086 永橋知行.
Computer Graphics 第10回 レンダリング(4) マッピング
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
可視面・不可視面の判定方法と隠れ面(不可視面)の消去法について述べる.
主成分分析 Principal Component Analysis PCA
重力レンズ効果による画像の変形と明るさの変化
階層的境界ボリュームを用いた 陰関数曲面の高速なレイトレーシング法
プロジェクト演習Ⅱ インタラクティブゲーム制作
プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作
CGと形状モデリング 授業資料 1,2限: 大竹豊(東京大学) 3,4限: 俵 丈展(理化学研究所)
プロジェクト演習Ⅳ インタラクティブゲーム制作 プログラミング4
文化財のデジタル保存のための 偏光を用いた透明物体形状計測手法
プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作
わかりやすいパターン認識 第7章:部分空間法  7.1 部分空間法の基本  7.2 CLAFIC法                  6月13日(金)                  大城 亜里沙.
コンピュータグラフィックス 実習3: 光線追跡法
プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作
プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作
過学習を考慮した IS1-60 AAMパラメータの選択と回帰分析による 顔・視線方向同時推定 顔・視線同時推定 研究背景
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
All images are compressed.
大阪工業大学 情報科学部 情報システム学科 学生番号 B02-014 伊藤 誠
ライティング メディアデザイン演習.
バネモデルの シミュレータ作成 精密工学科プログラミング基礎 資料.
シミュレーション演習 G. 総合演習 (Mathematica演習) システム創成情報工学科
点・線分・多角形を レンダリングする方法 東京大学 精密工学専攻 大竹豊.
プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作
免許法認定公開講座: コンピュータグラフィックス
VB6.0でグラフを書こう(とりあえず2次元)
第7章 そろそろ int 以外も使ってみよう! ~データ型 double , bool~
CGと形状モデリング 授業資料 1,2限: 大竹豊(東京大学) 3,4限: 俵 丈展(理化学研究所)
Presentation transcript:

プロジェクト演習Ⅳ インタラクティブゲーム制作 プログラミング4 2012/11/28 シェーダーの基礎

今日の内容 シェーダープログラミングの基礎 トゥーンシェーディングや、テカテカシェーディングができるようになる! シェーダーとは何か、から説明 トゥーンシェーディングや、テカテカシェーディングができるようになる! かもね

シェーダーとは 3次元モデルのデータを描画する際に、 頂点座標の変換やピクセルの色付けを 行うプログラムのこと 旧来はこの部分でお決まりの処理しか 出来なかったが、今は自由にプログラムできるようになった プログラマブルシェーダと呼ぶ

描画処理の流れ 先週にも紹介した流れをもう一度おさらい 4.のステップのところでもろもろな処理が入る 画面をまっさらに 塗りつぶす カメラの位置と向き、その他諸々をセット 描画したいモデルの 座標系をセットする 三角形をたくさんたくさんたくさん描画する (3,4をモデルの個数分) 描き上がった画面を まるっと差し替え

描画処理の実際 形状の頂点データを画面上の座標に変換 頂点で囲われた画面上の領域を色付け

昔はGPU側に丸投げだった 座標変換は行列とベクトルの乗算だし、 色塗りも固定のアルゴリズムでごりごり 塗っていた でもそれじゃ機械的な絵しか描けない! 描きたい!私、自分の思うように描きたい! じゃあどうするか?

まちがい for文をブン回すプログラムを書いて、 頂点やピクセルごとに処理するぜ! それはギャグで 言っているのか? リアルタイムっすよ リアルタイム… for(i=0; i<VertexNum; ++i) { vertex[i] = ……; color[i] = ……; } for(j=0; j<imgH; ++j) { for(i=0; i<imgW; ++i) { pixel[i][j] = ……;

せいかい プログラマブル シェーダをつかう 1頂点、1ピクセルで行う処理を1つの関数として書く 描画処理の時に 「これを使え!」と 指示をすれば、後はGPUがやってくれる // 1頂点分の処理を書く VertexInfo main() { vertex[i] = ……; color[i] = ……; } // 1ピクセル分の処理を書く PixelInfo main() { pixel[i][j] = ……;

シェーダー言語 OpenGLの場合はGLSLという言語 DirectX/XNAの場合はHLSLという言語 両方に対応する言語でCgというのもある C for Graphicsの略…ちょっと無理がある どれでもだいたいやれることは一緒 C言語に近い感覚で、GPU上の処理を記述

とりあえず2種類の シェーダプログラムを覚えよう バーテックスシェーダ 頂点シェーダともいう 描画する形状の1頂点ごとに呼び出されるプログラム フラグメントシェーダ ピクセルシェーダともいう 座標変換の結果、画面上に描画することになった1ピクセルごとに呼び出されるプログラム

バーテックスシェーダの役割 1頂点ごとに次のような処理を記述する モデルの形状データを画面上の座標に変換 法線ベクトルも変換 光源情報も変換 基本的にはフラグメントシェーダへの繋ぎ役 重めの計算は極力こっちでやっておく スキンアニメや水面波の挙動などを書いたりもする

フラグメントシェーダの役割 1ピクセルごとに次のような処理を記述 最終的にはそこの色を決める 座標変換の結果、塗りつぶすことに決まった領域にしか処理範囲が働かない テクスチャの色を拾う処理もここでやる 頂点シェーダから渡された情報が線形補間されて渡されるので、それをうまく利用する

線形補間された値とは 色や法線ベクトルなどのデータを頂点に渡すと、ピクセルにラスタライズする際に段階的に変化する値が割り当てられる

心せねばならないこと 今までGPUが勝手にやってくれていた 部分を、自分で書かねばならなくなる CPUからGPUに情報を引き渡したり、 GPU上で情報を拾ってくるお作法が煩雑 別言語、というのはさほど問題にならない デバッグが面倒 printf()が使えないので色デバッグを使う 調子の乗ってるとめちゃめちゃ重くなる

今更ですが、シェーダをいじるなら必須なので覚えよう マテリアルとライティングの基礎

3DCGにおける色は色々あります シーンの環境や、物体の質感に応じて 異なる色味や輝度を設定する 拡散反射光(Diffuse) 環境反射光(Ambient) 鏡面反射光(Specular) 鏡面反射ハイライト(Shininess) 放射光(Emission) 透明度(Alpha)

拡散反射光とは 光が当たって見える色のこと いわゆる「物の色」 光の射す角度と、 面の向きで明るさが変化する 真っ正面から当たると一番明るく、真横に近づくにつれて暗くなる cosθでうまく表せる

環境反射光とは 拡散反射光だけだと、光源と反対方向を向いている面が本気で真っ暗になる 実際の空間では直接光が当たらずとも、反射や回折によってもたらされる光で「なんとなく明るくなっている」 面の向きにかかわらず、ある程度付与される明るさ(色)をここで設定 本来ならレイトレーシング法などでガチなシミュレーションをするところを、リアルタイムで処理するために簡略化している

鏡面反射光とは つるつるな物体のハイライト、てかりを表現するための成分 ↑要はこれの表現 ハイライト係数で、てかりの鋭さを設定 光が面に当たり、視線方向にまっすぐ跳ね返ってきた時が一番眩しい ハイライト係数で、てかりの鋭さを設定 材質に応じたてかりが表現可能  ↑要はこれの表現

放射光とは 光源や面の向きによらず、その物体自身から発光している成分 他に影響されずに一定の色を発色させたいときに設定 光源として他の物体に作用するわけではない 他に影響されずに一定の色を発色させたいときに設定 特にスプライトでは、光源や視点の変化に応じて明るさが変動するとまずいので、Emissionを最大値(1.0, 1.0, 1.0)に設定するのが定石

光源の種類 主に以下の3種に分類できる 平行光源 点光源 面光源 太陽光のように、どの位置にいても同じ方向から 当たる光源を表すのに用いる 電球、ローソクの炎など定点に設置された光源 光源と物体の位置関係に応じて減衰したりする 範囲と方向を限定したものがスポットライト 面光源 蛍光灯や窓から差し込む光を表現可能 点光源の計算式に積分を導入して実現する (FKデフォルトでは未対応、シェーダによる処理が必要)

光源にもマテリアルがある 物体のマテリアルを明るく設定しても、光源自体の光量が低いと暗くなる FKデフォルトのマテリアルは暗めのものが多いため、自分でカスタムしないと シーン全体が暗くなる グラフィッカーに文句を言われないようにきちんと調整しましょう

これで分かる!(一般的な) 3DCGでの色決定計算式 color = { (N・L)*d_o*d_l + a_o*a_l + (N・H)^sh_o*sp_o*sp_l } + e_o finalColor = color*texture テクスチャを使っていない場合はそのまま テクスチャなしは真っ白な画像を貼っているのと同じ テクスチャをFK_TEX_REPLACEで使用している場合はマテリアルを一切無視する finalColor = textureとなるので注意

前スライド中の変数 d_o a_o e_o sp_o sh_o N・L d_l a_l sp_l texture N・H 物体の拡散反射光 物体の環境反射光 e_o 物体の放射光 sp_o 物体の鏡面反射光 sh_o 物体のハイライト係数 N・L 拡散反射係数 法線と光源方向の内積 d_l 光源の拡散反射光 a_l 光源の環境反射光 sp_l 光源の鏡面反射光 texture テクスチャの色 N・H 鏡面反射係数 法線とハーフベクトル(視線と光源方向の中間)の内積

これで分かれ! マテリアルパラメータ一覧表 名称 面との影響 視線との影響 光源との影響 光源数の影響 Diffuse する(N・L) しない する(乗算) する(加算) Ambient Emission Specular する(N・H) する(H=(N+L)/2) Shininess 補助パラメータ Alpha 色の加算結果は1.0(255)で飽和する 各成分を高く設定したり、光源を増やすと 白飛びするので調整が必要 *alphaについては後述

光源による演出 物体のマテリアルは同一でも、光源の マテリアルを変更するだけでシーンの 雰囲気を大きく変えることができる 例:夜のシーンの場合 Diffuseを大幅にカット Ambientを(0.1, 0.2, 0.5)などにして、 青成分を残しつつ他の成分は絞る

シェーディングタイプ フラットシェーディング グローシェーディング FKのデフォルト 面全体が一様に同じ明るさになる ポリポリする fk_Model::setSmoothMode(true)で有効 面の頂点から頂点に滑らかな グラデーションがかかる 多くの場合こちらの方が好まれる

透明度とは 今更感が漂いますが 0.0で完全透明、1.0で完全不透明 マテリアルで設定する透明度と、テクスチャ画像によるピクセル単位の透明度も反映可能 dstCol = srcCol*mat.alpha*tex.alpha + dstCol*(1.0-mat.alpha*tex.alpha) ただし、FK_TEX_REPALCEを使っている場合はマテリアルの透明度は無視される

今説明した処理を 自力で書く必要がある シェーダを使うからにはね 自力で書く代わりに、アレンジを加える余地が生まれる 今日のサンプルを土台にいじってみよう 「OpenGL de プログラミング」で検索して参考にしよう