Advertisement
Guest User

DrawMeshInstanced does not update the depth+normal texture

a guest
Aug 11th, 2019
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 8.43 KB | None | 0 0
  1. diff -r 0f089e052393 Assets/Materials/InternalDepthNormals.shader
  2. --- /dev/null   Thu Jan 01 00:00:00 1970 +0000
  3. +++ b/Assets/Materials/InternalDepthNormals.shader  Sun Aug 11 09:10:27 2019 +0200
  4. @@ -0,0 +1,54 @@
  5. +// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)
  6. +// modified by Armin Rigo
  7. +
  8. +Shader "Custom/InternalDepthNormals" {
  9. +    Properties {
  10. +    }
  11. +
  12. +    SubShader {
  13. +        Pass {
  14. +            CGPROGRAM
  15. +            #pragma vertex vert
  16. +            #pragma fragment frag
  17. +            #pragma multi_compile_instancing
  18. +
  19. +            #include "UnityCG.cginc"
  20. +
  21. +            UNITY_INSTANCING_BUFFER_START(Props)
  22. +            UNITY_INSTANCING_BUFFER_END(Props)
  23. +
  24. +            struct appdata
  25. +            {
  26. +                float4 vertex : POSITION;
  27. +                float3 normal : NORMAL;
  28. +                UNITY_VERTEX_INPUT_INSTANCE_ID
  29. +            };
  30. +
  31. +            struct v2f
  32. +            {
  33. +                float4 pos : SV_POSITION;
  34. +                float4 nz : TEXCOORD0;
  35. +                UNITY_VERTEX_OUTPUT_STEREO
  36. +            };
  37. +
  38. +            v2f vert(appdata v)
  39. +            {
  40. +                v2f o;
  41. +                UNITY_SETUP_INSTANCE_ID(v);
  42. +                UNITY_INITIALIZE_OUTPUT(v2f, o);
  43. +                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
  44. +
  45. +                o.pos = UnityObjectToClipPos(v.vertex);
  46. +                o.nz.xyz = COMPUTE_VIEW_NORMAL;
  47. +                o.nz.w = COMPUTE_DEPTH_01;
  48. +                return o;
  49. +            }
  50. +
  51. +            float4 frag(v2f i) : SV_Target
  52. +            {
  53. +                return EncodeDepthNormal(i.nz.w, i.nz.xyz);
  54. +            }
  55. +            ENDCG
  56. +        }
  57. +    }
  58. +}
  59. diff -r 0f089e052393 Assets/Scripts/World.cs
  60. --- a/Assets/Scripts/World.cs   Sat Aug 10 19:56:39 2019 +0200
  61. +++ b/Assets/Scripts/World.cs   Sun Aug 11 09:10:27 2019 +0200
  62. @@ -112,33 +112,39 @@
  63.              static readonly Matrix4x4[] ROTATE = _MakeRotationMatrices();
  64.              static Vector3[] deltaTime = new Vector3[8];
  65.  
  66.              internal static void SetShiftTime(float shift_time)
  67.              {
  68.                  /* shift_time is between -1 and 0 */
  69.                  foreach (var step in UnitVector3Int.steps)
  70.                      deltaTime[step.ToByte()] = ((Vector3)step) * shift_time;
  71.              }
  72.  
  73. -            int _Flush(Camera camera, int i)
  74. +            int _Flush(Camera camera, CommandBuffer cmdbuf, int i)
  75.              {
  76. +                var prefabs = SceneLoader.game_prefabs;
  77.                  foreach (var draw_call in draw_calls)
  78.                  {
  79.                      Graphics.DrawMeshInstanced(draw_mesh,
  80.                                                 draw_call.submesh_index, draw_call.mat, matrices, i,
  81.                                                 null, draw_call.cast_shadows, draw_call.receive_shadows,
  82.                                                 0, camera);
  83. +                    if (draw_call.cast_shadows != ShadowCastingMode.Off && draw_call.receive_shadows)
  84. +                        cmdbuf.DrawMeshInstanced(draw_mesh,
  85. +                                                 draw_call.submesh_index,
  86. +                                                 prefabs.internalDepthNormalsMaterial,
  87. +                                                 0, matrices, i);
  88.                  }
  89.                  return 0;
  90.              }
  91.  
  92. -            internal void DrawMeshInstanced(Camera camera, Matrix4x4 world_matrix)
  93. +            internal void DrawMeshInstanced(Camera camera, CommandBuffer cmdbuf, Matrix4x4 world_matrix)
  94.              {
  95.                  int i = 0;
  96.                  int count = entries.Count;
  97.                  for (int j = 0; j < count; j++)
  98.                  {
  99.                      var entry = entries[j];
  100.                      var mat = ROTATE[entry.rotation];
  101.                      if (entry.movement != 0xff)
  102.                      {
  103.                          Vector3 v = entry.position + deltaTime[entry.movement];
  104. @@ -148,24 +154,24 @@
  105.                      {
  106.                          Vector3 v = entry.position;
  107.                          mat.SetColumn(3, new Vector4(v.x, v.y, v.z, 1));
  108.  
  109.                          var rot_info = rotation_infos[j];
  110.                          mat = rot_info.rendering_matrix * mat;
  111.                      }
  112.  
  113.                      matrices[i++] = world_matrix * mat;
  114.                      if (i == NUM_MATRICES)
  115. -                        i = _Flush(camera, i);
  116. +                        i = _Flush(camera, cmdbuf, i);
  117.                  }
  118.                  if (i > 0)
  119. -                    _Flush(camera, i);
  120. +                    _Flush(camera, cmdbuf, i);
  121.              }
  122.  
  123.              static Matrix4x4[] _MakeRotationMatrices()
  124.              {
  125.                  var result = new Matrix4x4[64];
  126.                  Matrix4x4 invalid = Matrix4x4.Rotate(Quaternion.Euler(45, 45, 45));  /* don't use */
  127.                  for (int i = 0; i < 64; i++)
  128.                  {
  129.                      Quaternion? q = RotationInt._quaternion[i];
  130.                      if (q != null)
  131. @@ -202,20 +208,22 @@
  132.              }
  133.              else
  134.              {
  135.                  RenderSettings.ambientMode = AmbientMode.Skybox;
  136.              }
  137.          }
  138.  
  139.          private void OnDisable()
  140.          {
  141.              Camera.onPreCull -= DrawMeshInstanced;
  142. +            UninstallCommandBuffer();
  143. +
  144.              if (objects_to_destroy != null)
  145.              {
  146.                  foreach (var obj in objects_to_destroy)
  147.                      Destroy(obj);
  148.                  objects_to_destroy = null;
  149.              }
  150.          }
  151.  
  152.          private void Start()
  153.          {
  154. @@ -537,40 +545,70 @@
  155.                      var emitParams = new ParticleSystem.EmitParams
  156.                      {
  157.                          position = center,
  158.                          applyShapeToPosition = true,
  159.                      };
  160.                      ps.Emit(emitParams, count);
  161.                  }
  162.              }
  163.          }
  164.  
  165. +        CommandBuffer command_buffer;
  166. +        HashSet<Camera> command_buffer_installed;
  167. +
  168. +        void UninstallCommandBuffer()
  169. +        {
  170. +            if (command_buffer_installed != null)
  171. +            {
  172. +                foreach (var camera in command_buffer_installed)
  173. +                    if (camera)
  174. +                        camera.RemoveCommandBuffer(CameraEvent.AfterDepthNormalsTexture, command_buffer);
  175. +                command_buffer_installed = null;
  176. +                command_buffer.Release();
  177. +                command_buffer = null;
  178. +            }
  179. +        }
  180. +
  181.          void DrawMeshInstanced(Camera camera)
  182.          {
  183.              if (!camera)
  184.                  return;
  185.  
  186.              var sel_coll = GetSelectionCell();
  187.              sel_coll.Reset();
  188.              if (selection_mat != null)
  189.              {
  190.                  sel_coll.ChangeMaterial(selection_mat);
  191.                  foreach (var position in selection)
  192.                      sel_coll.Add(position, RotationInt.identity, UnitVector3Int.zero);
  193.                  selection_mat = null;  /* must be set again to keep displaying the selection */
  194.              }
  195.  
  196. +            if (command_buffer_installed == null)
  197. +            {
  198. +                command_buffer = new CommandBuffer();
  199. +                command_buffer.name = "hack to render Depth+Normals";
  200. +                command_buffer_installed = new HashSet<Camera>();
  201. +            }
  202. +            if (!command_buffer_installed.Contains(camera))
  203. +            {
  204. +                camera.AddCommandBuffer(CameraEvent.AfterDepthNormalsTexture, command_buffer);
  205. +                command_buffer_installed.Add(camera);
  206. +                Debug.Log("Command buffer installed on " + command_buffer_installed.Count + " camera(s)");
  207. +            }
  208. +            command_buffer.Clear();
  209. +
  210.              var world_matrix = transform.localToWorldMatrix;
  211.  
  212.              UnityEngine.Profiling.Profiler.BeginSample("Draw World Instanced");
  213.              foreach (var coll in all_cells)
  214. -                coll.DrawMeshInstanced(camera, world_matrix);
  215. +                coll.DrawMeshInstanced(camera, command_buffer, world_matrix);
  216.              UnityEngine.Profiling.Profiler.EndSample();
  217.          }
  218.  
  219.          public void SetShiftTime(float delta, IEnumerable<Geometry.GroupRotationInfo> group_rotations)
  220.          {
  221.              Coll.SetShiftTime(delta);
  222.  
  223.              /* delta is between -1 and 0.
  224.               * xxx this could be further optimized, unclear if it's useful
  225.               */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement