フォト

Google AdSense

  • AdSense
無料ブログはココログ

« ココフラッシュ | トップページ | ケーブル »

2004.09.19

.fx→1行の文字列化

とりあえずエフェクトファイルの中身を改行コードなどをすべて取っ払ってchar型の1次元配列にコンバート(その文字列を""で囲う。エフェクトファイルの改行箇所は逆変換用に\nで代替する)するプログラムを書く。

これでエフェクトファイルをソース内に埋め込む準備が出来たかな?

ダイアログプログラムにしてもいいんだけど今回はコンソールにしておきました(ダイアログプログラムならダウンロードコーナーにでも置いておくんだけどコンソールでは流石に不親切なんでねぇ・・・)。

« ココフラッシュ | トップページ | ケーブル »

Programming」カテゴリの記事

コメント

エフェクトファイルをリソースに置くのは駄目ですか?
リソースに埋め込むのでも、ソースに文字列を埋め込むのでも、
どちらも実行ファイルを覗けばプログラムが確認できる気がしますが、
それなら、リソースに置くほうが取り扱いが楽だと思うのですが…

あんまり実行ファイルの中身って気にしたことが無かったので、ご指摘からエディタで確認してみましたが、確かに文字列に関してはそのまま入ってるんですね(冷静に考えればそりゃそうなんですが)。

リソースに関しては文字列型の配列とどっちでも良かったんですが、綺麗なのはやはりリソースですね(今のやり方だとシェーダファイルの更新のたびにコンバータにかけないといけませんから)。

まぁ、急ぎやる必要のあることでは無かったんでリソースからの読み込みを検討しようかと思います。

fcx.exe はダメですか?
逆アセされればおしまいですけど、生成したバイナリに暗号掛けておけば多少は、覗かれにくくなるかと思います。

あ、すみません。
fxc.exe でした。
使い方とかは、 "CompiledEffect" のサンプルにありますです。

あ、fxc.exeですか。

そういえば、そういうものがありましたね。
思い出しました。

たぶん、これでバイナリ化するのが良さそうですね。
ちょっと使ってみたいと思いまます。

ありがとうございました>masさん。

C/C++のプリプロセッサは連続したリテラル文字列を連結する、という機能があるので、
char g_strFx[] =
"float g_time;\n"
"float4x4 g_mWorld;\n"
"float4x4 g_mWorldViewProjection;\n"
"technique RenderScene\n"
"{\n"
"P0\n"
"{\n"
"}\n"
"}\n";
こんな風にかけますよ

>C/C++のプリプロセッサは連続した
>リテラル文字列を連結する、という
>機能があるので、
あ、プリプロセッサの問題だったんですね。

よくNVIDIAとかのOpenGLのサンプルとかではソースにアセンブラシェーダとか書いてありますけど、この記法だったんで気になってたんですけど納得です。

ありがとうございます。

CompiledEffectのサンプルを見ると、D3DXCreateEffectFromFileの引数にfxoファイル(コンパイル済みエフェクトファイル)を指定しているだけに見えますね。

ところで、コンパイル済みファイルを読み込むのだからD3DXCreateEffectFromFile自体が高速化される(コンパイル時間の分だけ実行時間が短縮される)のだろうかと自分のプログラムに組み込んで見ましたが…全然速くなっていない様子でした。何か他にも必要なのでしょうか?ヘルプとか見た感じではそれらしい記述は無いんですが。誰かご存知ありませんか?

ちなみにこんなことをしようと考えたのは、HLSL内に大きめのforループがあるからだったりします。事前コンパイルしてD3DXCreateEffectFromFileを短縮したいわけです。動的ループが使えればいいんですが、実験したところPS3.0でも駄目でした。使い方が悪いのかな?

厳密なところに関しては、私の理解も怪しいんですが、

> ところで、コンパイル済みファイルを読み込むのだから
> D3DXCreateEffectFromFile自体が高速化される
どのぐらいのファイル数で速度を量ったのかは分かりませ
んが数個の範囲では目に見える変化は無い気がします。

D3DXCreateEffectFromFileは、HLSLからGPU用のオブジェクトコードに変換してるだけだと思います。

数個程度のエフェクトのコンパイルはそんなにCPU負荷は大きくないんじゃないでしょうか?なので数100個とか行かないと変化が見えるとこまで行かないんじゃないでしょうか?

> 動的ループが使えればいいんですが、実験したところ
> PS3.0でも駄目でした。使い方が悪いのかな?

シェーダの実行はあくまでもDrawPrimitiveやDrawIndexed
Primitive後に行われますから、シェーダコードの処理の大きさはD3DXCreateEffectFromFileの速度にはあまり関係な
いと思いますが…(もちろんHLSLからGPU用のオブジェクト
コードへの変換速度は変わると思いますが微々たるもの
だと思います)。

ようするにD3DXCreateEffectFromFile段階では、シェーダコー
ドを実行してるわけではありませんので、動的分岐とかループとか、そういうので処理を飛ばすとかそういうことは関係ないと思います。あくまでもGPUが解釈するためのオブジェクトコードへの変換だけだと思います。

ちなみにシェーダの実行タイミングに関してはDX9の日本語
ヘルプでは、

【DirectX Graphics】→【プログラミング ガイド】→
【プログラマブル パイプライン】→【頂点シェーダ】以下で、

”頂点シェーダは、DrawPrimitive または DrawIndexedPrimitive 呼び出しの後に起動される。”

とあります。ピクセルシェーダについては明記箇所が見つけ
られ無かったのですが、この後と考えるのが妥当だと思います。

ちなみに動的分岐やループで処理を切る場合は、この辺では
じめて速度差が発現すると思います。

複数の話を同時に入れてしまった(D3DXCreateEffectFromFileの話と、PS3.0ループの話)ために混乱させてしまったかもしれません。

要するにこういうことです↓
http://aaa.jspeed.jp/~togabito/mt/archives/2004/10/d3dxcreateeffec.html

わかりにくいコメントを書いてしまって大変申し訳ありませんでした。

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2210/1468491

この記事へのトラックバック一覧です: .fx→1行の文字列化:

« ココフラッシュ | トップページ | ケーブル »