プロフィール

Na-7

Author:Na-7
SE(システムエンジニア)として約15年間システム系ソフト会社を勤めあげ、2008年3月退社。現在、ゲーム制作会社設立を目指して活動中。


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:三国志軍記開発
自作地形HLSLテスト01
HLSL描画テスト
頂点のパターン情報を元に、一度の描画命令で5種類のテクスチャを描き分けるテスト。if文は極端に遅かった。



◎Short4問題解決

4/4の記事のラストで、Short4型の使い方がわからず、「Short4は諦めて、Vector4にします」と書きましたが、その後XELFさんからコメントでコンストラクタを利用する方法を教えて頂きました。

早速試してみると、これで問題なくパックされたらしく、.ToVector4でパックされた値を戻すテストも成功しました。XELFさん、どうもありがとうございました!

…え?何故コンストラクタに気付かなかったのかって?
そりゃC#言語経験1年未満の初心者ですから(爆)

カスタム頂点のサンプルコード



◎ピクセルシェーダのif文

パターン番号をピクセルシェーダに渡せるようになったので、試しに5種類のパターンテクスチャを表示してみました。(冒頭図参照)

HLSLサンプルコード

地形モデル描画部分のXNAサンプルコード

PIXで確認すると、シェーダのoutput.patternNumber.xだけでなく、.y/.z/.wにもそれぞれ整数値が格納されていましたし、Roundを使わずともif文でパターン番号を判別して複数のテクスチャを表示できたので、動作結果は想定通りでした。

しかし、描画速度は想定を大きく下回って、11fpsでした。

ちなみに、ピクセルシェーダの最下行(return ~)以外を全てコメントにすると、30fpsです。つまり、ピクセルシェーダ内にif文を4つ入れたら、30fpsから11fpsまで下がったのです。
マジですか~!?



◎サンプラ配列の作成

if文方式では速度が遅すぎるので、サンプラを配列で指定する手法を試みます。

サンプラ型(DirectX HLSL)マニュアルを確認すると、Direct3D10ではサンプラ配列をサポートするために構文を少し変更しているようですが、実際にやってみると、Direct3D9でもサンプラ配列を作成することは出来ました。

HLSLサンプラ配列作成サンプルコード



◎サンプラ配列への動的アクセス

しかし、下記のように配列要素を動的に指定しようとすると、エラーになりました。

ピクセルシェーダ:
int x1 = input.patternNumber.x;
return tex2D(sm[x1], input.TextureCoordinate) * input.Color;

エラー:
sampler array index must be a literal expression

エラーを直訳すると「サンプラーの配列のインデックスはリテラル表現する必要があります」です。何じゃそりゃ?と思ってマニュアルを探ってみました。

マニュアル「Direct3D 9 での HLSL シェーダーの記述」の「サンプラーとテクスチャー オブジェクト」項目のラストには、サンプラーの動的配列アクセスについて記述されています。

ちょっと表現が解り難いのですが、これは「リテラルループ(固定ループ)では使用可能だが、コンパイル時に解決できない動的アクセスは使用不可」と述べているようです。

つまり、「サンプラ配列を使用した地形モデル描画構想」は実装不可能という結論になります。


もし可能であれば、XNAからパターンテクスチャ配列を丸ごとシェーダに渡して一気に描画したかったのですが…ああ、Direct3D10が使えたらなぁ…(嘆)



◎次回予告

う~ん…これが最後の壁なんですけど、if文も配列もダメとなると、苦しいですね~。

他の方法がないか考えます。何も思い付かなかったら、B案は諦めてC案に移るかも。

スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント

突然ですが、検索ボックスで検索しても見つからなかったので一応ちょっとした情報として。
まあ知ってたらスルーしといてくださいね。
XNA3.0にて「ClickOnce」という機能が追加されました。
これは配布時に自己解凍+ランタイム自動ダウンロード&インストールができるexeファイルを作ってくれる機能で、
XNAの短所ともいえる必須ランタイム関係がカバーできるようになっているようです。

情報ありがとうございます

>XNA3.0にて「ClickOnce」という機能が追加されました。
知りませんでした。情報ありがとうございます。

>XNAの短所ともいえる必須ランタイム関係がカバーできるようになっているようです。
配布関連はとても気にしていたのですが、改善されたようで嬉しいです。近いうちに試してみます。

コメントの投稿


管理者にだけ表示を許可する

トラックバック


この記事にトラックバックする(FC2ブログユーザー)



copyright © ゲーム制作の舞台裏 all rights reserved.Powered by FC2ブログ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。