Radeon X1000 系で exception のエフェクトを有効にしてみた

うちのビデオカードRadeon X1600Pro なので、Config 画面で透過光やブラー・ブルームなどのエフェクトを有効にすることができません。*1
エフェクトなしでも綺麗な画面が出てますし、ゲーム性自体には全く影響がないので十分楽しんでいましたが、Youtube に上がっているムービーを見ているとやはり色々と違いが気になってしまい、一時は Radeon 生活から宗旨換え(笑)して GeForce8800GT あたりを物色しようかとも考えていました。
id:i-saint さんの日記(id:i-saint:20071115) によると、Radeon では non_power_of_two な(縦横サイズが 2 の累乗になってない)テクスチャに非対応という辺りが問題らしいです。
exception の製品版にはありがたいことにソースが付属していますので、もし問題がそこだけなら自力で対処できるかも…と思い、調べてみました。

最初に変更したのは以下の 2 箇所です。

  • non_power_of_two に非対応でもシェーダー・ブラー等が有効にできるようコンフィグ画面のロジックを改造
  • FrameBuffer クラスを、生成時に要求されたサイズを含む 2 の累乗サイズのテクスチャを取得するように変更
  • (あと、画面モードに 512x384 を勝手に追加しました。うちの X1600Pro では 1024x748 だとフレームスキップが頻発してましたので…)

ここまで改造した時点で、一応エフェクトは動きます。ただ、FrameBuffer のテクスチャサイズの違いによりエフェクトがずれる問題が起きてしまいます。(id:logion:20080219 の画像参照)

さらに調査して、以下の変更を行いました。

  • IFrameBuffer にテクスチャの縦横サイズ(2の累乗)・使用するフレームバッファの縦横サイズを取得するメソッドを追加
  • Bloom::draw(), ImpactBase::draw(), DirectionalImpact::draw() において、上のメソッドを使い描画座標やテクスチャの UV 座標を修正

ここまで改造した所で、エフェクトのずれはなくなったように見えます。もっとも、GeForce 6000 系以降のビデオカードが手元にないため、オリジナルのエフェクトはYoutube の映像を参考にしているだけです。細かな違いについては見落しがあるかも知れません。
スクリーンショットはこんな感じになりました。

…実はこんなにまぶしいゲームだったのか! (笑) と新鮮な驚きです。
とりあえず上記変更箇所のパッチ(Unified diff 形式)をこちらに置いておきます。

*1:公式 BBS によると Radeon HD2000 系以降なら動くそうです。