WINAPIで加算減算ブレンド

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kazuoni

WINAPIで加算減算ブレンド

#1

投稿記事 by kazuoni » 16年前

お邪魔します。

題名の通り、WINAPIのみでDXライブラリの
加算減算ブレンドを行いたいと考えているのですが・・・
アルファブレンドはAlphaBlend()で、
乗算ブレンドは背景色白の画像をラスタオペレーションSRCAND、マスク画像なし
できそうなのですが、(この時点で間違っていたらそれも指摘してください・・・。)
加算減算はどうやって行えばよいのでしょうか?

よろしくお願いします。

#あと一応ブレンドさえできれば、
自作DXライブラリグラフィック関連は完成なのですが・・・
これによっては、かなりの修正が必要かも・・・

Justy

Re:WINAPIで加算減算ブレンド

#2

投稿記事 by Justy » 16年前


>加算減算はどうやって行えばよいのでしょうか?

 多分 GetObject()とか GetDIBits()でビットマップの中身にアクセスして
自分で加算・減算をするしかないんじゃないかと思いますよ。

kazuoni

Re:WINAPIで加算減算ブレンド

#3

投稿記事 by kazuoni » 16年前

Justyさん、ご回答ありがとうございます!

>自分で加算・減算
やはりですかっ^^;
こんなの毎ループ行ったらめちゃくちゃ重っ(ry
了解しました。何とか工夫して実装してみたいと思います。

ご回答ありがとうございました!
次回もよろしくお願いします。

Justy

Re:WINAPIで加算減算ブレンド

#4

投稿記事 by Justy » 16年前

 MMXをうまく使えばそれなりにパフォーマンスが上がることが期待できるはずです。
 
 最悪、コンパイラの最適化に任せっきりではなく、出力されたコードを
見ながらパフォーマンス調整が必要になるかもしれませんね。

kazuoni

Re:WINAPIで加算減算ブレンド

#5

投稿記事 by kazuoni » 16年前

返事が遅れて申し訳ありませんでした。。
とりあえず、挑戦してみました。

が、正直、何をやったらいいかがちんぷんかんぷんです。。
Win32 MASM プログラミング入門
ttp://www7.plala.or.jp/keny01/asm/win32/index.html#sub8-4
のサイトで、加算ブレンドを発見したのですが、
頭の中では、
1、GetDIBits()で二つの画像のデータを全行抜き出す
2、MMXを用いて、オール加算

みたいな雰囲気だと思うのですが・・・
どのように組んだらいいかさっぱりなのですが・・・

御津凪

Re:WINAPIで加算減算ブレンド

#6

投稿記事 by 御津凪 » 16年前

そちらに載っている関数を流用するだけで、 lpDestBuf に lpSrcBuf1 と lpSrcBuf2 の各バイトごとに加算ブレンドされたデータが入るようになっています。
(ただし、関数説明にあるようにデータは8の倍数のサイズである必要があります)

関数の中身はアセンブラで書かれている(MMX 命令を使用している)ので少し慣れないと分かりにくいかと思います。
ちょうどリンク先の上に MMX 命令の表が載っているので、アセンブラを少し調べたら関数の中身もわかるかと思いますよ。

中身を理解した上で後は関数を組み込んで、8の倍数で余った部分の計算をしておくように処理を追加すれば万全かと。

kazuoni

Re:WINAPIで加算減算ブレンド

#7

投稿記事 by kazuoni » 16年前

持ち上げごめんなさい。。
そして、御津凪さん、ご回答ありがとうございます!
返事がかなり遅れてしまいました。申し訳ありませんでした。。

その後、なんとか、もぞもぞとやっているのですが、
肝心のMMXの前の段階のビットマップRGBの取得に悪戦苦闘しています。。

COLORREFの取得まではなんとかなりそうなのですが、
それの各要素10進化(unsigned char化)
するのに、どのようなアルゴリズムを組めば
一番効率がいいのか悩んでおります。
Get〇Valueを使えば、RGB取得は可能ですが、
画像が二つあり、しかもある程度の範囲(400×300等)
があると、これを全ビットするのも結構の負担になるのではないかと思いまして・・・。
アセンブラで描くとすればどのようなアルゴリズムになるのでしょうか?
右シフトを24回繰り返してそれぞれを記録すれば
一つの関数でBGRの順に取得できるのでは?なんて思ったりしていますが・・・。。
はたまた、そのままGet○Valueでいけるのか・・・。

Justy

Re:WINAPIで加算減算ブレンド

#8

投稿記事 by Justy » 16年前


>MMXの前の段階のビットマップRGBの取得に悪戦苦闘しています
>アセンブラで描くとすればどのようなアルゴリズムになるのでしょうか

 いいサンプルを見つけました。

MMX de Alpha Blending
ttp://www.fides.dti.ne.jp/~tokai/vc/mmxab1.html

MMX de Alpha Blending 2
ttp://www.fides.dti.ne.jp/~tokai/vc/mmxab2.html

MMX de Alpha Blending 3
ttp://www.fides.dti.ne.jp/~tokai/vc/mmxab3.html

MMX de Alpha Blending 4
ttp://www.fides.dti.ne.jp/~tokai/vc/mmxab4.html

 4のページにも書かれていますが、あきらかにストールしている箇所が
ありますし、ループの組み方などまだまだ最適化できそうですね。

kazuoni

Re:WINAPIで加算減算ブレンド

#9

投稿記事 by kazuoni » 16年前

Justyさn、ご回答ありがとうございます!

>あきらかにストールしている箇所

ストールという言葉が初耳で、
具体的にどこと指していただけるとありがたいのですが・・・
ペアリングとかそのあたりですか?

とりあえず、一通りのアセンブラの使い方を
学習し、最適化へと進みたいのですが、
そのペアリングでちゃんと最適化されているのか
がいまいち分かりません(汗)
なので、今ずっとどの組み合わせでやると
いい速度が出るのか淡々と実験していますw
まだ自分のなかで、「この組み合わせが有効」っとかあまり見えていませんが。。
命令表をみて、これならいけるだろっと思ったものが、
意外な組み合わせのほうが速かったり・・・
なんてこともありますが。。(CPU依存もあるでしょうし・・・)

「実際、こんなプロセスで最適化の訓練積んだよ」ッというのがありましたら、
是非レスお願いします^^;

このスレはこれ以上いくとタイトルの内容から逸脱するので、
今回はこのあたりでやめておきます^^;
おそらく近いうちに新スレがたちそっ(ry

Justyさん、御津凪さんご回答ありがとうございました!
何度も返事が遅れて申し訳ありませんでした。。

次回もよろしくお願いします。

#パック、アンパックの動作を理解したら
カラー取得は解決しました!ありがとうございました!

Justy

Re:WINAPIで加算減算ブレンド

#10

投稿記事 by Justy » 16年前

 画像処理の部分なのである程度の高速化は必須だとは思いますが、
今の段階では最適化とかあまり考えず、とりあえず C/C++でいいので
普通に動くものを目指した方がいいかと思います。

 このあたりはやり始めるとキリがないですし、C/CPP -> SIMD化は
ある程度やれば効果はありますが、引き替えにメンテナンス性など
失ったりしますので。



>ストールという言葉

 データの依存関係などで CPUのパイプラインが進まなくなることを
意味しています。
 そのあたりはCPUの解説書・マニュアルを見るなり検索をしてみてください。

ストール - 通信用語の基礎知識
ttp://www.wdic.org/w/SCI/%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

 でも、今はあまり気にする必要はないかと。



>これならいけるだろっと思ったものが、
>意外な組み合わせのほうが速かったり・

 これはもうマニュアル見たり、サンプルコードなど他人が書いたコードを解析したり、
実際に書いて動かしてレジスタの中身がどう変化したのか見て……を
繰り返して慣れるしかないですね。

閉鎖

“C言語何でも質問掲示板” へ戻る