WindowModePatch 0.52 Alphaを公開

今回はバグフィックスがメインです。とは言っても新規に処理を追加して拡張もしているのでさらに強力になっています。何回か0.52Alphaの候補版を書き換えてできあがったものですのでそれなりになっていると思います。が、内部的な変更がかなりあるので前のバージョンもしばらく残しておきます。

Direct3D9の拡張処理(IDirect3D9Ex系)を暫定的に実装した

あくまで「暫定的に」です。第一にターゲットしているADVゲームのエンジンはまずこれを使用しません。理由は単純で、IDirect3D9Ex系はWindowsVista以上でないとサポートされない仕様だからです。そのため、WindowsXPをサポートしているほぼすべてのADVエンジンはこの処理に対応しているとはまず思えません。なお、これがなかった理由はDirectX9の処理部でWindowsXPを基準にしていたためこの部分がすっぽ抜けていた、というものです。最高でもDirectX9までなので現行のままでも問題ないと言えば問題ないですが・・・。

実装した理由は「拡張がやりやすそうだったから」と「DirectX10系以上への対応の前段階?」というところです。実際にはやりやすいと言うことは全くなく、実装し始めて内部的に実装後先々バグになりそうなポイントが見つかったためその修正やら処理の変更に思わぬ時間をとられてしまいました。まあ一度修正をしておけばその後が楽なのでこういう作業も必要というところでしょうか。

 

あまりにも細々したポイントを修正

他は本当に「その他細かい点を修正」です。細かすぎるポイントが大量にあるため修正した自分も項目を正確には覚えていません。ウィンドウサイズの変更部に微妙なバグがあったのを修正したり、パッチ処理もルーチンをまとめたり、補間処理についてもPixelShaderの部分を見直して修正を行ったり・・・。特にLanczosの計算部分でsinc関数を使う部分があるのですが、どうも計算時の精度が悪い部分があるらしく、その部分を修正して画像が不正にならないようにしました。そのためちょっと時間がかかるようになってしまっているかも。

あと、解像度の情報を追加しました。テスト中にQuarter-VGA(320×240)の指定をするために毎回直接入力にするのが非常に面倒になったためです。ちなみに内部表記は特殊になっています。元々あったQuad-VGA(1280×960)と略称表記が両方とも「QVGA」になってしまうためで、気になる人は設定ファイルにどう記述されるのか見てみるとおもしろいかもしれません。そのほかにも大きい方の解像度の情報も追加しています。

 

シェーダのコンパイラは超越関数の展開までやっちゃうのね・・・

この記事に書くのは微妙ですが、PixelShaderの部分を見直してみて思ったことです。

状態を調べるためにわざとアセンブルコードを出力させたのですが、sinやcosを使う部分ではだいたいの場合それらを使う命令は存在していていないと思います。どうやっているのかというとこの手のやつではよく出てくる「マクローリン展開」をつかって近似式計算を内部でやっています。しかもsinを使っている場合でもわざわざcosに変換した状態で計算しているのがおもしろいところです。cosの場合はマクローリン展開をするとxの偶数乗の項だけになるためシェーダーで計算しやすいというところでしょうか。

ちなみになぜ展開するかを推察するなら、sincosという命令があることはあるのですが、これはスカラー(一つの値)に対してのみであり、複数要素を同時に計算することができない、という問題があります。通常シェーダでは2要素まとめて、というように演算するので複数同時に計算できるマクローリン展開を使った計算の方がやりやすい、という意味があると思われます。なお、sinc関数の場合は確かにsinが出てくるのですがマクローリン展開を使うとcosと非常に似た演算になる(というかcosの係数違いになる)のでそちらで記述した方がよいようです。

 


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

この記事のトラックバック用URL