小ネタ。
XR関係が多いと思いますが、何らかの経緯で取得したテクスチャがキューブマップ(Cube map)で、それをモデル上に投影しようと思ったとします。というのが今回の課題。
texCUBE を使う
シェーダには3次元ベクトルでキューブマップを参照する関数 texCUBE があり、これを利用することになるでしょう。
Skybox シェーダを使う
すでに texCUBE を使用した Skybox シェーダがありますから、これを使えばよさそうです。が、そのままではうまくいきません。
Skybox シェーダの何が足りないのか
Unity はバージョンごとに組み込みシェーダのソースコードが公開されていますので、
ここから Built in Shaders をダウンロードして
DefaultResourcesExtra/Skybox.shader
を見てみますと、頂点シェーダに
o.texcoord = v.vertex.xyz;
という記述があります。Cube map を引くための座標にモデルのベクトルを直接投入していますね。通常の Skybox は移動することがないのでこれで良いのですが、カメラや物体座標も適用しないと任意のモデルには貼り付けられません。
修正
//o.texcoord = v.vertex.xyz;
o.texcoord = mul(UNITY_MATRIX_MV, v.vertex);
先ほどの行をこのように修正して、Quadなどでも Cubemap(のうちそのモデルが視界を覆っている部分)を表示できるようになりました。
実際に修正したものを利用するには、この Skybox.shader を自身のプロジェクトにコピーして、シェーダの名前を変更するのがいいでしょう。