2009年6月14日日曜日

etc - FragmentLinker

ここ1週間やってたけど諦めた。

FragmentLinkerとは何かと言うと、DirectX9のShaderModel3から(多分October2004から)ついていると思われる、HLSLシェーダの動的リンクシステムである。

うちのブログ的に分かりやすくいうと、Blenderのノードみたいな感じでシェーダを動的に、高速に繋ぎかえられるシステムである。

それを使って、何をしたいかというと、BlenderのGLSLMaterialsを、完全にDirectXアプリまで持ってきたい。

例えばこんな感じのを盛り盛りと何十個も作る。

//-----------------------------------------------------------------------------
// エッジの太さ計算
//-----------------------------------------------------------------------------
void vs_edge_calc_(
in float4 pos : POSITION,
in float3 nor : NORMAL,
out float4 edge_val : r_edge_val)
{
float4 dN = float4(normalize(nor.xz), 0, 0);
edge_val = pos - dN * edge_color.w * pos.w;
}
vertexfragment vs_edge_calc = compile_fragment vs_2_0 vs_edge_calc_();

話が本当なら、こうして作ったものを、必要なだけセットすれば、シェーダが1つ出来上がるはずである。

で、試していたんですが、うわさどおり全然使い物にならなかったです。

なんか頂点シェーダに色が渡らない・・・。頂点宣言がマズイのか、何がマズイのか。
普通のシェーダなら通るんだけどなー。

じゃあってことで、頂点シェーダ共通にして、ピクセルシェーダだけフラグメント

PixelShader MyPixelShader;

technique render_scene
{
pass p0
{
VertexShader = compile vs_1_1 vs_main(0, 0, 0, 0);
PixelShader = <MyPixelShader>;
}
}

にしても通らない。

ググっても、google code searchで検索しても全然出てこないから、これはもう全くダメなんだろうなー。
万が一出来たら超ラッキーと思ってやってみたものの、時間の無駄でした。

--------------------------------------------------

じゃあどうするか。
敷居が低いほうから考えると、
プリプロセッサ(#defineとか)で静的に作っといて、フローをあらかじめ決めとくやり方と、
関数盛り盛り作っといて、ノード情報から上手く並び替えて作るやり方、
があるんだけど、低いつっても超高いし、今やDirectX11とか言われてるのに、こんなもん頑張って完成したところで時代が変わってる。

幸いDirectX11にはdinamic shader linkageというのがあるようなので、そちらを試していきたい次第。compute shaderもあるしね・・・。

自分1人で使うなら、前作ったシェーダ読込みシステムで十分なんだけど、ノードと連携して、将来的にアレコレやるとなると、XPを切り捨ててでも、DirectX11に手を出す必要がありそうだ~

3 件のコメント:

ats さんのコメント...

blenderが作ったGLSLをcgコンパイラでHLSLにするとかどうでしょうか。
# cgc -profile hlslf(/hlslv) -oglsl shader.glsl -o shader.hlsl

ただ、ちょっと複雑なコードを食わせるとどうも動作が怪しいですし、組み合わせの問題は解決していないのでHLSLの部品の出力までできているのならDX11使ったほうが楽かもしれませんが。

uimac さんのコメント...

こんな謎な記事に有用なコメントありがとうございます;;

blenderが作ったGLSLとっても、blenderは動的にGLSLを作っているので、テクスチャとか頂点入力とか、グローバル変数どうなってるのかとか、全く謎ですし、座標系も違うので、地道に理解しながら手作業でやるしか無いと思ってます。

まずはノード内で使用しているColorBand(ColorRamp)とかを2Dテクスチャに出力とかからやっていきます。

DirectX11関連のものは、他にも将来的に絶対役に立つ気がするものが多いので、気合入れてやっていこうと思います。

ats さんのコメント...

ああそうですよね、シェーダーだけじゃなくて他にもいろいろ必要ですしね。思いつきで書いちゃってもうしわけないです。
できたらすごいことだと思うのでがんばってください。