diff --git a/CHANGELOG.md b/CHANGELOG.md index 58c4111..749e3ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,47 @@ # Changelog +## [4.0.0](https://github.com/happy-turtle/oit-unity/compare/v3.0.1...v4.0.0) (2023-12-30) + + +### ⚠ BREAKING CHANGES + +* :fire: remove deprecated image effect implementation ([#23](https://github.com/happy-turtle/oit-unity/issues/23)) + +### Features + +* UniversalRP Scene View ([#22](https://github.com/happy-turtle/oit-unity/issues/22)) ([6fb79a9](https://github.com/happy-turtle/oit-unity/commit/6fb79a906a67ca9f5323488241df82cabc4cfdb0)) + + +### Code Refactoring + +* :fire: remove deprecated image effect implementation ([#23](https://github.com/happy-turtle/oit-unity/issues/23)) ([0d4459c](https://github.com/happy-turtle/oit-unity/commit/0d4459c94866c500f2bd6a64d600ce9738569635)) + ## [3.0.1](https://github.com/happy-turtle/oit-unity/compare/3.0.0...v3.0.1) (2023-09-28) ### Bug Fixes * add missing post process effect to samples ([#17](https://github.com/happy-turtle/oit-unity/issues/17)) ([7984a98](https://github.com/happy-turtle/oit-unity/commit/7984a98e737c2abd36fc14f6dcfc2c40d07292bc)) + +## 3.0.0 + +### Added + +- Add High-Definition Render Pipeline implementation of Order-Independent Transparency +- Add Universal Render Pipeline implementation of Order-Independent Transparency +- Support Vulkan and OpenGL by using SV_SampleIndex for MSAA support + +### Changed + +- Restructure package for different render pipelines using Assemblies +- Changed package name to avoid using protected names +- Update project description and demo scenes +- Various small shader and interface improvements and updates + +## 2.0.0 + +### Changed + +- Created a custom package and restructured the whole project to make installation with the Unity package manager + possible +- Improve performance by resetting linked list head buffer on GPU with a ComputeShader diff --git a/Changelog.md.meta b/CHANGELOG.md.meta similarity index 100% rename from Changelog.md.meta rename to CHANGELOG.md.meta diff --git a/Changelog.md b/Changelog.md deleted file mode 100644 index 509cab8..0000000 --- a/Changelog.md +++ /dev/null @@ -1,31 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -## [Unreleased] - -## [3.0.0] - -### Added - -- Add High-Definition Render Pipeline implementation of Order-Independent Transparency -- Add Universal Render Pipeline implementation of Order-Independent Transparency -- Support Vulkan and OpenGL by using SV_SampleIndex for MSAA support - -### Changed - -- Restructure package for different render pipelines using Assemblies -- Changed package name to avoid using protected names -- Update project description and demo scenes -- Various small shader and interface improvements and updates - -## [2.0.0] - -### Changed - -- Created a custom package and restructured the whole project to make installation with the Unity package manager - possible -- Improve performance by resetting linked list head buffer on GPU with a ComputeShader diff --git a/HDRP/Runtime/OitRenderPass.cs b/HDRP/Runtime/OitRenderPass.cs index 7878069..e40806c 100644 --- a/HDRP/Runtime/OitRenderPass.cs +++ b/HDRP/Runtime/OitRenderPass.cs @@ -12,21 +12,22 @@ class OitRenderPass : CustomPass protected override void Setup(ScriptableRenderContext renderContext, CommandBuffer cmd) { - orderIndependentTransparency ??= new OitLinkedList(); + orderIndependentTransparency ??= new OitLinkedList("OitRenderHDRP"); } protected override void Execute(CustomPassContext ctx) { // draw objects with UAV targets set var preRenderCmd = CommandBufferPool.Get("Order Independent Transparency Pre Render"); - preRenderCmd.Clear(); orderIndependentTransparency.PreRender(preRenderCmd); ctx.renderContext.ExecuteCommandBuffer(preRenderCmd); + preRenderCmd.Clear(); CommandBufferPool.Release(preRenderCmd); CustomPassUtils.DrawRenderers(ctx, objectLayerMask); // fullscreen blend of transparent pixel buffer - orderIndependentTransparency.Render(ctx.cmd, ctx.cameraColorBuffer, ctx.cameraColorBuffer); + var mat = orderIndependentTransparency.Render(ctx.cmd, ctx.cameraColorBuffer, ctx.cameraColorBuffer); + Blitter.BlitCameraTexture(ctx.cmd, ctx.cameraColorBuffer, ctx.cameraColorBuffer, mat, 0); } protected override void Cleanup() diff --git a/Legacy.meta b/Legacy.meta deleted file mode 100644 index fdb0e85..0000000 --- a/Legacy.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 2140e8ee1781a7346b787637cbbf9471 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Legacy/Runtime.meta b/Legacy/Runtime.meta deleted file mode 100644 index 6d35305..0000000 --- a/Legacy/Runtime.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 40e342153494452780aa1de210720ca3 -timeCreated: 1669924698 \ No newline at end of file diff --git a/Legacy/Runtime/OitImageEffectComponent.cs b/Legacy/Runtime/OitImageEffectComponent.cs deleted file mode 100644 index 1bdf470..0000000 --- a/Legacy/Runtime/OitImageEffectComponent.cs +++ /dev/null @@ -1,50 +0,0 @@ -using UnityEngine; -using UnityEngine.Rendering; - -namespace OrderIndependentTransparency -{ - [ImageEffectAllowedInSceneView] - [ExecuteAlways] - internal class OitImageEffectComponent : MonoBehaviour - { - private CommandBuffer cmdPreRender; - private CommandBuffer cmdRender; - - private IOrderIndependentTransparency orderIndependentTransparency; - - private void Start() - { - orderIndependentTransparency ??= new OitLinkedList(); - } - - private void OnDisable() - { - orderIndependentTransparency?.Release(); - } - - private void OnDestroy() - { - orderIndependentTransparency?.Release(); - } - - private void OnPreRender() - { - cmdPreRender ??= new CommandBuffer(); - cmdPreRender.Clear(); - orderIndependentTransparency?.PreRender(cmdPreRender); - Graphics.ExecuteCommandBuffer(cmdPreRender); - } - - [ImageEffectUsesCommandBuffer] - [ImageEffectOpaque] - private void OnRenderImage(RenderTexture src, RenderTexture dest) - { - cmdRender ??= new CommandBuffer(); - cmdRender.Clear(); - orderIndependentTransparency?.Render(cmdRender, src, src); - Graphics.ExecuteCommandBuffer(cmdRender); - // Additional Blit to ensure we write to destination - Graphics.Blit(src, dest); - } - } -} \ No newline at end of file diff --git a/Legacy/Runtime/OitImageEffectComponent.cs.meta b/Legacy/Runtime/OitImageEffectComponent.cs.meta deleted file mode 100644 index b039769..0000000 --- a/Legacy/Runtime/OitImageEffectComponent.cs.meta +++ /dev/null @@ -1,13 +0,0 @@ -fileFormatVersion: 2 -guid: 60eb1256c22340a7a610dbcb32ee0622 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: - - fullscreenShader: {fileID: 4800000, guid: f2e2448455bf4f6ba2ec561a0aa09479, type: 3} - - resetShader: {fileID: 7200000, guid: 8166d1d02844f514985e551cdad81e49, type: 3} - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/PostProcessingStackV2/Runtime/OitPostProcess.cs b/PostProcessingStackV2/Runtime/OitPostProcess.cs index a7d5f8f..c29238a 100644 --- a/PostProcessingStackV2/Runtime/OitPostProcess.cs +++ b/PostProcessingStackV2/Runtime/OitPostProcess.cs @@ -19,7 +19,7 @@ internal class OitPostProcessRenderer : PostProcessEffectRenderer("OitFullscreenRender")); + linkedListMaterial = new Material(Resources.Load(shaderName)); fragmentLinkBufferId = Shader.PropertyToID("FLBuffer"); startOffsetBufferId = Shader.PropertyToID("StartOffsetBuffer"); @@ -44,13 +44,13 @@ public void PreRender(CommandBuffer command) command.SetRandomWriteTarget(2, startOffsetBuffer); } - public void Render(CommandBuffer command, RenderTargetIdentifier src, RenderTargetIdentifier dest) + public Material Render(CommandBuffer command, RenderTargetIdentifier src, RenderTargetIdentifier dest) { command.ClearRandomWriteTargets(); // blend linked list linkedListMaterial.SetBuffer(fragmentLinkBufferId, fragmentLinkBuffer); linkedListMaterial.SetBuffer(startOffsetBufferId, startOffsetBuffer); - command.Blit(src, dest, linkedListMaterial); + return linkedListMaterial; } public void Release() diff --git a/URP/Runtime/OitPass.cs b/URP/Runtime/OitPass.cs index 03d5aad..1437d34 100644 --- a/URP/Runtime/OitPass.cs +++ b/URP/Runtime/OitPass.cs @@ -12,26 +12,28 @@ internal class OitPass : ScriptableRenderPass public OitPass() { renderPassEvent = RenderPassEvent.BeforeRenderingTransparents; - orderIndependentTransparency = new OitLinkedList(); + orderIndependentTransparency = new OitLinkedList("OitRenderURP"); RenderPipelineManager.beginContextRendering += PreRender; } private void PreRender(ScriptableRenderContext context, List cameras) { CommandBuffer cmd = CommandBufferPool.Get("Order Independent Transparency Pre Render"); - cmd.Clear(); orderIndependentTransparency.PreRender(cmd); context.ExecuteCommandBuffer(cmd); + cmd.Clear(); CommandBufferPool.Release(cmd); } public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { CommandBuffer cmd = CommandBufferPool.Get("Order Independent Transparency"); - cmd.Clear(); - orderIndependentTransparency.Render(cmd, renderingData.cameraData.renderer.cameraColorTarget, - renderingData.cameraData.renderer.cameraColorTarget); + var mat = orderIndependentTransparency.Render(cmd, renderingData.cameraData.renderer.cameraColorTargetHandle, + renderingData.cameraData.renderer.cameraColorTargetHandle); + Blitter.BlitCameraTexture(cmd, renderingData.cameraData.renderer.cameraColorTargetHandle, + renderingData.cameraData.renderer.cameraColorTargetHandle, mat, 0); context.ExecuteCommandBuffer(cmd); + cmd.Clear(); CommandBufferPool.Release(cmd); } diff --git a/URP/Runtime/OrderIndependentTransparencyRenderer.cs b/URP/Runtime/OrderIndependentTransparencyRenderer.cs index 38641da..f5394d1 100644 --- a/URP/Runtime/OrderIndependentTransparencyRenderer.cs +++ b/URP/Runtime/OrderIndependentTransparencyRenderer.cs @@ -1,5 +1,3 @@ -using System; -using UnityEngine; using UnityEngine.Rendering.Universal; namespace OrderIndependentTransparency.URP @@ -17,10 +15,10 @@ public override void Create() public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) { - // Unity does not provide an example how to perform a fullscreen Blit that works in scene view - // Hence only Blit in Game view for now - if (renderingData.cameraData.cameraType != CameraType.Game) + if (renderingData.cameraData.isPreviewCamera) + { return; + } //Calling ConfigureInput with the ScriptableRenderPassInput.Color argument ensures that the opaque texture is available to the Render Pass oitPass.ConfigureInput(ScriptableRenderPassInput.Color); renderer.EnqueuePass(oitPass); diff --git a/package.json b/package.json index 9524e35..1a84a02 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { "name": "org.happy-turtle.order-independent-transparency", - "version": "3.0.1", + "version": "4.0.0", + "unity": "2021.2", "displayName": "Order-independent Transparency", "description": "This is an implementation of order-independent transparency for the Built-In Pipeline. It uses Per-Pixel Linked Lists, implemented with RWStructuredBuffers. This is a feature requiring Shader Model 5.0 with ComputeBuffers, see the Unity Manual for supported platforms.", - "unity": "2020.3", "author": { "name": "Till Davin", "email": "code@tilldavin.de" @@ -15,11 +15,6 @@ "description": "Order-independent transparency using a post processing effect", "path": "Samples~/Post Process Demo" }, - { - "displayName": "ImageEffect Component Demo", - "description": "Order-independent transparency using a legacy ImageEffect component", - "path": "Samples~/ImageEffect Component Demo" - }, { "displayName": "HDRP Custom Pass Demo", "description": "Order-independent transparency in the High-Definition render pipeline",