土屋つかさの技術ブログは今か無しか

土屋つかさが主にプログラミングについて語るブログです。

MeshRendererコンポーネントのLight Probes(ライトプローブ群)のドキュメント私訳

 MeshRendererコンポーネントのパラメータであるLight Probesは、そのメッシュがライトプローブの影響をどう受けるかをOff/Blend Probes/Use Proxy Volume/Custom Providedの4つから選択します。この値は内部的にはMeshRenderer.lightProbeUsageプロパティに設定するRendering.LightProbeUsage列挙体になります。
 ライトプローブ自体が難解な機能なのもあるのですが、Rendering.LightProbeUsageのドキュメントが例によってバージョン更新で訳が洩れていたり、機械翻訳がこなれていなくて間違ってはいないが文意が取りにくかったりしたので、私訳を載せておきます。ご自身の責任においてご利用ください(間違いがあったら指摘していただけると助かります)。

【土屋補足】

・一般に"Light Probe"は単数形複数形にかかわりなく「ライトプローブ」と訳されますが、原文では、シーンに配置されている複数のライトプローブ全体を指して「Light Probes」、それらを補間したシェーダーに渡す単一の値や機能自体のことを「Lighe Probe」と書いている傾向があるので、ここでは可能な限り厳密に「ライトプローブ」「ライトプローブ群」としています。

LightProbeUsage.Off

https://docs.unity3d.com/ja/2018.1/ScriptReference/Rendering.LightProbeUsage.Off.html
(公式訳無し)

原文:Light Probes are not used. The Scene's ambient probe is provided to the shader.
私訳:ライトプローブ群は使用しません。シーンのアンビエントプローブがシェーダーに渡されます。

LightProbeUsage.BlendProbes

https://docs.unity3d.com/2018.3/Documentation/ScriptReference/Rendering.LightProbeUsage.BlendProbes.html
https://docs.unity3d.com/ja/2018.2/ScriptReference/Rendering.LightProbeUsage.BlendProbes.html(2018.3から公式訳無し)

原文:Simple light probe interpolation is used.
公式訳:簡易なライトプローブ補間が使用されています。
私訳:シンプルなライトプローブ補間が使用されます。

原文:If baked light probes are present in the Scene, an interpolated light probe will be calculated for this object and set as built-in shader uniform variables.
公式訳:シーンにベイクしたライトプローブがある場合は、補間したライトプローブは、オブジェクトのために計算されビルトインシェーダーのユニフォーム変数として設定されます。
私訳:シーンにベイクされたライトプローブ群がある場合、このオブジェクト用に補間されたライトプローブが演算され、組み込みのシェーダー定数群(shader uniform variables)に代入されます。

原文:Surface shaders use this information automatically.
公式訳:表面シェーダーはこの情報を自動的に使用します。
私訳:サーフェイスシェーダーはこのデータを自動的に使用します。

原文:To add light probe contribution to your custom non-surface shaders, use ShadeSH9(worldSpaceNormal) in your vertex or pixel shader.
公式訳:ライトプローブの影響をカスタムの表面シェーダー以外のシェーダーに与えるためには、頂点シェーダー、または、ピクセルシェーダーの ShadeSH9 (worldSpaceNormal) を使用します。
私訳:ライトプローブの影響をカスタムの(サーフェイスシェーダーではない)シェーダーに加える場合、頂点シェーダーあるいはピクセルシェーダーでShadeSH9(worldSpaceNormal)を使用します。

LightProbeUsage.UseProxyVolume

https://docs.unity3d.com/2018.3/Documentation/ScriptReference/Rendering.LightProbeUsage.UseProxyVolume.html
https://docs.unity3d.com/ja/2018.3/ScriptReference/Rendering.LightProbeUsage.UseProxyVolume.html

原文:Uses a 3D grid of interpolated light probes.
公式訳:3D グリッド補間のライトプローブが使用されています。
私訳:ライトプローブ群の補間に3Dグリッドを使用します。

原文:A Light Probe Proxy Volume component which may reside on the same game object or on another game object will be required.
公式訳:同じゲームオブジェクトか他のゲームオブジェクトにある Light Probe Proxy Volume コンポーネントが必要です。
私訳:そのGameObject自身あるいは別のGameObjectにアタッチされたLight Probe Proxy Volumeコンポーネントが必要です。

原文:In order to use a Light Probe Proxy Volume component which resides on another game object, you must use the Proxy Volume Override property where you can specify the source game object.
公式訳:他のゲームオブジェクトにある Light Probe Proxy Volume コンポーネントを使用するためには、Proxy Volume Override プロパティーを使ってソースのゲームオブジェクトを指定します。
私訳:他のGameObjectにアタッチされたLight Probe Proxy Volumeコンポーネントを使用する場合は、Proxy Volume Overrideプロパティを使用して、参照先のGameObjectを指定します。

原文:Surface shaders use the information associated with the proxy volume automatically.
公式訳:表面シェーダーは、自動的にプロキシボリュームと紐づいた情報を使用します。
私訳:サーフェイスシェーダーは自動的にプロキシーボリュームを反映したデータを使用します。

原文:To use the proxy volume information in your custom shaders, you can use ShadeSHPerPixel function in your pixel shader.
公式訳:プロキシボリューム情報をカスタムシェーダーで使用するには、ピクセルシェーダーの ShadeSHPerPixel 関数を利用します。
私訳:自身のカスタムシェーダーにプロキシーボリュームのデータを使用する場合は、ピクセルシェーダーでShadeSHPerPixel関数を使用します。

【土屋補足】

・シーン内に配置されたライトプローブ群(Light Probes)は、シェーダーが実行される直前に補間計算をして、1個のSH関数(ドキュメントでは"Light Probe","Probe"と書かれることが多い)に変換され、これがシェーダーに渡されます。
・ライトプローブの配置間隔よりも描画オブジェクトの方が大きい場合などでも、シェーダーにはそれら複数のライトプローブを補間した1個のデータしか渡さないため、意図しない描画結果になることがあります。
・これを解決する手段としてLPPV(Light Probe Proxy Volume)コンポーネント用意されています。LPPVは通常描画対象のオブジェクトにアタッチしておきますが、別のオブジェクトにアタッチされたLPPVを使うこともできます(その際には参照設定が必要になります)。
・LPPVについては公式ドキュメントを参照: https://docs.unity3d.com/ja/2018.3/Manual/class-LightProbeProxyVolume.html このページはすごくわかりやすい。やるじゃん!

LightProbeUsage.CustomProvided(★2018.1から追加)

https://docs.unity3d.com/ja/2018.3/ScriptReference/Rendering.LightProbeUsage.CustomProvided.html
(公式訳無し)

原文:The light probe shader uniform values are extracted from the material property block set on the renderer.
私訳:ライトプローブのシェーダ定数群(shadar uniform values)をレンダラーに設定するマテリアルプロパティブロックから展開します。

原文:Property unity_SHAr, unity_SHAg, unity_SHAb, unity_SHBr, unity_SHBg, unity_SHBb and unity_SHC will be set to zero if they are not part of the MaterialPropertyBlock.
私訳:MaterialPropertyBlockに"unity_SHAr","unity_SHAg","unity_SHAb","unity_SHBr","unity_SHBg","unity_SHBb","unity_SHC"プロパティを加えなかった場合、それらはゼロに設定されます。

原文:Property unity_ProbesOcclusion will be calculated as in normal lighting if it is not part of the MaterialPropertyBlock.
私訳:MaterialPropertyBlockに"unity_ProbesOcclusion"プロパティを含めなかった場合、ノーマルライティングとして演算されます。

原文:Note that using the light probe values baked at a different place may lead to incorrect rendering, especially when local lights (i.e. point lights and spot lights) are used.
私訳:他の地点でベイクしたライトプローブの値を使用すると、特に局所的な光源(ポイントライトやスポットライトなど)の際に、正しくないレンダリングをもたらすことに注意してください。

原文:This mode is more useful when drawing instanced objects with Graphics.DrawMeshInstanced, where the light probe data is pre-calculated and provided as arrays.
私訳:このモードは、
Graphics.DrawMeshInstancedでインスタンスオブジェクトを描画する時に、ライトプローブのデータが事前演算され、かつ配列で用意されている場面で有効です。

【土屋補足】

・MaterialPropertyBlockは、UnityEngine.CoreModuleOtherで実装されているクラスで、変数名をキーに値を設定/取得できます。これを介して、Renderer.SetPropertyBlock()でシェーダーに渡すライトプローブの係数を直接指定できるようです。

Unityゲーム プログラミング・バイブル

Unityゲーム プログラミング・バイブル

Unity 2018.3からMesh Rendererインスペクタのレイアウトが大幅に変更されてた

 ふとUnityを眺めていたら、Mesh Rendererインスペクタのレイアウトが2018.3から、レイアウトが大幅に変更されていたことに気づきました。
f:id:t_tutiya:20190113085725p:plain
 左が2018.2、右が2018.3です。プロパティの構成要素自体は変化してませんが、いくつかの名称が変更されていたので、以下にまとめておきます(例によってドキュメントは原文含めて追いついてません)。

・Materialsサブカテゴリが先頭に来た
・Lightingサブカテゴリは廃止され、中身はトップレベルに移行
・Motion VectorsとLightmapStaticの間に空行を追加
・"UV Charting Control"サブカテゴリは"Realtime UVs"に変更。
・"Lightmap Settings"サブカテゴリは"Lightmaps"に変更。
・Scale In Lightmap/Prioritize Illimination/Stitc Seams/Lightmap Parametersはトップレベルに移動
・"Optimize Realtime UVs"は"Optimize"に変更
・Baked Lightmap/Realtime Lightmapにサムネイル追加、ハッシュ値複数を削除

 Lightサブカテゴリがなくなったのはレイアウトがシンプルになって非常に良いと思います(Mesh Rendererのプロパティは大部分がライト/シャドウ関連なので)。また、ライトマップのサムネイルがここで見れるようになったのもとても良いです(これまでは読んでも意味の分からないハッシュしかなかったので)。

Unityゲーム プログラミング・バイブル

Unityゲーム プログラミング・バイブル

Unityライセンスはバージョンごとに紐付けされているという話

※すみません以下のエントリ勘違いかも。追記参照。

 Unityは去年からPlusの年間ライセンスを購入しています(もちろん個人で)。とはいえ、去年は結局アプリをリリースすることがなかったので、ダークUIテーマにして楽しむくらいしか意味なかったですけど……。
 ところが、ある時、いつのまにかダークUIテーマから通常の灰色テーマに戻っていることに気づきました。「なんで戻っちゃったんだろ? もしかして購入した年間ライセンスって2017のみ適用で、2018では適用外なのか?」とか思ってました(そんな訳がなかった)。
 で、去年分が切れて今年更新した際にようやく「あ、ライセンスシートってアカウントだけじゃなくて、使用verも固定されるのか」と気づき、現在使っている2018.3にシートを移行して、ようやくまたダークUIテーマが復帰しました。
 今年はなにかリリースしたいなーでも無理っぽいなー(ならライセンス更新いらんかったのでは)
フレア効果のテスト中。まぶしい!
f:id:t_tutiya:20190112105619p:plain
 ちなみに、2018.3.Xでライセンスが共有されるのか、それも移行が必要なのかは知りません。次気づいたら追記しておきます。

Unityゲーム プログラミング・バイブル

Unityゲーム プログラミング・バイブル

2019/1/12追記

・確認したら、2018.3でPlus登録しておくと、2018.2/2017.1/5.5.5でもダークテーマのままでした。あれ? それってどういうことになるんだ? 今環境として使ってないPCにライセンスを紐付けてたとか? いやでもなあ……わかんないや。当初の状態を再現できないのでよく分かりません。

Unity2019.Xについての根拠の無い国内展開予測12個

 ツイッターで「今年の技術発展予測をして年末に答え合わせすると自己認識のキャリブレーションになる」というのを見て、面白そうだったのでUnityについて考えてみました。Unity2019.Xが採用する技術と、その国内での展開の予測です。当然ながら(?)主にシェーダー 周り。

 どうせ大半が外れるだろうから、断定調で書いています。新春の運試しとして記録しておき、年末に答え合わせをしたいと思います。

1・SRP(Scriptable Render Pipeline≒HDRP/LWRP)は仕様の更新が2020年まで継続し、既存メカニズムからの移行には至らない。
2・少なくとも国内での遅延シェーディングの年内の普及は無い(これはSRPへの移行が遅れるため、現状のフォワードレンダリング環境が継続する)。
3・少なくとも国内でのHDRテクスチャの年内の普及は無い(同上。リニア/ガンマ空間への理解が進む程度)。
4・SRPはShaderGraph(シェーダーのノードエディタ)に依存しない設計にシフトする(せざるを得ない)。
5・ShaderGraphはVR視差対応で足踏みする。調べていないけどノードエディタはシェーダーバリアントの対応が大変そうな印象。
6・DirectX Raytracing(DXR)へは年内は対応できない。「VR対応が非現実的」「マルチプラットフォーム対応が非現実的」「開発コストが高すぎて採用できるメーカーが無いため優先度が低い」などが主な理由。
7・ECS(Entity Compornent System)は年内はPreviewが取れない。取れたとしても商業ゲームで普遍的に使えるメソッドは年内には誕生しない。
8・Visual Scriptingは年内にはPreviewが取れない(これは公式の予定)。恐らく2020年中も無理。2020年中に取れたとしても商業ゲームではAI制御など極めて限定されたタスク処理での利用になる(それだけでも十分実用になる)。
9・VRMは一部のアプリのみで利用が継続されるか、あるいは汎用性を上げるために仕様が骨抜きになり、いずれにせよ現状のフォーマットのままでは普及に至らない(VRMの仕様を詳細に確認しているわけではありません)。
10・VRMとは別にシェーダーやダイナミックボーン、服の着せ替えなどに対応できる3D中間フォーマットが誕生しそう。これはファイルフォーマットというよりはUnity内でのツリー構造規約(現状のHumanoidルールがより厳密になったもの)のようなものになる(それがVRM2となる可能性もあるがそうはならなそう)。
11・AR/VRの機能追加は市場が求めているので進みそう(希望含む)。
12・国内ではvTuber/VRChatを中心にモダンな3D描画技術への理解が進み、商業ゲーム界隈よりもこっちでノウハウの集積や新技術の発展がありそう(希望含む)

参考

Unite Los Angeles 2018 - Unity 2019 R&D Roadmap
https://www.slideshare.net/unity3d/unite-los-angeles-2018-unity-2019-rd-roadmap
2018年11月にUnity公式が行った2018.3~2019.xのロードマップ

Unityゲーム プログラミング・バイブル

Unityゲーム プログラミング・バイブル

Standard ShaderのEmissionを自作シェーダーに組み込みたかった(過去形)

 Standard ShaderにEmissionという項目があります。
docs.unity3d.com
 これはオブジェクト自体を発光体にする物で、オプション選択で、ライトマップにベイクしたり、ライトプローブにリアルタイム反映させたりできます。とはいえ、その「ライトマップにベイクする」というイベントはいつ発行されているのかと思って調べたら、なんとMaterialEditorにEmission専用のメソッドが用意されていました。まじかー!
docs.unity3d.com
docs.unity3d.com
docs.unity3d.com
 ドキュメントにはあるので使えはするんでしょうが、ちょっと設計に無理があるんじゃないかなこれ……(まあこれに始まったことではないけども)。

Unityゲーム プログラミング・バイブル

Unityゲーム プログラミング・バイブル

Unityライティングモードリファレンスカードを和訳

 Unity Lighting Modes Reference Cardという公式が提供しているスプレッドシートがあります。これは、UnityでのGI(グローバルイルミネーション)において、光を投影するライトと、その光を受けるオブジェクトのそれぞれが動的/静的だった場合に、ライトとシャドウはどのデータが反映されるのかを一覧にした表です。
[BETA 5.6] Lighting Modes Reference Card - Google スプレッドシート
GIにおけるライトとオブジェクトの関係は非常に複雑で、1枚の表になっているのは大変ありがたいんですが、正直これ自体もわかりやすいとは言えず、また英語だと視認性が低いので、日本語化した上で独自に表をアレンジしました。
f:id:t_tutiya:20181223112905p:plain
※すみません、これ「動的ライト」「静的ライト」となっているのはそれぞれ「動的キャスター」「静的キャスター」の間違いです。修正しわすれました(2018/12/27追記)
注意
・元の表と異なり、下半分のシャドウ関連の表は縦軸と横軸が逆になっています
・手作業で書き写しているので、間違ってたらすみません。
・元の表自体が"[BETA 5.6]"と書いてあるので、内容が古い可能性があります。

2019/1/4追記

 もうすこしわかりやすくしたバージョンを作ったのでこれも載せておきます。これの完成版と、表の意味についてはシェーダー本3で解説する予定です。
f:id:t_tutiya:20190104202115p:plain

Unityゲーム プログラミング・バイブル

Unityゲーム プログラミング・バイブル

モバイル環境での遅延シェーディングがアリになったタイミングの話

 モバイル環境での遅延シェーディング(ディファードシェーディング)は、元々非サポートだったのが少し前からアリになったというのは小耳にかじっていたのですが、ドキュメントを読んでいたら、2017.4から解説が更新されている事に気づきました。

2017.3
https://docs.unity3d.com/ja/2017.3/Manual/RenderTech-DeferredShading.html
モバイルでは、たいてい MRT 形式が使用されているため、デファードシェーディングはサポートされません (複数のレンダリングターゲットをサポートする GPU のいくつかは、かなり制限されたビット数だけしかサポートしません)。
※土屋注「MRT形式が使用されているため」→「使用されているMRTの形式の関係で」くらいの意
https://docs.unity3d.com/2017.3/Documentation/Manual/RenderTech-DeferredShading.html
On mobile, deferred shading is not supported, mostly due to MRT formats used (some GPUs which do support multiple render targets, still only support very limited bit counts).

2017.4
https://docs.unity3d.com/ja/2017.4/Manual/RenderTech-DeferredShading.html
モバイルでは、ディファードシェーディングは、最低 OpenGL ES 3.0 を実行するすべてのデバイスでサポートされます。
https://docs.unity3d.com/2017.4/Documentation/Manual/RenderTech-DeferredShading.html
On mobile, deferred shading is supported on all devices running at least OpenGL ES 3.0.

 とはいえまあ、Unityで遅延シェーディングが一般化するのは、SRPがもう少しこなれてからでしょうね……。土屋のシェーダー本でも、SRPとセットで紹介する予定です(何巻に収録されるかはちょっとわからない……。少なくともLWRPが正式リリースになるまでは待ちかなあ)。

Unityゲーム プログラミング・バイブル

Unityゲーム プログラミング・バイブル