お知らせ:このサイトは閉鎖します。移転先についてはhttp://projectroom.jphttp://haukun.projectroom.jpを参照ください。
新約聖書 マタイによる福音書朗読TwitterBot @BibleJP_Matt好きなテキストをiPhoneの壁紙に。iPhone用Webアプリ「ポステラ」聖書 創世記朗読TwitterBot @BibleJP_GenCodeOfCelestia -数学的壁紙配信サイト-

この記事は、旧システム用に書かれたものです。
本システムでは正常に表示されない可能性があります。ご了承ください。


VB6の未来に賭けて 【趣】

やっとひと段落着いたので、久々にVBプログラミングでも。

昨日の章

最近やりたかったのは、ピクセル単位での描画(ピクセル=ドットでだいたい間違ってないです)。例えば、フラクタル画像とか『点』で描画する際に有効となる方法。 今までは、『1ピクセルの点のテクスチャを作成し、それを画面に敷き詰める』という手法をとっていたのだけど。これだと例えば400x400の画面では160000回も描画関数を呼ばないといけない。もちろんこれは高コスト。 さらに、毎回テクスチャを再描画しないといけないので、無駄に重いものとなってしまう。これでは『フラクタル画像を作って、そのあと』ができない。作るので精一杯だからである。

そこで、DirectX8のほかの機能でどうにかできないものかと調べてみる。するとほどなくして、ColorFill()という関数を発見。これはとある領域をとある色で塗りつぶせるものらしい。
これはテクスチャを直接いじるものなので、(多分)上記のテクスチャを大量に書くよりは早いはずである。

…が、しかし。どう検索してもColorFill()が出てこない。と、それもそのはず。この関数はDirectX9で新規に導入されたもののよう。X8で使えるわけが無い。
よし、じゃあこの機会にX9に乗り換えようか!とも思ったけど、残念ながらVB6がサポートしているのはX8まで…。.NETだとX9が使えるようです。が、.NETを使う気にはならない。

というわけで。残念。と、今回のプロジェクトが終わろうとしていたその時!

別のページで、『テクスチャが入っているメモリ(ここには各ピクセルの色情報が入っている)にアクセスして、それを書き換える』という技を発見。なるほど。
早速この方法を試してみる。テクスチャをロックして、テクスチャ情報が格納されている先頭のポインタを取得して、そのポインタにD3DColorValueを記入…。え、ポインタ?

そう、ポインタ。C系の言語にはあって、いろんな用途に使える概念。ポインタはメモリ上の住所であり、例えば『メモリ12345番地からテクスチャのデータが始まりますよー』っていうのさえ知ることができれば、10番目のピクセルのデータは12354番地にあるねっていうのが分かるわけ。
いろいろ難しいので、VBでは意識しなくていいように作られている。ちなみにVB上では、【変数⇒ポインタ』はできるんだけど、【ポインタ⇒変数】ができない。

いままでメモリをどうこういじることも無かったから、確かにポインタはいらないねぇ、VB万歳と思ってた。だけど、『ビデオメモリ(だと思う)』をいじると言う方法があったのは盲点。
今回は上記にも書いたとおりVBの仕様なのでどうしようもない。

よって、敗北。惨敗。


今日の章

リベンジをかけてみる。なぜならば、違う方法を思いついたから。

それは以下のような方法。
①ポインタはC++なら使うことが可能である。
②C++はDLLというファイルを作成することができる。
③DLLはVBで読み込むことが可能。

つまり、C++でポインタを弄くる関数を定義し、それをVB6から使おうという技。VBから見れば、ただのDLLの呼び出しなので、ポインタとか関係なく実行可能である。
あんまり好きじゃないんだけど、VS2005を立ち上げVC++を起動。DLL作成にしていざ開始!
インターネットで調べたところ、エクスポートしないと他の言語から参照できない模様。 また、普通に定義すると、関数名がfunc@XYYZZみたいに予測しにくいものになってしまうようなので、extern "C"というものを入れる。こうすると、func@8というように数字になるため、VBからも簡単に参照できるようになる。
このextern "C"は仕組みがよく分からなかったので、例の『おまじない』と言う事で理解しておいた。 あとは昨年のポインタの講義を思い出しながらC++でポインタいじくり関数を実装。『ポインタ番地』と『値』を放り込むと、該当番地に値を記入してくれるというもの。これにより『ポインタ⇒変数』がVB上でも使えるようになるはず!

DLLが完成したら、早速VB6で読み込んでみる。
そして、いざ戦闘開始!

テクスチャをロックして、テクスチャ情報が格納されている先頭のポインタを取得して…。このポインタとRGB(255,0,0)を例のDLLのほうに飛ばす。
すると、DLLがピクセルの情報を書き換えてくれる。これを広範囲で行えば…。

ピクセルへアクセス成功。VBの限界を打ち破った瞬間でもあります。

さらに1ピクセルずつちまちまやらないで、配列を送り込んでみる。C言語上では配列もポインタなので一気に処理が可能。

FPSは3…。だがまだ改良の余地はあるし何とかなるだろう。


まだまだ.NETやCに移らなくても大丈夫なようです。VB6愛してる。


このコンテンツへのコメント

コメント無し

コメントフォーム
名前
(Max15文字)
削除パスワード
(Max15文字)
コメント
(Max1500文字)
コメントを投稿する※投稿する場合はこちらをチェック。
コメントを削除する※名前欄にIDを、削除パスワードに投稿時のパスワードを入れることで削除できます。

2013年もよろしくお願いいたします!

合計 228095
12/12 20
12/11 99
12/10 80
12/09 93
12/08 78
12/07 93
12/06 98
1,721,393
478 時間
19
5.4585
[とても昔]
アプリ内は良さそうだけど、ホーム画面はのっぺりしちゃうなぁ…。
[とても昔]
次のOSXそう来たかw
[とても昔]
SurfaceProゲットなう。思ったよりタッチ画面が使いやすかった。キーボードの縦幅短いから、画面と近いからかな。 これで、Win8/iOS/Androidアプリどれでも作れる! http://t.co/7CXQCVVao5
[とても昔]
じわじわくるw >RT
[とても昔]
スタジオレンタルして、15年ぶりにピアノを弾くなう。あとステージアも初体験できて良かった。近場で便利。フロッピーじゃなく、USBでレジストいけるのね。楽譜もネットで購入→印刷できるので、買いに行く必要すらなくなった。すごい時代。 http://t.co/9gRBztS2UB
@Hau_kun

Twitterでマタイによる福音書を読んでみませんか @BibleJP_Mattで朗読中 Twitterで創世記を読んでみませんか @BibleJP_Genで朗読中 好きなテキストをiPhoneの壁紙に。iPhone用Webアプリ「ポステラ」

区切り線
はぅ君プロジェクトについて

管理人はぅ君の運営する個人ポータルサイトです。
技術・思想・ソフトウェア・その他もろもろをコンテンツとして公開していきます。
ご意見・ご感想・要望は、各コンテンツのコメントか、お問い合わせよりどうぞ。

Rss 1.0 RSS1.0のフィード