2013年04月24日

ランダムノイズによるテクスチャ生成について その3

球面調和関数についてはBRDFについて勉強中です。
息抜き?にノイズを使ったテクスチャを作ってみました。
参考サイト[1]はPhotoshop用ですので、適当に画像処理で再現してみようとしたのですが何か違う気がしますね。
GLSLでPhotoshopの再現みたいなページもあった気がしましたが今回はCPUで試してみただけです。

[1] Photoshop初心者でも簡単できる、かっこいいテクスチャ素材を作るチュートリアル

ざらっとした感じはこういうやり方で作れるものなんですね。

1.布っぽいの
(1)ランダムノイズを確率30%ほどで生成
(2)横に伸ばす
texture_test_001.png
(3)縦に伸ばす
texture_test_002.png
(4) (2)と(3)を掛ける
texture_test_003.png
(5) 高さマップとみなして法線ベクトルを計算
texture_test_004.png
(6) バンプマッピングの要領でフォンシェーディング
texture_test_005.png
(7) 白飛びしているのでトーンマッピング
texture_test_006.jpg

2.ざらっとした感じ
(1)ランダムノイズを0.25〜0.5ぐらいの間で発生
(2)反転して1ピクセル下にずらした画像と掛け合わせる
texture_test_007.png
(3)法線ベクトルの計算
texture_test_008.png
(4)フォンシェーディング
texture_test_009.png
(5)トーンマッピング
texture_test_010.jpg

参考サイトの方がよりざらっとした感じが出てるんですよね。最初のノイズの発生方法が違っているのかもしれません。
点光源+フォンシェーディングより異方性を考慮したBRDFモデルを使った方がいいのでしょうね。

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

2013年04月17日

球面調和関数について その2

前回の続きです。

球面調和関数は、結局θとφの関数で、0≦θ<π, -π≦φ<πの範囲をとるので、スカイドーム用のパノラマ画像のようにテクスチャとして事前計算してしまっていいのではないかと思います。

ただ、l=5まで計算しようとすると、36枚の画像が必要になってしまいますので、下記のような配置にして一枚にまとめてしまうことにしました。

SH_002.png

で、例題として、l=5まで、θを1度刻み、φを2度刻みでテクスチャ画像にした結果が以下のようになりました。

SH_003_L5.png

このデータを元に前回と同じ計算をしたところ、ほぼ同じ結果が得られたので問題ないのではないかと思います。

実行結果(l=2, m=0)

SH_004_2_0.png

次は適当な係数を掛け合わせて色々な形状を作ったり、パノラマ画像を圧縮したりしてみたいですね。

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

2013年04月15日

球面調和関数について その1

前々から気になっていた球面調和関数を使ってみることにしました。
テイラー展開とかフーリエ展開とかありますが、球面調和関数もそんな感じで関数を別の関数の組合せで表現するみたいです。
難しい式展開などはおいておいて、とりあえず使ってみたいと思います。

[1][2]を参考にさせていただき、θとφを与えてYを得る球面調和関数を実装してみました。
また、[3]の方に、緑と赤で尖った結果の画像が載っていましたので、確認のためにレンダリングしてみました。

1. 乱数で0≦θ≦π,0≦φ≦2πを100万通り生成
2.生成した値から球面調和関数の値SHを計算
3.計算結果を,半径|SH|,偏角θ,φとしてワールド座標に変換
4.ワールド座標をある視点からのローカル座標へ透視投影変換
5.元のZ値と変換後のZ値を比べて、Z値が小さければ色を更新
6.SHが正ならば緑色、負ならば赤色、法線ベクトルはワールド座標の正規化としてフォンシェーディング

実行結果

SH_001.png

100万点でも結構抜けが多いですね。
視点の位置等が違うため、[3]の結果とは少し見た目が違いますが、計算結果としては間違ってなさそうです。
次はこれを使って圧縮と展開までできればいいですね。

参考サイト
[1] http://www.t-pot.com/program/88_SH/index.html
[2] http://asura.iaigiri.com/OpenGL/gl68.html
[3] http://www.cs.columbia.edu/~cs4162/slides/spherical-harmonic-lighting.pdf

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

2013年04月11日

GLSLの簡易的なデバッグについて

GLSLで法線ベクトルなどをFBOに出力した際、正しく出力できているかどうか確認したいのですが、デバッガなどを使っていないので、画像として保存してなんとなく確認するしかしていませんでした。
GLSL用のデバッガを使うべきなのだとは思いますが、とりあえず簡易的に数値などを確認できればいいかと思って、文字表示等を行うことにしました。
今回は特に日本語を表示する必要はないので、GLUTを使って簡単に表示する方法を使ってみます[1]。

手順
1. FBOの準備
2. FBOにレンダリング
3. glGetTexImageでフレームバッファのデータを取得
4. フレームバッファの内容をテクスチャとして表示
5. マウスでクリックしている座標の情報を[1]を参考に文字として表示
6. わかりやすいように軸も表示

軸については、クォータニオンの回転を使って青色をRGBの方向にして表示しています。

実行結果

法線ベクトルや反射ベクトルやワールド座標を確認しています。
画像で見るだけよりはかなりわかりやすくなった気がします。



[1] http://wiki.livedoor.jp/mikk_ni3_92/d/%b4%f0%cb%dc%ca%d417%3a%3abitmap%a5%d5%a5%a9%a5%f3%a5%c8
web拍手 by FC2
posted by シンドラー at 21:33 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2013年04月10日

SSAOのテスト

MMD等で良く使われているSSAOを試してみました。
SSAOは、Screen Space Ambient Occlusionの略で、スクリーン空間で環境遮蔽を簡易的に計算してしまおうというものです。
SSAOで検索すると色々なページが出てきますが、今回は[1]を参考にさせていただきました。

SSAOで必要なものは、深度値と法線ベクトルになります。
スクリーンスペースですので、ピクセル単位での計算になります。
あるピクセルから法線ベクトルもしくは反射ベクトル方向を中心に半球状のランダムベクトルをサンプル数分生成します。
一定距離を足したピクセル座標の深度値と、元の深度値を比べて、参照先のピクセルが手前にあれば遮蔽されている、ということになります。
また、参照先のピクセルの法線ベクトルと、元の法線ベクトルの内積が小さい(違う方向を向いている)場合も、遮蔽されていると考えられます。
後は深度値の差の大きさを重みにしたりして適当に遮蔽率を計算したものが次の結果になります。
遮蔽率なので、遮蔽されているほど白くなります。

SSAO_002.png

サンプル数を50方向と多めにとってみましたが、全然足りないようですので、バイラテラルフィルタを掛けて、色を反転させます。

SSAO_003.png

これをレンダリング結果にかけ合わせれば、遮蔽されていそうなところが暗くなる、というわけです。

blur1_003.png SSAO_004.png
      SSAOなし           SSAOあり

あまりきれいにできてないので何か間違っているかもしれません。

前回の結果に適用した場合

blur1_007.png SSAO_005.png
      SSAOなし           SSAOあり

[1] http://maverickproj.web.fc2.com/d3d11_24.html
web拍手 by FC2
posted by シンドラー at 01:13 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2013年04月04日

放射ブラーとゴッドレイ効果について その2

前回は画像に対して行いましたが、今回は3Dモデルに対して行います。

通常のレンダリング結果

blur1_003.png

スカイドーム[1]、ステージ[2]、あぴミクさん[3]を使用させていただいております。

手順としては、放射ブラーで伸ばす部分のマスクを作成して、ブラーして、原画像と合成します。

前回は窓のところにしか光がありませんでしたが、ステージなどのモデルを使用する場合は、光が通るところと通らないところが出てきます。
例えば、窓の場合は、外から光が入ってくるので、α値が1.0より小さいということになります。
ということで、まず一つ目の条件として、α値が1.0以下の部分を白、1.0の部分を黒とするマスクが考えられます。

blur1_000.png

二つ目の条件としては、物体が光を遮る(シルエットとなる)部分が存在します。これを設定する方法も色々考えられますが、今回は深度値に閾値を設定して、閾値より近ければ黒、閾値より遠ければ白とするマスクを作成しました。

blur1_001.png

で、光が外から入ってきて、かつ、遮られていないという条件になりますので、両者のANDをとります。ついでに平滑化もかけました。

blur1_002.png

このマスクを通常のレンダリング結果に掛けます。

blur1_004.png

これに前回の放射ブラーを掛けます。

blur1_005.png

適当な割合で原画像に加算します。

blur1_006.png

おまけでバイラテラルフィルタ[4]を掛けてみました。

blur1_007.png

夕方のスカイドーム使ったのに明るすぎですね。

今回はマスク作成と通常のレンダリングまでをGLSLで行って、残りはCPUでやりました。
2パスにして放射ブラー以降もGLSLで行えば、MMD(+MME)のようにリアルタイムでゴッドレイ効果を実現できると思います。

次はSSAOあたりをやってみたいと思います。昔の記事にSSAOって書いているところがありましたがあれはただのAOですね。

[1] 【データ配布】スカイドーム素材集 vol.01
[2] 【重音テトオリジナル】 オレンジ 【UTAU with MMD-PV】
[3] http://piapro.jp/t/KPU3
[4] バイラテラルフィルタ

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

2013年04月03日

放射ブラーとゴッドレイ効果について その1

MMDなどで良く使われているゴッドレイ効果を試してみることにしました。

参考サイト[1]を参考にさせていただいており、まだ放射ブラーでマスクを作ったりしていないので途中経過になります。
正規化座標系を基準にして、光源からの距離と方向に応じて放射状にブラーを掛けることになります。
とりあえず放射ブラーのようなものを掛けて、原画像と混ぜてみました。
ようなもの、というのは、本来光源から外側に向かって加算していくものだと思いますが、内側(光源方向)に加算していっています。

実行結果

[2]の写真を使用させていただいております。結構長い距離のブラーを掛けているのでリアルタイムでは動きません。サンプル数を減らしても結構それっぽくはなります。

原画像50%縮小  ブラーを掛けた画像  合成した画像

blur_000.png blur_001.png blur_002.png

今回は画像で試しただけですが、前回の環境マップやステージ、モデルなども入れて3次元空間でできるようにしたいです。

参考サイト
[1] http://maverickproj.web.fc2.com/pg65.html
[2] フリー画像素材 商用利用可 kurasu.album

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

広告


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

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

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