質問編集履歴
1
書式の改善
    
        title	
    CHANGED
    
    | 
            File without changes
         | 
    
        body	
    CHANGED
    
    | @@ -1,13 +1,17 @@ | |
| 1 1 | 
             
            何がしたいか
         | 
| 2 | 
            +
            ---
         | 
| 2 3 | 
             
            3Dモデルのテクスチャに直接書き込むようなペイントアプリを作成しようとしています。書き込む方法として、投影テクスチャマッピング用のシェーダーをGraphics.Blitを使いテクスチャに適用します。カメラからレイをとばしヒットした場所に書き込むようにするのですが、投影テクスチャリング用に疑似カメラを用意し、そのカメラのプロパティをシェーダーに渡すことで、特定の位置に書き込む(テクスチャを投影する)ようにしています。(投影テクスチャマッピングではなく、単にヒットした位置のUVをシェーダーに渡しその位置を中心にしてブラシ用のテクスチャも張り付ける方法も考え、試してみましたが、モデルのUVに大きく依存するので辞めました。)
         | 
| 3 4 |  | 
| 4 5 | 
             
            何ができなかったか
         | 
| 6 | 
            +
            ---
         | 
| 5 7 | 
             
            投影テクスチャリングは実現できた(シェーダーコードは下にあります)のですが、Graphics.Blitで結果をテクスチャに直接反映しようとするとうまくいきません。一応塗られますが、位置が全然違います。
         | 
| 6 8 |  | 
| 7 9 | 
             
            試したこと
         | 
| 10 | 
            +
            ---
         | 
| 8 11 | 
             
            まず投影テクスチャリングが失敗の原因なのかわからなかったので、以下のように、投影と投影後に動的にテクスチャに書き込むことができるスクリプトをつくってみました。このスクリプトで投影できることは確認できたのですが、投影した場所にテクスチャが書き込まれません。
         | 
| 9 12 |  | 
| 10 13 | 
             
            スクリプトの説明と再現方法
         | 
| 14 | 
            +
            ---
         | 
| 11 15 | 
             
            投影されるモデルにこのスクリプトと投影用のシェーダーでつくったマテリアルを付けます。マテリアルのプロパティでブラシ用(投影される)テクスチャを適当に設定します。さらに、空のGameObjectをつくり、モデルのインスペクタからprojectorに設定します。色を設定し、プレイモードにすると、そのprojectorのオブジェクトのz方向に投影が行われます。インスペクタのねじマークからBakeを押すとGraphics.Blitによりテクスチャに投影結果が塗られます。
         | 
| 12 16 |  | 
| 13 17 | 
             
            このスクリプトでは単に、オブジェクトのテクスチャーをレンダーテクスチャに置き換え、モデルのTransformからモデル変換行列、projectorからビュー行列、疑似カメラ用のプロパティからプロジェクション変換行列を毎フレームつくりシェーダー渡し、インスペクタからBakeが押された時だけGraphics.Blitするようにしています。本来はマウスクリックでレイを飛ばし、そのときだけ投影かつGraphics.Blitしますがこれは実験用のスクリプトですので。
         | 
| @@ -20,8 +24,9 @@ | |
| 20 24 | 
             
            Graphics.Blitを使わずにテクスチャに変更を加える方法もあるにはあるみたいですが、いろいろ制約がありそうなのでできればこれを使いたいです。例えばGraphics.DrawMeshNowがありますが、いくつかmeshがある場合その数だけ呼ばなければならなかったりSkinnedMeshRendererの場合BakeMeshしないといけないみたいです。一応想定しているモデルはSkinnedMeshRendererコンポーネントをいくつかもつものになります。
         | 
| 21 25 |  | 
| 22 26 | 
             
            環境など
         | 
| 27 | 
            +
            ---
         | 
| 23 28 | 
             
            Unity 2018.3.0f1(アップデート予定)
         | 
| 24 | 
            -
            VRアプリで考えてます。
         | 
| 29 | 
            +
            VRアプリで考えてますが、とりあえずwindowsでプラットフォーム設定はデフォルトです。
         | 
| 25 30 |  | 
| 26 31 | 
             
            何日かググって調べましたがどうしてもわかりませんでした。どうかよろしくお願いいたします。
         | 
| 27 32 |  | 
