GDIを使ってみた
フォームやコントロールにちょっと図形を表示するだけならわざわざDirectXを
使わなくても…、ということで、.Net FrameworkではGDI+がサポートされているので、
それを使ってみることに。
Graphicクラスに図形描画系のメソッドが詰め込まれているので使ってみたのだが、
例によって少々問題が発生…。
とりあえずマニュアルに書いてある、Control.Paintイベントを処理し、
送られてくるSystem.Windows.Forms.PaintEventArgクラスのGraphicsプロパティを
使って描画してみることに。
確かに描画はされたのだが、その後、消すこともパラメータを変更することもできない…。
一度描画されてしまうとその後のPaintイベントで何も記述しなくても消えないし、
かと言って消すためのメソッドも見当たらない。
Dispose()メソッドを使って解放かと思いきや、そんなメソッドは実装されていないと
コンパイルエラー。IDisposableインターフェース内の仮想メソッドのようだが、
実装されていないのだろうか…?っていうかインターフェース継承してて実装しないとか
アリなのか?
まぁそんなこんなで座標も色も変えられず困っていたのだが、なんとか解決策が見付かった!
図形を描画するコントロールからCreateGraphics()メソッドでオブジェクトを生成し、
そのコントロールのPaintイベントからこのオブジェクトを使ってDrawRectangleなどで描画すれば
きちんと描画されるし、パラメータの更新も反映される。
それにしてもイベントに送られてくるPaintEventArg->Graphicsってのは何なんだ…。
何なんだっていうか、Graphicsプロパティを使った場合の制御の仕方が知りたいところ。
Vistaの罠
まぁ罠ってわけじゃないんですが、作ったアプリの試作品を別の環境で実行させてみたところ、激烈に重い…。
原因不明っていうか、明らかにDirectXの描画部分がソフトウェアエミュレーションっぽい感じだったので
調べてみたところ、グラボがDirectX10,シェーダー4.0に対応してないことが判明。
ちなみに自分のマシンはDirectX10対応しているnVidiaのボードだった。
VistaはDirect10ベースだから全然安心して作ってたんだけど、こんな事になるとわ…。
そんなわけで、いまさらDirectX9ベースに作り変えるのも手間ってことで、
ソフトを導入するマシンにはDirectX10対応グラボを入れてもらうという解決策をとりました。
それにしても4画面対応のグラボってちゃんと対応してるか調べないと駄目なのね。
てっきりどのグラボもやってくれるもんかと思ってたんだけど。
しかも4画面対応のDirectX10対応ってグラボ、高いし、少ないね。
NVIDIA QuadroNVS 450とかがそう。
サイド・バイ・サイド
良く作ったアプリを他の環境で動かすと、「サイド・バイ・サイドがXXX」的なエラーメッセージが
表示されて、実行できないことがある。
軽くスルーしてたのだが、そろそろそういうわけにもいくまい、調べてみるか、っていう事で、
さわりだけ調べてみた。
簡単に言えば、「このアプリはこのアセンブリを使って実行します」的なメタファイルを使って
実行することっぽい。このメタファイルにはアセンブリのバージョンとかが記述されており、
これが違うと実行できないようだ。
ただ、バージョン管理機能っていうのを使うことで、新しいバージョンのアセンブリにリダイレクト
してくれるようだ。
それにはバージョンポリシーの設定が必要らしいが、まだ詳しく調べていない…。
シェーダーのグローバル変数
シェーダー関数内で、シェーダー内のグローバル変数の値を変更しようとするとコンパイラに怒られる。
GPUによるグローバル変数の変更は禁じられているようだ。
なので、エフェクトを使っているのであれば、SetFloatなどを使って変数をセットすればいい。
グローバル変数にstaticをつけるとコンパイラに怒られることはなくなるのだが、
値を代入しようとしても反映されない。
どうやらシェーダー内のstaticグローバル変数はアプリケーションへの公開を禁じるだけで
値の変更は許可されていないようだ。
だったらコンパイラエラー出して欲しいもんだが、コンパイルできるって事は
何か変更する手段があるのだろうか…。
海外のフォーラムとかでも似たような質問があったが、やっぱり駄目っぽいね…。
なので、D3DDevice->Draw()単位で必要に応じてグローバル変数の変更をする必要がある。
自分のやり方としては、自前のプリミティブシーケンスバッファに変数セットデータを登録し、
Draw()の前に変数をセットするようにしている。
最終更新:2009年01月06日 19:43