2014年04月25日

Worleyノイズについて

使い道はわかりません。で済ましてしまうのもどうかと思いましたので、一応Worleyノイズの使い道について調べてみました。人の肌のテクスチャ[1]や、ステンドグラス風のテクスチャ[2]等に使うことができるようでした。

今回、ステンドグラス風のテクスチャを作ってみようとしたのですが、IDの取得方法が良くわからなかったので適当に書き換えました。もっと良い取得方法がありそうです。

後は、隣り合う領域は同じ色にならないようなアルゴリズムもあった気がするのですが、今回はただ単にIDの剰余を取って7色に分けているだけです。

実行結果
今回もあぴミクさんを使用させていただいております。今回のエフェクトと元絵を黒縁以外50%で合成した結果になります。屈折を入れればもう少しましに見えますかね。

cellular_003.png

fxファイル等
CellularNoise_v002.zip

[1] Independant Research Skin Shader
[2] Drilian’s House of Game Development
web拍手 by FC2
posted by シンドラー at 20:10 | Comment(0) | TrackBack(0) | MMD | このブログの読者になる | 更新情報をチェックする

2014年04月24日

MMEのテスト その5

OpenGL Insights[1]を眺めていたら、Worley noise[2]というものがありましたのでMMEで試してみました。細胞みたいなノイズですね。GLSLのソースをHLSLに書き換えただけです。ライセンスはMITライセンスになると思います。

実行結果
cellular_001.png

fxファイル等
CellularNoise_v001.zip

[1] http://www.borndigital.co.jp/book/2783.html
[2] http://webstaff.itn.liu.se/~stegu/GLSL-cellular/
web拍手 by FC2
posted by シンドラー at 23:30 | Comment(0) | TrackBack(0) | MMD | このブログの読者になる | 更新情報をチェックする

MMEのテスト その4

擬似乱数を生成するよりはやっぱりテクスチャを使用した方が良いかな、ということで、どうせなら?3Dテクスチャを使用できた方が便利だろうということでddsファイルを使用することにしました。
ddsファイルは、DirectDraw Surfaceというファイル形式のようです。で、乱数を生成して画像にしてddsファイルとして出力する必要があります。自分で実装するのは面倒ですので、既存のライブラリであるDevIL[1]を使用することにします。

DevILの使い方

使い方は[2]等を参考にさせていただきました。
[1]のDownloadから、DevIL 1.7.8 SDK 64-bit Windowsなど、最新のSDKをダウンロード・展開します。
includeフォルダと、.lib, .dllがありますので、普通のライブラリと同様の準備をするだけです。(省略)

1.使用準備
init関数を呼び出します。
    ilInit();
iluInit();
ilutInit();

2. 画像の生成
OpenGLのテクスチャに似た扱いですので、慣れているとわかりやすいかもしれません。
  // IDの生成
iluint id = ilGenImage();
// バインド
ilBindImage(id);
// 画像の領域を生成(画像の幅、高さ、奥行き(2次元画像であれば1)、
// 1ピクセルあたりのバイト数(通常1,3,4のどれか)、フォーマット(IL_RGB等)、
// タイプ(IL_UNSIGNED_BYTE等)、コピーするメモリ(ピクセルデータ、
// 初期データがない場合はNULLでもよかったり?))
ilTexImage(width, height, depth, bpp, format, type, local);
// バインド解除
ilBindImage(0);

3. ランダムノイズの設定
  // バインド
ilBindImage(id);
// ピクセルのポインタの取得
ilubyte *data = ilGetData();
// 乱数の設定
for (int i=0; i<width*height*depth*bpp; i++)
{
data[i] = 255.0*randomfunction();
}
// バインドの解除
ilBindImage(0);

4. 画像の保存
  // バインド
ilBindImage(id);
// 上書き
ilEnable(IL_FILE_OVERWRITE);
ILboolean ret = ilSaveImage("random.dds");
// バインドの解除
ilBindImage(0);

保存したデータをDirectX Texture Toolで開いてみたところ、DXT1形式になっていたので、メニューのFormat→Change Surface Format→Unsigned 8-bit: L8に変更して上書き保存しました。DevILのパラメータ設定をちゃんとすればうまくいくのかもしれません。

HLSLでの3Dテクスチャの使用方法

3Dテクスチャの使用方法は、舞力介入PのOldTV[3]を参考にさせていただきました。
  texture3D Rand_Tex
<
string ResourceName = "random.dds";
>;
sampler Rand = sampler_state
{
Texture = (Rand_Tex);
ADDRESSU = WRAP;
ADDRESSV = WRAP;
ADDRESSW = WRAP;
MAGFILTER = POINT;
MINFILTER = POINT;
MIPFILTER = NONE;
};
...
float rand = tex3D(Rand, float3(px, py, pz)).r;


実行結果

ランダムノイズをテクスチャに置き換えました。無駄に3Dテクスチャにしていますが奥行きは2枚しか作っていません。
その他バグ?を修正したので、やっとそれっぽくなってきた気がします。

LIC_003.png

fxファイル等
LIC_v003.zip

[1] http://openil.sourceforge.net/
[2] 続・OpenGL+DevILで画像読み込み
[3] http://www.nicovideo.jp/watch/sm12149815

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

2014年04月22日

MMEのテスト その3

色々なエフェクトを参考にさせていただき、遅延レンダリングの方法が分かったのでLICを作り直してみました。といってもデータPのCroquisエフェクト[1]を改変させていただいただけです。

遅延レンダリングのやり方として、オフスクリーンに描画して、それをテクスチャとして参照する方法があるようです。

  // 法線マップ
texture CM_NormalMap : OFFSCREENRENDERTARGET <
string Description = "NormalMap";
string Format = "D3DFMT_A32B32G32R32F";
float2 ViewPortRatio = {MapTimes,MapTimes};
float4 ClearColor = {0,0,1,0};
float ClearDepth = 1.0;
bool AntiAlias = false;
int Miplevels = 1;
string DefaultEffect =
"self=hide;"
"*=NormalDraw.fx;"; // オフスクリーンレンダリングに使うfxファイル
>;
// サンプラ
sampler NormalMapSampler = sampler_state {
texture = <CM_NormalMap>;
MinFilter = POINT;
MagFilter = POINT;
AddressU = CLAMP;
AddressV = CLAMP;
};

この方法を使えば、メモリと性能の許す限り法線情報や深度情報などのG-Bufferをテクスチャとして参照することができますので、大体やりたいことはできるようになるかなと思います。

その他の方法として、sharedキーワードでエフェクトファイル間でパラメータ共有ができるようで、Excellent Shadowでもshared texture ...としてテクスチャの共有をしているようでしたので、こういうやり方でも実現できるような気はします。

また、肌のところだけ処理を外すといった処理は、techniqueのところでSubsetを指定してあげれば、指定した材質番号だけにエフェクトが適用されるようになるようです。

後は、擬似乱数がかなり適当なのでもうちょっとまともなものにしたいのですが、メルセンヌ・ツイスタやXorShiftなどをMMEで作っている人はいらっしゃらないんですかね。3次元テクスチャを使う方が楽で速いのでいいんでしょうけれど。

実行結果

あぴミクさんとぽっぴっぽーモーション[2]を使用させていただいております。



シフト演算の問題とかDirectX11であれば対応できると思うのですが、MMEのDirectX11版は公開されてないのでしょうか。MikuMikuFlex[3]とか使えばいいんですかね。

fxファイル等(素材画像は入れていません)
LIC_v002.zip

[1] http://www.nicovideo.jp/watch/sm14263863
[2] http://www.nicovideo.jp/watch/sm5838726
[3] http://www.nicovideo.jp/watch/sm22078209

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

2014年04月16日

MMEのテスト その2

静止画にしか使えない実用性のないエフェクトですが、昔の記事で書いていたアンサンブル平均をMMEでやってみました。

正規分布に従うノイズをもつカメラモーションはVMDConverter[1]を使用させていただき、VMDConverter用のcsvファイルをプログラムで生成してvmdに変換しました。

使い方はReadme.txtに書いていますが、やっていることはカメラを微妙に動かしながらレンダリングした過去フレームの総和を保存しておいて、フレーム数で割っているだけです。

既存のエフェクトを改変させていただくことでできましたが、まだtechniqueの書き方がいまいちわからないですね。

実行結果
今回もあぴみくさんと初期ステージを使用させていただいております。ポーズを工夫する気力がなかったので初期ポーズです。

MMDで「ファイル→画像ファイルに出力」で出力した結果
mme_average_001.png
アンサンブル平均5000回とった結果
mme_average_002.png
ここで見るとまったく違いがわかりませんね。

fxファイル等
MME_average_v0.zip

[1] http://yumin3123.at.webry.info/200810/article_4.html

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

2014年04月12日

MMEのテスト その1

今更ながらMMEを試してみることにしました。とりあえず[1]を参考にさせていただいて、LIC法をMMEで作ってみました。

エッジを加えてないせいもありますが、かなり拡大しないと薄すぎますね。やっぱりGLSLとは違うので、色々やりたいことはあるのですがどう実装すればいいのかがわからないですね。ポストエフェクトは重ね掛けできるみたいですが、色々なレンダリング結果を違うfxファイルから参照したりとかできるんでしょうか。

fxファイル等(エラーがあったので差替えました。2014.4.14)
LIC.zip

実行結果

あぴみくさんを使用させていただいております。

LIC_MME_001.png

[1] MikuMikuEffectで学ぶHLSL入門
web拍手 by FC2
posted by シンドラー at 21:11 | Comment(0) | TrackBack(0) | MMD | このブログの読者になる | 更新情報をチェックする

2014年04月06日

色々なエッジのテスト

一言にエッジといっても色々なエッジが考えられますので、メモしておきます。

1. 色の違いによるエッジ
色が違っているところに線を引きます。微分フィルタを使うのが一般的かと思います。今回は色といってもグレースケール化して[7]の方法でエッジを計算してみました。

実行結果(元データ、エッジ画像、テクスチャに掛けた画像)

edge_color_001.png edge_color_002.png
edge_color_003.png

閾値処理などをすればノイズは減ると思います。色が変わるということは元々エッジが見えるということのような気もしますが。

2. 深度値の違いによるエッジ
奥行きが違っているところに線を引きます。こちらも微分フィルタで出せるかと思います。ここでいう深度値をどうするかという問題もありますので、深度値について復習しました。

depth_001.png
depth_002.png

実行結果
今回はZsで[7]の方法で深度値のエッジを計算してみました。

edge_depth_001.png edge_depth_002.png edge_depth_003.png

奥行に差があるところに線を引くというのはわかりやすいですが、内部の線がなかなか見えにくい気もしますね。こちらも閾値処理すれば良いのかもしれません。

3. 法線ベクトルの違いによるエッジ
ポリゴンとしては平面ですが、法線ベクトルを焼き込んで凹凸をつけていることなどがありますので、法線ベクトルを使ったエッジも大事になります。微分フィルタを使う方法や、内積を使う方法などがあるようです。今回は単純に法線ベクトルの差の合計の微分を使いました。

実行結果

edge_normal_001.png edge_normal_002.png edge_normal_003.png

閾値処理でノイズを減らせば割と自然なエッジの気もしますね。法線マップを使ったモデルなどに有効なのかもしれません。

4. マテリアルIDの違いによるエッジ
[1]に書かれていた方法です。PMD/PMXなどは材質ごとに番号が割り当てられていますので、材質が違うところには線を引けるでしょうということのようです。IDの値の差に意味はありませんので、近傍N画素中M個違っていればといった閾値処理になるかと思います。

実行結果

edge_material_001.png edge_material_002.png edge_material_003.png

はっきりとした線は引きやすいですね。材質番号が同じだと左足と右足の間にエッジが引かれないので、単体だと少し物足りない印象もあります。

というわけで、4つほどエッジを試してみました。それぞれ一長一短な気がしますので、用途や組合せで何とかする感じでしょうか。

[1] 深度法線エッジによる輪郭抽出
[2] 第5回 座標変換
[3] 第6回 視点の移動
[4] 第7回 カメラパラメータ
[5] リニアデプスシャドウマッピング
[6] OpenGLのデプスバッファ(pdf)
[7] T. Saito and T. Takahashi, "Comprehensible Rendering of 3-D Shapes", Computer Graphics, Vol. 24, 1990

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

2014年04月02日

LIC(Linear Integral Convolution)のテスト その2

前回の続きです。[1]を参考にさせていただき、手書きっぽい効果を試してみます。今回もあぴミクさんを使用させていただいております。

1. 適当にベクトル場を生成
法線ベクトルと外積を使って上方向ベクトルを計算しました。この辺はもっと良さそうなベクトル場を考えた方が良いとは思います。
lic_007.png lic_008.png

2. グレースケール化とホワイトノイズの生成
あぴミクさんを普通にレンダリングして、グレースケール化します。それを輝度値として、[1]に書かれている方法を使ってホワイトノイズを生成します。追加として、材質が肌のところは輝度値に関係なく白色にしました。
lic_006.png lic_008.png

3. LIC法で線+エッジ+紙素材背景
LIC法で線を引いて、以前の方法で生成したエッジを掛けて、[2]のサイトの紙素材を掛けてみました。今回ただ掛けただけなのですが、参考文献ではエッジがボケたりしているので畳込み演算などが必要かもしれません。
lic_010.png

今回は画像処理として試しただけなので、次回はシェーダ辺りでできるようになるといいですね。

[1] "LIC法を利用した鉛筆画の自動生成法", 芸術科学会論文誌, Vol.1, No. 3, pp.147-159. (2002)
[2] フリーテクスチャ素材館
web拍手 by FC2
posted by シンドラー at 19:03 | Comment(0) | TrackBack(0) | Image Processing | このブログの読者になる | 更新情報をチェックする

2014年04月01日

LIC(Line Integral Convolution)のテスト

つい先日お正月だった気がするのですがもう4月なんですね。恐ろしいことです。

可視化の本を読んでいると、LICというものがありましたので、試してみることにしました。手書き風のエフェクトなどでも使われているようですので、やる気がでればGLSL等で実装してみたいと思います。参考サイトは[1][2]で、[1]にCのソースコード、[2]にC++のソースコードがありましたので、参考にすれば特に問題なく実装できるかと思います。

[1]の図がわかりやすいですが、ベクトルデータとホワイトノイズを用意して、各画素でベクトルに従って1ピクセルずつ移動して、その画素のホワイトノイズの値をボックスフィルタリングで畳込み演算すると線を引いたような絵ができる、という不思議な方法です。

実行結果

[1]のソースにあったサドル状のベクトルデータと、ベクトルを矢印で描いた図です。

lic_001.png lic_002.png

ホワイトノイズ(左)と、ある特定の画素に注目して、前後にピクセルを辿っていった線(右)です。

lic_003.png lic_004.png

線上のホワイトノイズの値に、ボックスフィルタの重みをかけたものを足して重みで割ると、その画素の色が決まります。それを全ての画素について実行した結果が下図のようになります。(ベクトルを掛けて適当に色付けしています)

lic_005.png

次回は手書き風シェーダっぽい絵ができるといいですね。

[1] Line Integral Convolution
[2] Using Line Integral Convolution to Render Effects on Images (PDF)

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

広告


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

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

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