2012年02月29日

誤差拡散法による減色について

[1]の本を読んでいて、誤差拡散法がなんとなく面白そうだったので試してみました。

PC98の時代はカラーパレットが4096色で、実際に使用できるのが16色という感じだったようですので、今回は原画像をRGB16x16x16の4096色に減色し、そこから16色選んでさらに減色してみることにしました。

[2]のサイトにカラーでやる場合について書かれていました。

メディアンカット法は実装していませんので、すればよくなるかもしれません。
今はヒストグラム数が一番多い色からN個とる方法Aと、C-Means法でN個選ぶ方法Bで試しています。

実行結果

(左)原画像 (中)4096色に減色 (右)4096色で誤差拡散法

Lenna.bmp lenna_4096_0.png lenna_4096.png

(富士山原画像は省略) fuji_4096_0.png fuji_4096.png 

富士山画像は誤差拡散法を使わないと擬似輪郭が気になりますね。

256色(A, B)

lenna_256.png lenna_256_2.png

fuji_256.png fuji_256_2.png

誤差拡散法を使えば256色でも十分な気がしますね。256色の場合はAの方が良さそうな結果でした。

16色(A, B)

lenna_16.png lenna_16_2.png

fuji_16.png fuji_16_2.png

16色でもBの方ならなんとか見られるレベルですね。
まぁ時代的に減色はあまり意味がない気もしますがエフェクトの一種としていいかもしれません。
誤差拡散法は並列処理に向いていない気がするのであれですが。

富士山の画像は[3]の画像を使用させていただいております。
著者:NNE様
クリエイティブコモンズライセンスの表示・継承ですので、ここの画像もそれに従います。

参考文献
[1] CG-ARTS協会,“コンピュータグラフィックス”, 2004
[2] http://koujinz.cocolog-nifty.com/blog/2009/04/24bit-8bit-a879.html
[3] http://free-photo.gatag.net/2010/05/23/120000.html

web拍手 by FC2
posted by シンドラー at 20:03 | Comment(0) | TrackBack(0) | Image Processing | このブログの読者になる | 更新情報をチェックする

2012年02月22日

Bulletのレイキャスティングについて その6

Bulletのレイキャスティングを使って、MMD+MMEなどで良く用いられているSSAOを試してみました。
計算時間は512x512で数分かかります。

参考サイト
[1] http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20101122
[2] http://d.hatena.ne.jp/shuichi_h/20100318/

手順は以下のようにしました。

1. 視点から近クリップ面にレイを飛ばす
2. 当たったら、そこからn本のレイを拡散反射方向に飛ばす
3. n本中a本が衝突せず、残りの(n-a)本が衝突した場合、a/nの値をバッファに格納する
4. 3.で計算した値をガウスフィルタでぼかす
5. フィルタを掛けた結果をそこの色に掛けて最終的な色にする

2.のところがやはり時間がかかりますね。512x512=262,144で、そこから×n倍ですので、例えば500本飛ばしたら131,072,000本のレイを飛ばすことになります。

実行結果

200本飛ばしてフィルタなしが左、500本飛ばしてフィルタあり(5x5のガウスフィルタ)が右になります。
狭い部屋でレイを飛ばす距離を長くしているので、ほぼどこかに当たって暗くなるため無理やり明るくしています。

bullet_ssao_001.png bullet_ssao_002.png続きを読む
web拍手 by FC2
posted by シンドラー at 21:16 | Comment(0) | TrackBack(0) | Bullet | このブログの読者になる | 更新情報をチェックする

2012年02月14日

Bulletのレイキャスティングについて その5

フォトンマッピングのようなものを試してみました。
今回からねんどろいど風ミクさんを使用させていただいております。

フォトンマッピング本には直接照明、鏡面反射、集光模様、間接照明のそれぞれを合計すれば完全なる大域照明になるとあるんですが、この辺りがよくわかりませんね。

BRDFの計算も何を使えばいいのか良く分からないですね。本にはシュリックのモデルが載っていましたが接線ベクトルとか適当でいいんでしょうか。

実行結果

フォトン10万を光源から飛ばし、単純に視点からレイを飛ばして当たった所の
近傍フォトン100個を探索した結果でレンダリングしています。
頭の上の方しかフォトンが殆ど当たりませんね。

bullet_photon_001.png

フォトン数50万で近傍5000個探索した結果+0.1倍のモデルの色の結果です。
適当にモデルの色を足したのでは駄目ですね。

bullet_photon_004.png

BRDFの計算と直接照明、鏡面反射、集光模様、間接照明辺りをちゃんとしないとあまりいい結果にならなさそうです。
web拍手 by FC2
posted by シンドラー at 19:46 | Comment(0) | TrackBack(0) | Bullet | このブログの読者になる | 更新情報をチェックする

2012年02月13日

Bulletのレイキャスティングについて その4

フォトンマッピングやレイトレーシングを行う場合、レイが当たったところの色が必要になります。
PMDモデルの場合、大体テクスチャで色が決まっていますので、テクスチャ画像から色を取得します。

そのためにはレイが当たった点のテクスチャ座標が必要になりますので、法線ベクトル計算時についでにテクスチャ座標も計算してしまいます。
やり方は前回の3次元の法線ベクトルの部分を2次元のテクスチャ座標に変えるだけでできます。

MyClosestRayResultCallbackを作成していますので、当たったモデルの番号とインデックス番号を取得できます。
当たったのがPMDモデルの場合はそこから、Cornell Boxの場合はそちらの色を取得します。

実行結果

linear_003.png

当たった点の色を取得してGL_POINTSで描画しています。
これで大体準備が整ったので次はフォトンマッピングを試してみたいと思います。

web拍手 by FC2
posted by シンドラー at 00:50 | Comment(0) | TrackBack(0) | Bullet | このブログの読者になる | 更新情報をチェックする

2012年02月11日

Bulletのレイキャスティングについて その3

昨日の続きです。

何となく線形補間の方を試してみました。
やり方がよくわからなかったのでかなり面倒な計算で出しました。

linear_001.png

参考文献
[1] 実例で学ぶゲーム3D数学

実行結果

linear_002.png

一応GLSLで取得した結果と同じものが得られていると思います。

しかし、どう考えてももっとスマートに計算できるはずなので、ちゃんとした計算方法をどなたか教えてください。
web拍手 by FC2
posted by シンドラー at 02:38 | Comment(0) | TrackBack(0) | Bullet | このブログの読者になる | 更新情報をチェックする

2012年02月09日

Bulletのレイキャスティングについて その2

BulletのrayTestで視点から近クリップ面に向かってレイを飛ばしてみました。

前回の参考文献[1][3]から、衝突した点の座標と法線の情報が取れるとありましたので、m_hitPointWorldで得られたワールド座標に、m_hitNormalWorldを0〜1の範囲にスケーリングした色でGL_POINTSで点を打った所、下記のような結果が得られました。

bullet_rayTest_001.png

はちゅねさんの面がはっきり見えているので、法線補間がされていないことが分かります。
当たり前といえば当たり前なんですが、このままフォトンマッピングすると何か影響が出てきそうな気がします。

ちなみにGLSLを使用した場合には、varyingで法線ベクトルを補間できますので、下記のような結果が得られます。

glsl_normal_001.png

フォトンを回収する時に行うレイトレーシングの1回目は、GLSLを使って衝突点と法線を計算した方が良さそうです。

ただ、ClosestRayResultCallbackを継承した派生クラスを作成すれば、当たった面のIndex情報が取得できますので、自分で法線ベクトルを補間することも出来ます。

そうしておいた方がフォトンをばら撒く時にちょっと正確になる気もします。

web拍手 by FC2
posted by シンドラー at 21:54 | Comment(0) | TrackBack(0) | Bullet | このブログの読者になる | 更新情報をチェックする

2012年02月03日

Bulletのレイキャスティングについて

フォトンマッピングでレイとポリゴンの衝突判定が必要なのですが、自分で実装すると怪しいのと遅いのであまりいいことはないと思いますので、Bulletの衝突判定を使うことにしました。Bulletのバージョンは2.79でやっています。

参考
[1] Bullet Physics Demos: ConcaveRaycastDemo
[2] http://www11.atwiki.jp/darui_program/pages/328.html
[3] http://wikiwiki.jp/bulletlib/?%A5%EC%A5%A4

PMDファイルを読み込んで、btTriangleMeshとbtBvhTriangleMeshShapeを作りました。btConvexShapeにしなかったのは、凸包でレイとの衝突判定をされても困るからです。

後はデモを参考にrayTestを実行します。

実行結果

昔つくりかけで放置していたプログラムを改変してみました。



空中から50万フォトンを放出して、rayTestで衝突した点にGL_POINTSで点を打っています。
放出/衝突判定は最初に一回だけやっています。
さすがに50万フォントのリアルタイムは普通に使っただけでは無理そうです。
ConcaveRaycastDemoで実行されないBATCH_RAYCASTERの辺りが気になるのですが。

web拍手 by FC2
posted by シンドラー at 21:14 | Comment(0) | TrackBack(0) | Bullet | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。