お邪魔します。
題名の通り、WINAPIのみでDXライブラリの
加算減算ブレンドを行いたいと考えているのですが・・・
アルファブレンドはAlphaBlend()で、
乗算ブレンドは背景色白の画像をラスタオペレーションSRCAND、マスク画像なし
できそうなのですが、(この時点で間違っていたらそれも指摘してください・・・。)
加算減算はどうやって行えばよいのでしょうか?
よろしくお願いします。
#あと一応ブレンドさえできれば、
自作DXライブラリグラフィック関連は完成なのですが・・・
これによっては、かなりの修正が必要かも・・・
WINAPIで加算減算ブレンド
Re:WINAPIで加算減算ブレンド
>加算減算はどうやって行えばよいのでしょうか?
多分 GetObject()とか GetDIBits()でビットマップの中身にアクセスして
自分で加算・減算をするしかないんじゃないかと思いますよ。
Re:WINAPIで加算減算ブレンド
Justyさん、ご回答ありがとうございます!
>自分で加算・減算
やはりですかっ^^;
こんなの毎ループ行ったらめちゃくちゃ重っ(ry
了解しました。何とか工夫して実装してみたいと思います。
ご回答ありがとうございました!
次回もよろしくお願いします。
>自分で加算・減算
やはりですかっ^^;
こんなの毎ループ行ったらめちゃくちゃ重っ(ry
了解しました。何とか工夫して実装してみたいと思います。
ご回答ありがとうございました!
次回もよろしくお願いします。
Re:WINAPIで加算減算ブレンド
MMXをうまく使えばそれなりにパフォーマンスが上がることが期待できるはずです。
最悪、コンパイラの最適化に任せっきりではなく、出力されたコードを
見ながらパフォーマンス調整が必要になるかもしれませんね。
最悪、コンパイラの最適化に任せっきりではなく、出力されたコードを
見ながらパフォーマンス調整が必要になるかもしれませんね。
Re:WINAPIで加算減算ブレンド
返事が遅れて申し訳ありませんでした。。
とりあえず、挑戦してみました。
が、正直、何をやったらいいかがちんぷんかんぷんです。。
Win32 MASM プログラミング入門
ttp://www7.plala.or.jp/keny01/asm/win32/index.html#sub8-4
のサイトで、加算ブレンドを発見したのですが、
頭の中では、
1、GetDIBits()で二つの画像のデータを全行抜き出す
2、MMXを用いて、オール加算
みたいな雰囲気だと思うのですが・・・
どのように組んだらいいかさっぱりなのですが・・・
とりあえず、挑戦してみました。
が、正直、何をやったらいいかがちんぷんかんぷんです。。
Win32 MASM プログラミング入門
ttp://www7.plala.or.jp/keny01/asm/win32/index.html#sub8-4
のサイトで、加算ブレンドを発見したのですが、
頭の中では、
1、GetDIBits()で二つの画像のデータを全行抜き出す
2、MMXを用いて、オール加算
みたいな雰囲気だと思うのですが・・・
どのように組んだらいいかさっぱりなのですが・・・
Re:WINAPIで加算減算ブレンド
そちらに載っている関数を流用するだけで、 lpDestBuf に lpSrcBuf1 と lpSrcBuf2 の各バイトごとに加算ブレンドされたデータが入るようになっています。
(ただし、関数説明にあるようにデータは8の倍数のサイズである必要があります)
関数の中身はアセンブラで書かれている(MMX 命令を使用している)ので少し慣れないと分かりにくいかと思います。
ちょうどリンク先の上に MMX 命令の表が載っているので、アセンブラを少し調べたら関数の中身もわかるかと思いますよ。
中身を理解した上で後は関数を組み込んで、8の倍数で余った部分の計算をしておくように処理を追加すれば万全かと。
(ただし、関数説明にあるようにデータは8の倍数のサイズである必要があります)
関数の中身はアセンブラで書かれている(MMX 命令を使用している)ので少し慣れないと分かりにくいかと思います。
ちょうどリンク先の上に MMX 命令の表が載っているので、アセンブラを少し調べたら関数の中身もわかるかと思いますよ。
中身を理解した上で後は関数を組み込んで、8の倍数で余った部分の計算をしておくように処理を追加すれば万全かと。
Re:WINAPIで加算減算ブレンド
持ち上げごめんなさい。。
そして、御津凪さん、ご回答ありがとうございます!
返事がかなり遅れてしまいました。申し訳ありませんでした。。
その後、なんとか、もぞもぞとやっているのですが、
肝心のMMXの前の段階のビットマップRGBの取得に悪戦苦闘しています。。
COLORREFの取得まではなんとかなりそうなのですが、
それの各要素10進化(unsigned char化)
するのに、どのようなアルゴリズムを組めば
一番効率がいいのか悩んでおります。
Get〇Valueを使えば、RGB取得は可能ですが、
画像が二つあり、しかもある程度の範囲(400×300等)
があると、これを全ビットするのも結構の負担になるのではないかと思いまして・・・。
アセンブラで描くとすればどのようなアルゴリズムになるのでしょうか?
右シフトを24回繰り返してそれぞれを記録すれば
一つの関数でBGRの順に取得できるのでは?なんて思ったりしていますが・・・。。
はたまた、そのままGet○Valueでいけるのか・・・。
そして、御津凪さん、ご回答ありがとうございます!
返事がかなり遅れてしまいました。申し訳ありませんでした。。
その後、なんとか、もぞもぞとやっているのですが、
肝心のMMXの前の段階のビットマップRGBの取得に悪戦苦闘しています。。
COLORREFの取得まではなんとかなりそうなのですが、
それの各要素10進化(unsigned char化)
するのに、どのようなアルゴリズムを組めば
一番効率がいいのか悩んでおります。
Get〇Valueを使えば、RGB取得は可能ですが、
画像が二つあり、しかもある程度の範囲(400×300等)
があると、これを全ビットするのも結構の負担になるのではないかと思いまして・・・。
アセンブラで描くとすればどのようなアルゴリズムになるのでしょうか?
右シフトを24回繰り返してそれぞれを記録すれば
一つの関数でBGRの順に取得できるのでは?なんて思ったりしていますが・・・。。
はたまた、そのままGet○Valueでいけるのか・・・。
Re:WINAPIで加算減算ブレンド
>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のページにも書かれていますが、あきらかにストールしている箇所が
ありますし、ループの組み方などまだまだ最適化できそうですね。
Re:WINAPIで加算減算ブレンド
Justyさn、ご回答ありがとうございます!
>あきらかにストールしている箇所
ストールという言葉が初耳で、
具体的にどこと指していただけるとありがたいのですが・・・
ペアリングとかそのあたりですか?
とりあえず、一通りのアセンブラの使い方を
学習し、最適化へと進みたいのですが、
そのペアリングでちゃんと最適化されているのか
がいまいち分かりません(汗)
なので、今ずっとどの組み合わせでやると
いい速度が出るのか淡々と実験していますw
まだ自分のなかで、「この組み合わせが有効」っとかあまり見えていませんが。。
命令表をみて、これならいけるだろっと思ったものが、
意外な組み合わせのほうが速かったり・・・
なんてこともありますが。。(CPU依存もあるでしょうし・・・)
「実際、こんなプロセスで最適化の訓練積んだよ」ッというのがありましたら、
是非レスお願いします^^;
このスレはこれ以上いくとタイトルの内容から逸脱するので、
今回はこのあたりでやめておきます^^;
おそらく近いうちに新スレがたちそっ(ry
Justyさん、御津凪さんご回答ありがとうございました!
何度も返事が遅れて申し訳ありませんでした。。
次回もよろしくお願いします。
#パック、アンパックの動作を理解したら
カラー取得は解決しました!ありがとうございました!
>あきらかにストールしている箇所
ストールという言葉が初耳で、
具体的にどこと指していただけるとありがたいのですが・・・
ペアリングとかそのあたりですか?
とりあえず、一通りのアセンブラの使い方を
学習し、最適化へと進みたいのですが、
そのペアリングでちゃんと最適化されているのか
がいまいち分かりません(汗)
なので、今ずっとどの組み合わせでやると
いい速度が出るのか淡々と実験していますw
まだ自分のなかで、「この組み合わせが有効」っとかあまり見えていませんが。。
命令表をみて、これならいけるだろっと思ったものが、
意外な組み合わせのほうが速かったり・・・
なんてこともありますが。。(CPU依存もあるでしょうし・・・)
「実際、こんなプロセスで最適化の訓練積んだよ」ッというのがありましたら、
是非レスお願いします^^;
このスレはこれ以上いくとタイトルの内容から逸脱するので、
今回はこのあたりでやめておきます^^;
おそらく近いうちに新スレがたちそっ(ry
Justyさん、御津凪さんご回答ありがとうございました!
何度も返事が遅れて申し訳ありませんでした。。
次回もよろしくお願いします。
#パック、アンパックの動作を理解したら
カラー取得は解決しました!ありがとうございました!
Re:WINAPIで加算減算ブレンド
画像処理の部分なのである程度の高速化は必須だとは思いますが、
今の段階では最適化とかあまり考えず、とりあえず 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/C++でいいので
普通に動くものを目指した方がいいかと思います。
このあたりはやり始めるとキリがないですし、C/CPP -> SIMD化は
ある程度やれば効果はありますが、引き替えにメンテナンス性など
失ったりしますので。
>ストールという言葉
データの依存関係などで CPUのパイプラインが進まなくなることを
意味しています。
そのあたりはCPUの解説書・マニュアルを見るなり検索をしてみてください。
ストール - 通信用語の基礎知識
ttp://www.wdic.org/w/SCI/%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
でも、今はあまり気にする必要はないかと。
>これならいけるだろっと思ったものが、
>意外な組み合わせのほうが速かったり・
これはもうマニュアル見たり、サンプルコードなど他人が書いたコードを解析したり、
実際に書いて動かしてレジスタの中身がどう変化したのか見て……を
繰り返して慣れるしかないですね。