2013/01/15

ライトマップのシェーダーをMac, iOSで両立するには

 先日の記事でライトマップを別シーンで使うために、自前のライトマップシェーダーを用意して行うようにしてましたが、いざそれをiOSへ持っていくとそのままだと問題がでることがわかりました。
 ま、絵が出ないってことなんですけどね。
 Unity標準のライトマップシェーダーもそうなっているそうですが、LightModeの設定にライトマップ方式がいくつかあるのには理由があるらしく、環境によって有効な設定が違うようです。LightMode=VertexLMRGBMはMacならばOKですが、iOSでは何も出ません。逆にLightMode=VertexLMの場合はiOSはOKですが、Macでは何も出ません。という感じです。

 てなわけで、どうするか。
 UnityのShaderLabにはSubShaderというタグがありまして、それを使うと有効なシェーダーが実行時に選ばれるというものがあります。これを使えばいいんじゃない?とすると、以下のようになります。

SubShader {
  Tag { "LightMode" = "VertexLMRGBM" }
}
SubShader {
  Tag { "LightMode" = "VertexLM" }
}

 ところがこれではダメで、LightModeでどうなっててもどうやらSubShaderレベルでは有効なシェーダーとして判別されてしまうようです。なので、やるなら以下のように1つのSubShaderの中に2つをいれてしまいます。

SubShader {
  Pass {
    Tag { "LightMode" = "VertexLMRGBM" }
  }
  Pass {
    Tag { "LightMode" = "VertexLM" }
  }
}

 こうすると片方は何も描画しないのでうまくいくようです。たしかに実際にうまく表示できました。使わない方のPassのオーバーヘッドが無いのかどうかについては調べきれてないです。GLSL化された後のコードを見れば分かるとは思うんですけどね。

参考1:Alpha-VertexLit.shader
http://dorumon.googlecode.com/svn/trunk/pwars/Assets/Standard%20Assets/DefaultResources/Alpha-VertexLit.shader
参考2:Multiple target platform lightmap shader
http://forum.unity3d.com/threads/75487-Multiple-target-platform-lightmap-shader

0 件のコメント:

コメントを投稿