ScriptableRenderLoopでUNITY Chan表示
環境
ベータ版の機能なので EditorをUNITY2017のβを使います。今回は b10です
サンプル
GitHub - Unity-Technologies/ScriptableRenderLoop: Scriptable Render Loop 個々のサンプルを落とす 多分コンパイルエラー出るので、エラー出る所をつぶせばなんとかなるはず
UnityちゃんPluginをいれる
Unityちゃんと、Unity-Chan Toon2.0を入れてみましょう GUIが邪魔なので IdleChangeとFaceのスクリプトを無効にし
通常のレンダリングパイプライン
デフォルトの状態。 Edit->ProjectSettings->Graphicsの ScriptableRenderLoopを Noneにする カメラもForwardになっている事を確認
正しく表示されてます
BasicRenderPipeline
上記の設定を BasicRenderPipelineに変更すると
何も表示されなくなりました これは、Shaderパス名が違うからです。
今までのシェーダーではForwardの場合は ForwardBase というパスが実行されますが このRenderLoopでは BasicPass というパスを実行しているので その部分を修正してみる
BasicRenderPipeline.cs#Render が、実際のパイプライン
public static void Render(ScriptableRenderContext context, IEnumerable<Camera> cameras) { foreach (var camera in cameras) { // Culling CullingParameters cullingParams; if (!CullResults.GetCullingParameters(camera, out cullingParams)) continue; CullResults cull = CullResults.Cull(ref cullingParams, context); // Setup camera for rendering (sets render target, view/projection matrices and other // per-camera built-in shader variables). context.SetupCameraProperties(camera); // clear depth buffer var cmd = new CommandBuffer(); cmd.ClearRenderTarget(true, false, Color.black); context.ExecuteCommandBuffer(cmd); cmd.Release(); // Setup global lighting shader variables SetupLightShaderVariables(cull.visibleLights, context); // Draw opaque objects using BasicPass shader pass // var settings = new DrawRendererSettings(cull, camera, new ShaderPassName("BasicPass")); // パス名を変更する var settings = new DrawRendererSettings(cull, camera, new ShaderPassName("ForwardBase")); settings.sorting.flags = SortFlags.CommonOpaque; settings.inputFilter.SetQueuesOpaque(); context.DrawRenderers(ref settings); // Draw skybox context.DrawSkybox(camera); // Draw transparent objects using BasicPass shader pass settings.sorting.flags = SortFlags.CommonTransparent; settings.inputFilter.SetQueuesTransparent(); context.DrawRenderers(ref settings); context.Submit(); } }
なんとなく表示された。
ライティングが元と違う。原因調査中だけどライティングの計算式が違うのかな?
アウトラインが無くなった。 これに関しては デフォルトでは2パスでアウトラインを表示しています(オブジェクト拡大法で) 通常のレンダリングとは別に アウトラインのパスを暗黙的に実行します ところが ScriptableRenderLoopでは パスは明示的にしか指定できないため Outlineパスが呼ばれない ので、スクリプトと 先ほどのRenderを修正しなければならない