void OnPostRender() { if (m_quad == null) { m_quad = RaymarcherUtils.GenerateQuad(); } m_material.SetPass(0); m_material.mainTexture = m_rt; Graphics.DrawMeshNow(m_quad, Matrix4x4.identity); }
void UpdateCommandBuffer() { var cam = GetComponent <Camera>(); RenderSettings.fogColor = m_fog_color; if (m_quad == null) { m_quad = RaymarcherUtils.GenerateQuad(); } bool reflesh_command_buffer = false; Vector2 reso = new Vector2(cam.pixelWidth, cam.pixelHeight); if (m_resolution_prev != reso) { m_resolution_prev = reso; reflesh_command_buffer = true; } if (m_enable_adaptive_prev != m_enable_adaptive) { m_enable_adaptive_prev = m_enable_adaptive; reflesh_command_buffer = true; } if (m_dbg_show_steps_prev != m_dbg_show_steps) { m_dbg_show_steps_prev = m_dbg_show_steps; reflesh_command_buffer = true; } if (reflesh_command_buffer) { reflesh_command_buffer = false; ClearCommandBuffer(); } if (m_cb_raymarch == null) { if (m_enable_adaptive) { RenderTargetIdentifier[] rt; m_cb_prepass = new CommandBuffer(); m_cb_prepass.name = "Raymarcher Adaptive PrePass"; int odepth = Shader.PropertyToID("ODepth"); int odepth_prev = Shader.PropertyToID("ODepthPrev"); int ovelocity = Shader.PropertyToID("OVelocity"); int qdepth = Shader.PropertyToID("QDepth"); int qdepth_prev = Shader.PropertyToID("QDepthPrev"); int hdepth = Shader.PropertyToID("HDepth"); int hdepth_prev = Shader.PropertyToID("HDepthPrev"); int adepth = Shader.PropertyToID("ADepth"); int adepth_prev = Shader.PropertyToID("ADepthPrev"); m_cb_prepass.GetTemporaryRT(odepth, cam.pixelWidth / 8, cam.pixelHeight / 8, 0, FilterMode.Point, RenderTextureFormat.RFloat); m_cb_prepass.GetTemporaryRT(odepth_prev, cam.pixelWidth / 8, cam.pixelHeight / 8, 0, FilterMode.Point, RenderTextureFormat.RFloat); m_cb_prepass.GetTemporaryRT(ovelocity, cam.pixelWidth / 8, cam.pixelHeight / 8, 0, FilterMode.Point, RenderTextureFormat.RHalf); m_cb_prepass.GetTemporaryRT(qdepth, cam.pixelWidth / 4, cam.pixelHeight / 4, 0, FilterMode.Point, RenderTextureFormat.RFloat); m_cb_prepass.GetTemporaryRT(qdepth_prev, cam.pixelWidth / 4, cam.pixelHeight / 4, 0, FilterMode.Point, RenderTextureFormat.RFloat); m_cb_prepass.GetTemporaryRT(hdepth, cam.pixelWidth / 2, cam.pixelHeight / 2, 0, FilterMode.Point, RenderTextureFormat.RFloat); m_cb_prepass.GetTemporaryRT(hdepth_prev, cam.pixelWidth / 2, cam.pixelHeight / 2, 0, FilterMode.Point, RenderTextureFormat.RFloat); m_cb_prepass.GetTemporaryRT(adepth, cam.pixelWidth / 1, cam.pixelHeight / 1, 0, FilterMode.Point, RenderTextureFormat.RFloat); m_cb_prepass.GetTemporaryRT(adepth_prev, cam.pixelWidth / 1, cam.pixelHeight / 1, 0, FilterMode.Point, RenderTextureFormat.RFloat); rt = new RenderTargetIdentifier[2] { odepth, ovelocity }; m_cb_prepass.SetGlobalTexture("g_depth_prev", odepth_prev); m_cb_prepass.SetRenderTarget(rt, odepth); m_cb_prepass.DrawMesh(m_quad, Matrix4x4.identity, m_internal_material, 0, 1); m_cb_prepass.Blit(odepth, odepth_prev); m_cb_prepass.SetGlobalTexture("g_velocity", ovelocity); m_cb_prepass.SetRenderTarget(qdepth); m_cb_prepass.SetGlobalTexture("g_depth", odepth); m_cb_prepass.SetGlobalTexture("g_depth_prev", qdepth_prev); m_cb_prepass.DrawMesh(m_quad, Matrix4x4.identity, m_internal_material, 0, 2); m_cb_prepass.Blit(qdepth, qdepth_prev); m_cb_prepass.SetRenderTarget(hdepth); m_cb_prepass.SetGlobalTexture("g_depth", qdepth); m_cb_prepass.SetGlobalTexture("g_depth_prev", hdepth_prev); m_cb_prepass.DrawMesh(m_quad, Matrix4x4.identity, m_internal_material, 0, 3); m_cb_prepass.Blit(hdepth, hdepth_prev); m_cb_prepass.SetRenderTarget(adepth); m_cb_prepass.SetGlobalTexture("g_depth", hdepth); m_cb_prepass.SetGlobalTexture("g_depth_prev", adepth_prev); m_cb_prepass.DrawMesh(m_quad, Matrix4x4.identity, m_internal_material, 0, 4); m_cb_prepass.Blit(adepth, adepth_prev); m_cb_prepass.SetGlobalTexture("g_depth", adepth); cam.AddCommandBuffer(CameraEvent.BeforeGBuffer, m_cb_prepass); } m_cb_raymarch = new CommandBuffer(); m_cb_raymarch.name = "Raymarcher"; m_cb_raymarch.DrawMesh(m_quad, Matrix4x4.identity, m_internal_material, 0, 0); cam.AddCommandBuffer(CameraEvent.BeforeGBuffer, m_cb_raymarch); } }
void OnPreRender() { m_material.SetInt("g_frame", Time.frameCount); m_material.SetInt("g_hdr", m_camera.allowHDR ? 1 : 0); m_material.SetInt("g_scene", m_scene); m_material.SetInt("g_enable_adaptive", m_enable_adaptive ? 1 : 0); m_material.SetInt("g_enable_temporal", m_enable_temporal ? 1 : 0); m_material.SetInt("g_enable_glowline", m_enable_glowline ? 1 : 0); RenderSettings.fogColor = m_fog_color; if (m_quad == null) { m_quad = RaymarcherUtils.GenerateQuad(); } if (m_detailed_quad == null) { m_detailed_quad = RaymarcherUtils.GenerateDetailedQuad(); } bool need_to_reflesh_command_buffer = false; Vector2 reso = new Vector2(m_camera.pixelWidth, m_camera.pixelHeight); if (m_resolution_prev != reso) { m_resolution_prev = reso; need_to_reflesh_command_buffer = true; } if (m_enable_adaptive_prev != m_enable_adaptive) { m_enable_adaptive_prev = m_enable_adaptive; need_to_reflesh_command_buffer = true; } if (m_dbg_show_steps_prev != m_dbg_show_steps) { m_dbg_show_steps_prev = m_dbg_show_steps; need_to_reflesh_command_buffer = true; } if (need_to_reflesh_command_buffer) { need_to_reflesh_command_buffer = false; ClearCommandBuffer(); } if (m_cb_raymarch == null) { if (m_enable_adaptive) { RenderTargetIdentifier[] rt; m_cb_prepass = new CommandBuffer(); m_cb_prepass.name = "Raymarcher Adaptive PrePass"; int odepth = Shader.PropertyToID("ODepth"); int odepth_prev = Shader.PropertyToID("ODepthPrev"); int ovelocity = Shader.PropertyToID("OVelocity"); int qdepth = Shader.PropertyToID("QDepth"); int qdepth_prev = Shader.PropertyToID("QDepthPrev"); int hdepth = Shader.PropertyToID("HDepth"); int hdepth_prev = Shader.PropertyToID("HDepthPrev"); int adepth = Shader.PropertyToID("ADepth"); int adepth_prev = Shader.PropertyToID("ADepthPrev"); m_cb_prepass.GetTemporaryRT(odepth, m_camera.pixelWidth / 8, m_camera.pixelHeight / 8, 0, FilterMode.Point, RenderTextureFormat.RFloat); m_cb_prepass.GetTemporaryRT(odepth_prev, m_camera.pixelWidth / 8, m_camera.pixelHeight / 8, 0, FilterMode.Point, RenderTextureFormat.RFloat); m_cb_prepass.GetTemporaryRT(ovelocity, m_camera.pixelWidth / 8, m_camera.pixelHeight / 8, 0, FilterMode.Point, RenderTextureFormat.RHalf); m_cb_prepass.GetTemporaryRT(qdepth, m_camera.pixelWidth / 4, m_camera.pixelHeight / 4, 0, FilterMode.Point, RenderTextureFormat.RFloat); m_cb_prepass.GetTemporaryRT(qdepth_prev, m_camera.pixelWidth / 4, m_camera.pixelHeight / 4, 0, FilterMode.Point, RenderTextureFormat.RFloat); m_cb_prepass.GetTemporaryRT(hdepth, m_camera.pixelWidth / 2, m_camera.pixelHeight / 2, 0, FilterMode.Point, RenderTextureFormat.RFloat); m_cb_prepass.GetTemporaryRT(hdepth_prev, m_camera.pixelWidth / 2, m_camera.pixelHeight / 2, 0, FilterMode.Point, RenderTextureFormat.RFloat); m_cb_prepass.GetTemporaryRT(adepth, m_camera.pixelWidth / 1, m_camera.pixelHeight / 1, 0, FilterMode.Point, RenderTextureFormat.RFloat); m_cb_prepass.GetTemporaryRT(adepth_prev, m_camera.pixelWidth / 1, m_camera.pixelHeight / 1, 0, FilterMode.Point, RenderTextureFormat.RFloat); rt = new RenderTargetIdentifier[2] { odepth, ovelocity }; m_cb_prepass.SetGlobalTexture("g_depth_prev", odepth_prev); m_cb_prepass.SetRenderTarget(rt, odepth); m_cb_prepass.DrawMesh(m_quad, Matrix4x4.identity, m_material, 0, 1); m_cb_prepass.Blit(odepth, odepth_prev); m_cb_prepass.SetGlobalTexture("g_velocity", ovelocity); m_cb_prepass.SetRenderTarget(qdepth); m_cb_prepass.SetGlobalTexture("g_depth", odepth); m_cb_prepass.SetGlobalTexture("g_depth_prev", qdepth_prev); m_cb_prepass.DrawMesh(m_quad, Matrix4x4.identity, m_material, 0, 2); m_cb_prepass.Blit(qdepth, qdepth_prev); m_cb_prepass.SetRenderTarget(hdepth); m_cb_prepass.SetGlobalTexture("g_depth", qdepth); m_cb_prepass.SetGlobalTexture("g_depth_prev", hdepth_prev); m_cb_prepass.DrawMesh(m_quad, Matrix4x4.identity, m_material, 0, 3); m_cb_prepass.Blit(hdepth, hdepth_prev); m_cb_prepass.SetRenderTarget(adepth); m_cb_prepass.SetGlobalTexture("g_depth", hdepth); m_cb_prepass.SetGlobalTexture("g_depth_prev", adepth_prev); m_cb_prepass.DrawMesh(m_quad, Matrix4x4.identity, m_material, 0, 4); m_cb_prepass.Blit(adepth, adepth_prev); m_cb_prepass.SetGlobalTexture("g_depth", adepth); m_camera.AddCommandBuffer(CameraEvent.BeforeGBuffer, m_cb_prepass); } m_cb_raymarch = new CommandBuffer(); m_cb_raymarch.name = "Raymarcher"; m_cb_raymarch.DrawMesh(m_quad, Matrix4x4.identity, m_material, 0, 0); m_camera.AddCommandBuffer(CameraEvent.BeforeGBuffer, m_cb_raymarch); } }