2012年11月29日

パーティクル

パーティクルが使えると何かと便利なので作っていた。
パラメータが多くて面倒だったけど、なんとか絵が出るところまで来た。
絵が出るようになると俄然楽しくなってくる。

ソフトウェア描画であまり最適化していないので重い。
対応できていないパラメータや細部の動作など作ったら最適化する。

投稿者 Takenori : 02:28 | トラックバック

2012年12月12日

pee ( Particle Effect Editor)ベータ版

とりあえずベータ版を公開。
pee ( Particle Effect Editor)ベータ版
ベータ版なので不具合等あると思います。

ざっくり使い方を説明した動画。

演算誤差か何かで少し変な黒い線画出てしまっている部分がある。
後、背景への重ね合わせ部分が通常のアルファブレンドになっているため、少し印象の違う結果になっている部分もある。
加算系のときは、レイヤーも加算指定にすればいいが、背景が明るいと飽和して変な色になるから、通常のアルファブレンドの方が良い結果になることもある。

後は吉里吉里用のプラグインと高速化、テスト&不具合修正などしたら完成。
ノベルゲームで使うことを考慮したパラメータ構成になっていると思うけど、足りなさそうならまた考える。
プリセットがあれば呼ぶだけでさくさくエフェクトを追加できて、画面に動きが出るように。
他のパーティクル系ソフトとアルファチャンネル付き動画を組み合わせることで同じことが出来るけど、動画だと容量が大きくなるという難点があった。
これだと小さいテクスチャとパラメータファイルだけで済む。

投稿者 Takenori : 04:30 | トラックバック

2012年12月17日

pee 更新

pee ( Particle Effect Editor)ベータ版
ファイル読込みとSSE2の対応を行って更新。
後はデバッグと高速化、ドキュメント整備。
更新したので、使用日数制限が消えてまた使えるようになっています。
これでプラグインを使って実際に吉里吉里2上で動かして試すことが出来ます。

投稿者 Takenori : 05:07 | トラックバック

2012年12月18日

パーティクル描画順

パーティクル描画順の問題は前から認識していたけど、そんなに気にならないかなとも思っていたら、作るものによっては厳しいことに。

キャラのバックでわーっと出るとかあるだろうと思って作ってみたら、中心付近がかなり見づらいことに。
何らかのソートはやはり必要そう。
後、右端消えてなかったりはみ出してたりする。
クリッピング周りに不具合ありそう。

表題とは関係ないけど、こういうのも。
数十個のプリセットを公開したいと考えている。

投稿者 Takenori : 01:54 | トラックバック

2012年12月20日

α付き画像にα付き画像を重ねた時の誤差

パーティクルで、不透明画像にパーティクルを重ねていくものと、α付き画像に重ねていくものを作っているが、α付き画像どうしのブレンドは複雑で割り算が入り誤差が発生しやすい。
合成方法は不透明度付きピクセルのブレンドモード付き合成方法 に書かれている。
こんな感じ。

Ca = Fa+(1-Fa)*Ba
= 1-((1-Fa)*(1-Ba))
= Fa*Ba + Fa*(1-Ba) + (1-Fa)*Ba
Cc =( Fa * Ba * func(Bc,Fc)
+ Fa *(1-Ba) * Fc
+ (1-Fa)*Ba * Bc
) / Ca

単純な合成ならリンクの通りだいぶ省略できるけど、加算合成の場合は複雑。
吉里吉里2だと、α付き画像とα付き画像の通常アルファ合成だけがある模様。
後、MMX版は見当たらず、C版のみのよう。
C版は割り算等の部分をあらかじめ計算してテーブルに持っている。

通常合成のC版はこれでいいとして、加算合成の方は他のアルファ部分の乗数をテーブルで持って、除算が必要。
テーブル部分にあらかじめ除算値を入れていてもいいが、そうしたら誤差の影響かうまくいかなかった。
除算は、0~255 で割るのを加算、乗算、シフト にしてテーブルで持った。
SIMDで整数除算 に書かれている方法。
以下のメソッドで rcp, shift, bias のテーブルを作る。
divが割る値。

void short_rcp( unsigned short div, unsigned short& rcp, unsigned char& shift, unsigned char& bias ) {
  int b = 0;
  for( int i = 0; i < 16; i++ ) {
    if( ( ( div >> ( 15 - i ) ) & 0x1 ) == 1 ) {
      b = 15 - i;
      break;
    }
  }
  unsigned int r = 16 + b;
  unsigned int r2 = 1 << r;
  double f = (double)r2 / div;
  double fm = fmod( f, 1.0 );
  if( fm == 0.0 ) {
    shift = (unsigned char)b;
    rcp = 1;
    bias = 0;
  } else if( fm < 0.5 ) {
    shift = (unsigned char)b + 16;
    rcp = (unsigned short)f;
    bias = 1;
  } else {
    shift = (unsigned char)b + 16;
    rcp = (unsigned short)( f + 0.5 );
    bias = 0;
  }
}

求めた値は、以下の式で使う。
x = (((x + bias)*rcp)>>shift)&0xff;

C版の加算合成は上記の方法で求められ、不透明画像に重ねていく方法と比較して違いがわからない程度になった。
α付き画像への通常アルファ合成と加算合成のC版は出来て、α付きのまま出力できるようになった。
次の問題はSSE2版。
テーブルが使えないので何とか精度を上げて変なところを解消したい。
変なところとは何個も重ねていると一部黒くなって線が見えてしまうところ。

精度を上げるため 255で割る処理は、>>8 で代用していたのを a = (a * 0x8081) >> (7+16) といった処理にするのと、128を加算して、四捨五入した。
割り算部分は、SSE を使い浮動小数点で逆数計算し、SSE2 でかける時は 128を加算し四捨五入。
ニュートン-ラフソン法 を使った逆数の精度向上は余り影響しないようなので止めた。
16bit固定少数での演算になるので、11bit精度のものを22bitに上げてもさほど影響しないのかもしれない。
SSE2版はこのように処理したら、一部黒くなって線が見えてしまうのは回避出来たが、加算合成時は四捨五入の128加算が多すぎるためかC版や不透明版の演算結果と比べて少し明るくなってしまう。

α付き画像にα付き画像を重ねる処理は重いので、あまり使わない方がいいが、状況によっては使いたい。
重ねる数が多いので、SSE2版が明るくなってしまうのはC版と比較すると目立つ。
何とかしたいところではあるが、SSE2版だけなら気にすることもないので、とりあえずはこのままで他の部分を作り込む。

投稿者 Takenori : 01:13 | トラックバック

pee 更新 演算誤差の件

更新。
pee ( Particle Effect Editor) β
演算誤差を解消したのと描画方法の指定を追加。

残りはソートとドキュメント、テストかな。

よくキャラクターの前とかに出るあれを作ってみた。
もうちょっとテクスチャを綺麗に作らないと綺麗にならないな。
このエフェクトには何か名前ついているんだろうか?

投稿者 Takenori : 03:44 | トラックバック

2012年12月21日

描画がカクカクする問題

更新。
pee ( Particle Effect Editor) β

pee で大きな絵をスクロールさせると顕著だったが、何かぷるぷるしているように見える問題がレンダリングして見てみると気になったので調べた。
原因は単純で小数点以下を切り捨てて描画していたから。
拡大コピーなど内部的には固定小数で処理しているので、描画矩形位置の指定も固定小数で渡すようにして描画するようにしたら綺麗に描かれるようになった。

内部的にはバイリニアとニアレストネイバーの両方を持っていたが、速度の都合上ニアレストネイバーで描画していたのを設定で指定可能にした。
これでどうも汚かったものが綺麗にレンダリング出来るようになった。
ただ、重いのでリアルタイムでは厳しい。
最適化しようと考えているが、重いのは重いままだと思う。
そもそもパーティクルはソフトウェア描画だと出しすぎると重いのはある程度仕方ないと思う。
可能な範囲内で最適化はするが。
後、エディタはハードウェア( DirectX )描画を指定できるようになっていたほうがいいか。
エディット中は速い方がいいだろうし。
レンダリングはソフトウェアでいいと思っているが。

バイリニアやスムーズなスクロールは、この雲を綺麗にするために改善した。
当然、他のものも綺麗になっている。

投稿者 Takenori : 04:47 | トラックバック

2012年12月23日

レンダリング画像を使って作る

peeでレンダリングしてテクスチャを作り、それを再び適用する参考動画。
サンプルというか配布予定のプリセット動画はまとめて一つの動画にして、作り方動画を増やした方がいいかな。

投稿者 Takenori : 01:00 | トラックバック

2012年12月26日

pee 正式版リリース

pee ( Particle Effect Editor ) を正式版としてリリース。
パーティクルプラグインの方も更新した。

投稿者 Takenori : 18:47 | トラックバック

2012年12月27日

pee 用プリセット公開

pee ( Particle Effect Editor) プリセットパック

使用条件の範囲内で自由にどうぞ。
吉里吉里2用プラグインpee ( Particle Effect Editor) で読んで再生できます。
そのまま使うよりもどのようにパラメータが設定されているか見て、理解してもらうためのものという位置づけかもしれません。

投稿者 Takenori : 03:19 | トラックバック

2013年01月16日

peeの更新と解説ページ

pee ( Particle Effect Editor) の更新を行った。
今まで常に幅基準で倍率計算していたものを、縦と横で長い方を基準に計算するように修正した。
これによって縦横比が違うテクスチャを使ったパーティクルに影響が出る。
pee 本体以外にプラグインとプリセットパックも更新している。
プラグイン、本体ともに旧バージョンをダウンロード出来るようにしているので、困る場合はそちらを。
ただ、横が細いテクスチャの場合に変に大きくなってしまっていたのを修正するために、長い方基準にしたので新しい方に合わせた方が良い。
データに影響が出る変更は避けたかったが、影響は少ないだろうと言うことと今後のためにも変更しておく。
プリセットパックでは、2個修正したのみ。

いくつかの形状を描いたテクスチャがどのようになるか説明するページを作った。
説明というか、動画で見るページ。
作るときの参考になると思って作ったがどうだろう?
単調な動画が続くが。
このような解説ページは順次増やしたいところ。

今日何気なく作った動画も貼っておく。

ちょっと話が出たのでさくっと作ってみたが、やはりツールがあると楽に試せていい。

投稿者 Takenori : 05:08 | トラックバック

2013年01月18日

発生位置Mask対応中

パーティクルが発生する位置をもう少しコントロールできるといろいろとできるので、Mask画像を指定してコントロールできるよう対応中。
水はね位置をMask画像で行うようにしたのが以下の動画。

もう少しリアルにならないかなと試してみた動画。

もうちょっと工夫の余地がありそうだが、こんなところか。

Mask画像は濃度もコントロールできるようにしたいが、そうすると負荷増が懸念されるので悩ましいところ。
2値画像なら高速に、そうでないのなら少し速度低下と言う感じに対応かな。

Mask画像での描画は出来るようになったので、後は UI の連動とファイル読み書き、プラグイン側の対応。
単なる機能追加なのでファイルの互換性は保たれる。

投稿者 Takenori : 08:41 | トラックバック

 
Total : Today : Yesterday :