フリーゲーム・フリーソフトの開発過程を記録していく、TDtechnic公式ブログです。製品はカテゴリの「ダウンロード場」からダウンロードして頂けます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

こんにちは。5面も最低限出来て、いざ6面を作ろうという段階に入ったんですが、思わぬ壁にぶち当たりました。6面では闇の表現をするために黒色のフォグをかける必要があるんですが、こいつが次から次へと問題を投げかけてきたのです。

最初は、固定機能のフォグを利用しました。やってみると、プログラマブルシェーダと同時に使用しても特に問題無いように見えました。これを見て数日は喜んでいたんですが、なんとフルスクリーンとウィンドウの切り替えや画質切り替えのためにResetメソッドを呼ぶと解除されてしまうことに気づきました(ただし、一旦デバイスロストさせてResetで復帰するとなぜか復活する)。まあーぬか喜びさせるひどい仕様だと思いましたが、やっぱりプログラマブルシェーダを使うならフォグも自分で書くのが正しいのでしょう。シェーダコードによるフォグ実装に踏みきりました。

幸いフォグのシェーダコードのサンプルが「DirectX9実践プログラミング」に載っていましたので、早速全部定数でそいつを入れてみる。よし動いた。じゃあ次は定数を各種変数にして、と…あれ?

…3D部が何も描画されなくなりました。

いやいや、と変数を定数に戻してみる。やっぱり動く。ちゃんと「均一なフォグ」がかかりました。同じ式で、変数にしてみる。映らない。はぁ?
なにがおかしいって、その時は試験的にフォグの対象を「テクスチャのある面」に限定していたんですね。もちろん定数フォグはその面だけ反映される。ところがバグった時は「テクスチャのない面」も含めて全部表示されなくなる。これはつまり、フォグの値がおかしいのが原因じゃないということです。もし値がおかしいだけなら、表示されなくなるのは「テクスチャのある面」だけのはずです。

しかしながら、この様に「コード上で影響を与えないはずの部分」に影響が出るということは、相当低水準な問題だと思いました。ひょっとしてサンプルが間違っているのか?いや、サンプルコードに限らず、どうやら変数を使うコードを書くとバグるようだ。うーん…試しにコードを減らしてみる。あれ?変数使っても大丈夫だ!もう一度コードを増やす。真っ暗だ!

どうやら命令数が多いと映らず、少ないと映るということが分かりました。というわけでこれは恐らく「命令数が上限を越えた時の症状」だったと思われます。どこにも載ってないので確証はないんですが、とりあえずそう思っておけば実用上は問題ないと思います。しかし、命令数多すぎるんならコンパイルしたときにエラーにしてくれればいいものを…。高水準プログラマがこういう挙動に出くわすと、かなり狼狽しますね。C/C++では見たことがないバグり方だったので。

ところで、命令数の多寡がバグの原因なのは良いとして、「定数だと動いて変数だと動かない」というのは何だったのでしょうか?実のところこれもはっきりしたことは分かっていません。あくまで推測の域を出ないのですが、恐らく定数の場合はコンパイル時に計算してその結果だけを定数として埋め込んでいるために命令数が減ったのだと思われます。これであれば「命令数が多いと真っ暗になる」仮説とも辻褄が合います。ただ、なぜか最適化をオフにしてもこの症状が出たので、その点では疑問が残ります(定数展開は、最適化オフでも実行される!?)。

最後に、晴れてフォグのかかった表示が出来たんですが、ところどころかかり方がおかしいところがある。コードを見てもさすがにこのバグり方はシェーダのせいじゃないな。モデルデータと比べてみると、どうやら「隣の面と頂点を共有していない面」で発生しているようだということがわかりました。なるほど、分割が粗い面と細かい面が連結されず並んでいる場合、細かい方はなめらかなのに対し粗い面は均一な範囲が多いから確かに境目で不自然になりますね。というわけで前述のような面を張りなおしてテスト。よしいい感じだ。
ちなみに、固定機能のフォグの時はこの症状は発生しませんでした。なぜなら固定機能で行っていたのは「ピクセルフォグ」という、画素ごとにかけるフォグだったからです。対して今回私が書いたようなフォグは「頂点フォグ」と呼ばれるものです。こちらは頂点単位で計算されるものですから、必然的に頂点の数によってかかり方が変わってしまったというわけです。

というわけでプログラマブルシェーダとも喧嘩をしては少しずつ仲良くなっていっている感じです。そのうちもっとシェーダを中心としたシステムも作ってみたいと思っています(というか次回作はそうなるかも!?)。
関連記事

[2015/05/22 10:14] | 不死女 -Immortal girl-
|


skallo
フォグのグラフィックはどんどん進化していくね
煙や土埃、吹雪の表現を追求したゲームは多いけど闇のフォグとはまた珍しい・・


Shiro
> skallo さん
まともに光の計算をしていると重すぎるので、簡単なフォグで代用した次第です。ひょっとするとあなたの想像しているような美麗なフォグとはかけ離れたものかも知れません…。

コメント:を閉じる▲
コメント:
この記事へのコメント:
フォグのグラフィックはどんどん進化していくね
煙や土埃、吹雪の表現を追求したゲームは多いけど闇のフォグとはまた珍しい・・
2015/05/22(Fri) 16:37 | URL  | skallo #-[ 編集]
> skallo さん
まともに光の計算をしていると重すぎるので、簡単なフォグで代用した次第です。ひょっとするとあなたの想像しているような美麗なフォグとはかけ離れたものかも知れません…。
2015/05/22(Fri) 19:40 | URL  | Shiro #-[ 編集]
コメント:を投稿
URL:

パスワード:
非公開コメント: 管理者にだけ表示を許可
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。