プラグイン作成について

レイヤープラグインの作成に関してです。
koppe panさんの<レイヤーブレンドの作成方法>のおかげで、自分でも作れる! と思ったけど苦労したので・・・。
プラグインを作りたい方への補足説明になればと思います。

■ Microsoft Visual C++ 2008 Express Edition
これを検索すると、マイクロソフトのページだとMicrosoft Visual Studio 2008 Express Edition SP1 が出てきます。
これは
Visual Basic 2008 Express Edition
Visual C# 2008 Express Edition
Visual C++ 2008 Express Edition
Visual Web Developer 2008 Express Edition
これら4種のアプリケーションがセットになったもののようです。
しかも.ISOのイメージファイルorz

C++以外は不要なので、http://homepage2.nifty.com/nonnon/Chinamini/20110001/20110307.htmlここからDLしました。


■ 1つのレイヤーモードで4種作成
koppe panさんが書いてくれていますが、
//合成を行う関数
//下のレイヤーと結合
と、あります。「表示させるだけ」と、「下のレイヤーと結合」は別計算ってことですね。
そして、カラー用とグレースケール用の2種があるため、レイヤーモードは1つでも記述は4種必要ということになります。

私はまず、表示用(合成を行う関数)の、カラー用から作成しました。
それが完成したら、グレスケ側にコピペ。
グレスケは色情報が1つなので、*(dst + 1)こういうカラー用を削除します。それでOK。
下のレイヤーと結合も、表示用(カラー)をコピペ。
こちらは計算に使っていた*(dst + 1)こういうのを*(base_col + 1)に変更して、*(dst + 3)を増やして、*base_alphaを計算に組み込めばOK。

「下のレイヤーと結合」のカラー用が上手くいけば、それをグレスケ用にコピペします。
カラー用の部分を削除するだけです。


■ 肝心の計算部分
見本があるなら、計算式を探して試して探して試してを繰り返します。
ビビットライト・リニアライト・ピンライトは、フォトショップ7と同じ色合いを目指して作りました。
(数値が1or2ずれるのは諦めた)
計算式が見つかっても、アルファ値の入れ方が分からず困ったのですが、これらはよく見ると不透明度100%でまず固定されていました。
アルファ値を混ぜて計算してはいけなかったのですね。
なので、まずはアルファ値無視で色データを計算し、それからアルファ値を入れて、下にある全てのレイヤーのRGBと組み合わせた計算をしました。

んで。基本は1ドットに対する計算のようで。
while (col < col_end) {
(略)
alpha += alpha_step;
col += col_step;
dst += col_step;
}
この繰り返し記述を削除して黒指定すると、左端から64pixel×64pixelごとに1ドット描画されます。
_stepで次のピクセルに進みます。
dst += col_step*4; と書くと、5pixel目に描画されます。
dst += col_step*64; だと、2行目の左端。

64pixel×64pixelは固定で、猫ペの本体側で分割&繰り返ししているようです。
砂トーン2pixel×2pixelは、1ドットの結果で他3箇所も決めなければならなかったので、この_step;で位置指定して描画を行ったり来たりしています。


■ 「下のレイヤーと結合」はアルファ値の計算が増える
私が泣かされた部分です。
ビビットライトとかの、下のレイヤーの不透明度が下がってるときの計算は諦めましたし・・・。
検索しても、アルファ値混ぜた計算式は載っていないんですよね。

表示用のときには省略しても良かったけど、結合用だと透明なら透明だと指定する必要があります。
結合してみると黒くなった という時は、アルファ値の指定が足りてない可能性が高いです。
まぁ、肝心の計算式が思いつかなければどうしようもないんですけどねorz

ちなみに、アルファ値も色と同じで上限255です。
不透明度80%だとすると、内部データのアルファ値は204です
描画色R70,G140,B226 で下の色がR255,G255,B255のとき、不透明度80%ならば
R 70×(204/255) + 255×(1-204/255) = 107
G 140×(204/255) + 255×(1-204/255) = 163
B 226×(204/255) + 255×(1-204/255) = 231.8
となります。
アルファ値は描画とレイヤーの2箇所にあるはずですが、*alpha は両方を含んでいるっぽいですね。
自分はこの辺り理解できていませんが・・・。
*記号のついたものは特別! としか思ってなくても、肝心の計算式と描画範囲さえわかっていればどうにかなります。

2013/2/15 追記
ビビットライト・リニアライト・ピンライトの結合時の計算式は思い違いをしていました。
表示用と同様、不透明度100%の計算をしてから通常レイヤーと同じアルファ値を入れた計算をする。
私は単に通常レイヤーの結合用のアルファ値混ぜた計算式を分かってなかっただけでした・・・。
リニアライト用とかの計算方法が必要だと思ってたよorz

計算式はこちらのサイト
ロジカルめがね」 → 不透明度付きピクセルのブレンドモード付き合成方法

面倒だったのは、先にアルファ値を0〜1の数値にする為に /255 としていても、小数点が切り捨てられていたこと。
・・・と思ったら、unsigned が邪魔だったのか。
unsigned int の int は知ってるから double に変更してたんですけどね。
小数点切捨てられるのが unsigned の所為だとは思わなかったorz

posted by むらせ at 2013年02月06日 03:46 | レイヤープラグイン/テクスチャ | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。