■その他の方法

 

■方法1.

Data transfer to Vertex Program in Cg- how to pass an Array of floats

<shader >

shaderに値を設定:
myarray0
myarray1
myarray2..

 

<script >
配列名+数字 を文字列変換してシェーダにセットします:
for (i=0; i<?; i++) {
Shader.SetFloat("myarray"+i.ToString(), mycodearray[]);
}

 

”配列名+数字”を文字列に変換して シェーダに転送する方法ですが 配列の要素が少なければこのようなやり方でも良いと思います。

シェーダ側では switch() ステートメントで切り分ければいいのかな?

<Example>

switch(i)
{
    case 0:
        return myarray0; 
    case 1:
        return myarray1;
    case 2:
        return myarray2;
    default:
}

 

■方法2.

GL命令を使用した描画はDLLにmaterialIDを渡してC++で処理をすれば、Unityのスクリプトの10倍程度速いという

stack overflowのスレッドを見かけたことがありました 例によって場所がわからなく。。

スクリーン全体を描画するような処理の場合はネイティブなDLLプラグインを書くと良いかもしれません。

今回はシェーダで作業用の配列データを扱う話ですので、そこまで大きなデータは必要なさそうなので割愛させてもらいます。

興味のある方はリンクを載せておきますので参考にしてみて下さい。

  • Efficiently capturing rendered images- - Unity Answers
  • OpenGL Context from Plugin - Unity Answers
  • qoncept.jp-download-seminar_unity_20110716.pdf
  • Unity - Low-level Native Plugin Interface

     

     

    【後記】

    頂点にデータを付加した方法は初期テーブルとして使用する場合には有効ですが テクスチャを使用した方法に比べると

    シェーダは頂点を一度に1つしか処理できないので、ほかの配列要素にアクセスすることが出来ません たとえばClothのような

    相互に作用する計算をすることができないので、そうした場合はテクスチャにデータを焼きこんだほうが捗る ということです。

    あくまで いまのところこうした方法が良いのではないかという話なのでこの記事にとらわれる必要はありません。

    ゲームエンジンのような頻繁にバージョンが変わるものは、すぐに情報が古くなってしまいますから その時にあわせて

    最適な方法を探っていってください。