スポンサーサイト

--年--月--日 --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Cgシェーダープログラム で Direct X のような頂点宣言を実現する方法

2006年04月10日 11:43

今日はすこぶる眠いです。。

っていうのも、昨日午前半3時半ぐらいまでFF12やってたからなんですけどねw
やっと最後のダンジョンの手前まで来ました。
物語の展開自体は、安っぽい感じなので先が読めますがケリをつけると意味で今日中にクリアできたらいいなーって思ってます。



んで、需要がありそうなプログラムの話。

例によって今日説明する関数名をGoogle等で引っかかりやすいようにあげておきます。
「cgGetFirstParameter」「cgGetParameterVariability」「cgGetParameterSemantic」「CG_VARYING」「CG_UNIFORM」「CG_PROGRAM」「CG_GLOBAL」



前回解説した中で省いた「Cg シェーダープログラムで Direct X の頂点宣言のような処理をやるには」を書きます。
要するに、シェーダーとアプリケーションのプログラムを独立させたいってことですね。

これが出来ないとアプリケーションは常にシェーダーの中身を必ず知っていないとダメです。変数名まで。
もちろん、決められた変数名を使用すればいいんですけど、そんなルールで動くプログラムなんてスペルミス一つでバグが発生しそうだし、第一カッコ悪すぎます。

そんなこんなで、やりたいことは、、、




頂点要素(ここでは位置や法線、テクスチャのUV値、スキンウェイト、接線、準法線などのことをさします)の
パラメータ(データ配置位置・タイプ・使用方法・インデックスなど)を渡すことでシェーダーに渡されるストリームを
自動的に解釈して、関連付ける。




が、出来ればいいわけですね。


さて、やりたいことが決まったらそれを実現するための方法を考えましょう。
まず、シェーダープログラムの内容を解釈しないとダメみたいです。

 問題1:どうやって読み込んだシェーダープログラムを解釈するか?
 問題2:プログラムを解釈した時、入力パラメーターを探せるのか?
 問題3:もし入力パラメーターを特定したとしても、
     そのパラメーターが頂点のどのデータに対応しているのかがわかるのか?

この3つがわかれば、同じようなことが出来そうです。


長々書くのも嫌なので、それぞれの回答を書きます。

 問題1の回答:
   cgGLLoadProgram で読み込んだプログラムのハンドル(CGprogram)を使って
   cgGetFirstParameter 関数を使います。
   このとき引数に、CG_PROGRAM と CG_GLOBAL のどちらかを使えますが、
   念のため二つとも使用して(プログラムの中のパラメーターを)調べた方がいいでしょう。
   それで、cgGetFirstParameter では CGprogram の中の最初のパラメーター(CGparameter)が
   帰ってきます。
   このパラメーターを cgGetNextParameter 関数に渡すことで、
   次のパラメーターを取得することが出来ます。
   後は NULL が帰ってくるまで再帰的に cgGetNextParameter を呼べば
   すべての CGparameter を取得することが出来ます。


 問題2の回答:
   cgGetParameterVariability 関数を使います。
   列挙した CGparameter 変数を渡し、
   戻り値が
    CG_VARYING なら入力パラメーター
    CG_UNIFORM なら定数レジスタ
   になります。


 問題3の回答:
   cgGetParameterSemantic 関数を使います。
   この関数は与えられたパラメーターのセマンティックを文字列で返します。
   セマンティックとは頂点シェーダーなどで
   
    struct OUTPUT
    {
      float4 position : POSITION;
      float4 color   : COLOR0;
      float4 T0    : TEXCOORD0;
      float4 T1    : TEXCOORD1;
      float4 T2    : TEXCOORD2;
      float4 T3    : TEXCOORD3;
    };
   
   などで、変数名の後ろについてる POSITION などの文字をさします。
   ちなみに、CG では Varying タイプで使用できるセマンティックは
   各プロファイルごとに決まっています。
   
   後は文字列を strcmp などで処理して自分なりの頂点宣言を作れば終わりです。



こうやって書くと物凄いオーソドックスな方法で当たり前のことをやってます。
しかし、こういうことを説明している日本語のHPはこれまた皆無なので、ここに記述しておきます。

サンプルプログラムは暇を見つけて書いたら次回アップします。



実は今日解説した方法を使用することで、シェーダープログラムの定数レジスタにも Direct X の HLSL と同じようにインデックス番号でアクセスできるようにする方法があります。
こっちはもうちょっと複雑なので時間があったら書きます。


blog_rank


スポンサーサイト


コメント

    コメントの投稿

    (コメント編集・削除に必要)
    (管理者にだけ表示を許可する)

    トラックバック

    この記事のトラックバックURL
    http://angra.blog31.fc2.com/tb.php/34-776da730
    この記事へのトラックバック


    最近の記事


    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。