diff --git a/Assets/ArtRes/3D/Fish/fish_red_tail_barracuda/Fbx/fish_red_tail_barracuda.fbx.meta b/Assets/ArtRes/3D/Fish/fish_red_tail_barracuda/Fbx/fish_red_tail_barracuda.fbx.meta index 192f69a..95d3926 100644 --- a/Assets/ArtRes/3D/Fish/fish_red_tail_barracuda/Fbx/fish_red_tail_barracuda.fbx.meta +++ b/Assets/ArtRes/3D/Fish/fish_red_tail_barracuda/Fbx/fish_red_tail_barracuda.fbx.meta @@ -5,7 +5,7 @@ ModelImporter: internalIDToNameTable: [] externalObjects: {} materials: - materialImportMode: 2 + materialImportMode: 0 materialName: 0 materialSearch: 1 materialLocation: 1 diff --git a/Assets/Scenes/Oasis/Art/Environment/Materials/HeightFog_Mat.mat b/Assets/Scenes/Oasis/Art/Environment/Materials/HeightFog_Mat.mat index 835134f..4519a34 100644 --- a/Assets/Scenes/Oasis/Art/Environment/Materials/HeightFog_Mat.mat +++ b/Assets/Scenes/Oasis/Art/Environment/Materials/HeightFog_Mat.mat @@ -49,5 +49,5 @@ Material: - _SunScatteringIntensity: 2 m_Colors: - _Height_Range: {r: 0, g: 20, b: 0, a: 0} - - _Tint: {r: 1, g: 0.5215277, b: 0.3254717, a: 1} + - _Tint: {r: 1, g: 0.06177143, b: 0, a: 1} m_BuildTextureStacks: [] diff --git a/Assets/Scenes/Oasis/OasisScene.unity b/Assets/Scenes/Oasis/OasisScene.unity index 785bd19..2bdd4bf 100644 --- a/Assets/Scenes/Oasis/OasisScene.unity +++ b/Assets/Scenes/Oasis/OasisScene.unity @@ -5192,6 +5192,105 @@ PrefabInstance: insertIndex: -1 addedObject: {fileID: 858172680} m_SourcePrefab: {fileID: 100100000, guid: c708a3b79cd542b42bbfedb17e213bc1, type: 3} +--- !u!1 &313910996 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 313910999} + - component: {fileID: 313910998} + - component: {fileID: 313910997} + - component: {fileID: 313911000} + m_Layer: 0 + m_Name: fish_red_tail_barracuda_LOD0 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!23 &313910997 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 313910996} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 82f089674b537fe42b84f66f22c4b13f, type: 2} + - {fileID: 2100000, guid: 872b4d67fd3bbd14caa9aea720bd1b75, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &313910998 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 313910996} + m_Mesh: {fileID: 570477287269320233, guid: 339eb591abeebc24fb589a3a0bec722e, type: 3} +--- !u!4 &313910999 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 313910996} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2.1888773, y: 0.77391624, z: -163.4194} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &313911000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 313910996} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1dbacbfb9faa3fa4695d441929e67e91, type: 3} + m_Name: + m_EditorClassIdentifier: + SubMeshIndex: 1 + testIndex: 3 --- !u!1001 &314797079 PrefabInstance: m_ObjectHideFlags: 0 @@ -36829,3 +36928,4 @@ SceneRoots: - {fileID: 2128448439} - {fileID: 31312180} - {fileID: 1120789876} + - {fileID: 313910999} diff --git a/Assets/Scenes/Oasis/Settings/Oasis_Outdoor_Volume_Profile.asset b/Assets/Scenes/Oasis/Settings/Oasis_Outdoor_Volume_Profile.asset index 811da75..b18416e 100644 --- a/Assets/Scenes/Oasis/Settings/Oasis_Outdoor_Volume_Profile.asset +++ b/Assets/Scenes/Oasis/Settings/Oasis_Outdoor_Volume_Profile.asset @@ -150,7 +150,7 @@ MonoBehaviour: m_Value: {x: 0, y: 20} Tint: m_OverrideState: 1 - m_Value: {r: 1, g: 0.5215277, b: 0.3254717, a: 1} + m_Value: {r: 1, g: 0.06177143, b: 0, a: 1} SunScatteringIntensity: m_OverrideState: 1 m_Value: 2 diff --git a/Assets/Scripts/Features/OIT/MOIT/MOITFeature.cs b/Assets/Scripts/Features/OIT/MOIT/MOITFeature.cs index 4834c45..da89140 100644 --- a/Assets/Scripts/Features/OIT/MOIT/MOITFeature.cs +++ b/Assets/Scripts/Features/OIT/MOIT/MOITFeature.cs @@ -1,9 +1,5 @@ using System; -using System.Drawing.Drawing2D; -using System.Runtime.ConstrainedExecution; -using System.Security.Cryptography; using UnityEngine; -using UnityEngine.Experimental.Rendering.RenderGraphModule; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; @@ -154,9 +150,17 @@ public class MOITFeature : ScriptableRendererFeature Vector4 wrappingZoneParameters = ComputeWrappingZoneParameters(); - public static bool GetViewDepthMinMaxWithRenderQueue(Camera camera, RenderQueueRange range, + public static bool GetViewDepthMinMaxWithRenderQueue(MOITSettings settings, Camera camera, RenderQueueRange range, out Vector2 minMax) { + if (settings.boundsType == BoundsType.NearFarPlanes) + { + // default to nearfarplanes + minMax.x = camera.nearClipPlane; + minMax.y = camera.farClipPlane; + return true; + } + minMax = Vector2.zero; bool b = false; Bounds bounds = new Bounds(); @@ -231,7 +235,7 @@ public class MOITFeature : ScriptableRendererFeature upperBound = settings.renderQueueMax }; - if (!GetViewDepthMinMaxWithRenderQueue(cameraData.camera, renderQueue, out Vector2 viewDepthMinMax)) + if (!GetViewDepthMinMaxWithRenderQueue(settings, cameraData.camera, renderQueue, out Vector2 viewDepthMinMax)) { return; } @@ -239,7 +243,10 @@ public class MOITFeature : ScriptableRendererFeature RenderTextureDescriptor baseDescriptor = cameraData.cameraTargetDescriptor; baseDescriptor.colorFormat = RenderTextureFormat.ARGBHalf; baseDescriptor.depthBufferBits = 0; - RenderingUtils.ReAllocateIfNeeded(ref moitHandle, baseDescriptor, name: "_MOIT_Texture"); + if(RenderingUtils.ReAllocateIfNeeded(ref moitHandle, baseDescriptor, name:"_MOIT_Texture")) + { + cmd.SetGlobalTexture("_MOIT", moitHandle); + } RenderTextureDescriptor descriptorFloat4; RenderTextureDescriptor descriptorFloat2; @@ -265,18 +272,30 @@ public class MOITFeature : ScriptableRendererFeature FilterMode filterMode = FilterMode.Bilinear; - RenderingUtils.ReAllocateIfNeeded(ref b0, descriptorFloat, name: "_MOIT_B0", filterMode: filterMode); + if(RenderingUtils.ReAllocateIfNeeded(ref b0, descriptorFloat, name: "_MOIT_B0", filterMode: filterMode)) + { + cmd.SetGlobalTexture(b0TextureID, b0); + } - RenderingUtils.ReAllocateIfNeeded(ref b1, descriptorFloat4, name: "_MOIT_B1", filterMode: filterMode); + if(RenderingUtils.ReAllocateIfNeeded(ref b1, descriptorFloat4, name: "_MOIT_B1", filterMode: filterMode)) + { + cmd.SetGlobalTexture(b1TextureID, b1); + } if (settings.momentsCount == MomentsCount._8) { - RenderingUtils.ReAllocateIfNeeded(ref b1, descriptorFloat4, name: "_MOIT_B2", filterMode: filterMode); - + if(RenderingUtils.ReAllocateIfNeeded(ref b1, descriptorFloat4, name: "_MOIT_B2", filterMode: filterMode)) + { + cmd.SetGlobalTexture(b2TextureID, b2); + } + } else if (settings.momentsCount == MomentsCount._6) { - RenderingUtils.ReAllocateIfNeeded(ref b1, descriptorFloat2, name: "_MOIT_B2", filterMode: filterMode); + if(RenderingUtils.ReAllocateIfNeeded(ref b1, descriptorFloat2, name: "_MOIT_B2", filterMode: filterMode)) + { + cmd.SetGlobalTexture(b2TextureID, b2); + } } SortingCriteria sortingCritera = settings.sortBackToFront ? SortingCriteria.BackToFront | SortingCriteria.OptimizeStateChanges : SortingCriteria.OptimizeStateChanges; @@ -308,13 +327,11 @@ public class MOITFeature : ScriptableRendererFeature cmd.BeginSample("GenerateMoments"); mrts2[0] = mrts3[0] = b0; mrts2[1] = mrts3[1] = b1; - cmd.SetGlobalTexture(b0TextureID, b0); - cmd.SetGlobalTexture(b1TextureID, b1); + if (settings.momentsCount != MomentsCount._4) { mrts3[2] = b2; cmd.SetRenderTarget(mrts3, rdr.cameraDepthTargetHandle); - cmd.SetGlobalTexture(b2TextureID, b2); } else { @@ -363,10 +380,6 @@ public class MOITFeature : ScriptableRendererFeature { cmd.BeginSample("ResolveMoments"); - if (settings.debugMakeMOITTexGlobal) - { - cmd.SetGlobalTexture("_MOIT", moitHandle); - } cmd.SetRenderTarget(moitHandle, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.DontCare); cmd.ClearRenderTarget(false, true, Color.clear); @@ -380,7 +393,6 @@ public class MOITFeature : ScriptableRendererFeature { cmd.BeginSample("Composite"); - cmd.SetGlobalTexture("_MOIT", moitHandle); cmd.SetRenderTarget(rdr.cameraColorTargetHandle, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.Store, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.DontCare); cmd.DrawProcedural(Matrix4x4.identity, settings.compositeMaterial, 0, MeshTopology.Triangles, 3); cmd.EndSample("Composite"); diff --git a/Assets/Scripts/Features/OIT/MOIT/MOITSettings.cs b/Assets/Scripts/Features/OIT/MOIT/MOITSettings.cs index 181007a..cd9ea67 100644 --- a/Assets/Scripts/Features/OIT/MOIT/MOITSettings.cs +++ b/Assets/Scripts/Features/OIT/MOIT/MOITSettings.cs @@ -14,8 +14,7 @@ public class MOITSettings [Header("Bounds")] [Tooltip("Method of finding MOIT renderers in order to build the conservative bounding sphere that we use to warp depth, lowering numerical errors\n- NearFarPlanes: just use near and far planes (essentially keep low precision)\n- FindObjects: not optimized but automatic (Renderers only)\n- Register: user needs to add a script to every transparent object (Renderer and VFX)")] public MOITFeature.BoundsType boundsType = MOITFeature.BoundsType.FindObjects; - [Tooltip("Setting for BoundsType.FindObject and BoundType.Register :\nShould we check if each renderer is visible (by any camera) before adding its bounds?")] - public bool onlyVisibleRenderers = false; + [Header("Rendering")] [Tooltip("Works with Everything but usually MOIT objects should be set on specific layers that are removed from the Transparent Layer Mask (in Universal Renderer Data) to prevent double rendering")] public LayerMask layerMask = Physics.AllLayers; @@ -25,7 +24,4 @@ public class MOITSettings public Material compositeMaterial; [Tooltip("Back to front sorting does not matter in OIT techniques so we skip it, however this is probably desirable if you intend to write to depth\n(example : base DoF on the closest transparent object instead of the first opaque on the pixel)")] public bool sortBackToFront = false; - [Header("Debug")] - [Tooltip("Set this to true to be able to visualize the MOIT texture in the fullscreen feature using RT_test_mat (else only B0 B1 and B2 (if applicable) are available)")] - public bool debugMakeMOITTexGlobal = false; } diff --git a/Assets/Scripts/Features/OIT/SortTriangles/SortTrianglesManager.cs b/Assets/Scripts/Features/OIT/SortTriangles/SortTrianglesManager.cs new file mode 100644 index 0000000..be78d29 --- /dev/null +++ b/Assets/Scripts/Features/OIT/SortTriangles/SortTrianglesManager.cs @@ -0,0 +1,54 @@ +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Rendering; + +public class SortTrianglesManager +{ + public static SortTrianglesManager Instance => instance ??= new SortTrianglesManager(); + + static SortTrianglesManager instance; + + private List sortTriangles = new(); + + public void Regsister(SortTrianglesOIT oit) + { + if(sortTriangles.Count == 0) + { + RenderPipelineManager.beginCameraRendering += OnBeginCamera; + } + + sortTriangles.Add(oit); + } + + public void UnRegsister(SortTrianglesOIT oit) + { + sortTriangles.Remove(oit); + if(sortTriangles.Count == 0) + { + RenderPipelineManager.beginCameraRendering -= OnBeginCamera; + } + } + + private void OnBeginCamera(ScriptableRenderContext context, Camera camera) + { + if (camera.cameraType != CameraType.Game + && camera.cameraType != CameraType.SceneView + && camera.cameraType != CameraType.Preview + && camera.cameraType != CameraType.Reflection + ) + { + return; + } + + for (int i = 0; i < sortTriangles.Count; i++) + { + var it = sortTriangles[i]; +#if UNITY_EDITOR + if(it) +#endif + { + it.UpdateCameraPosition(camera.transform.position); + } + } + } +} diff --git a/Assets/Scripts/Features/OIT/SortTriangles/SortTrianglesManager.cs.meta b/Assets/Scripts/Features/OIT/SortTriangles/SortTrianglesManager.cs.meta new file mode 100644 index 0000000..ee2e53a --- /dev/null +++ b/Assets/Scripts/Features/OIT/SortTriangles/SortTrianglesManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 574e17ad9180f924eb9f25d78d145483 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Features/OIT/SortTriangles/SortTrianglesOIT.cs b/Assets/Scripts/Features/OIT/SortTriangles/SortTrianglesOIT.cs new file mode 100644 index 0000000..f802daf --- /dev/null +++ b/Assets/Scripts/Features/OIT/SortTriangles/SortTrianglesOIT.cs @@ -0,0 +1,231 @@ +using System; +using System.Runtime.InteropServices; +using UnityEngine; +using UnityEngine.Rendering; + +[RequireComponent(typeof(MeshFilter))] +[ExecuteAlways] +public class SortTrianglesOIT : MonoBehaviour +{ + [Serializable] + class MeshIndices + { + public int[] Indices; + } + public int SubMeshIndex = 0; + // XXX: 根据重叠三角形,计算实际需要的数据,减少序列化大小 + [SerializeField] + private MeshIndices[] sortedIndes = new MeshIndices[12]; + [SerializeField, HideInInspector] + private bool isSorted = false; + private Mesh mesh; + + private float distanceMultiplier = 1.5f; + [SerializeField] + private float directionalMinCos = 0.8f; + [SerializeField, HideInInspector] + private int indexStart; + [SerializeField, HideInInspector] + private uint meshIndicesCnt; + + private static readonly Vector3[] viewDirections = + { + new Vector3(0, 0, 1), + new Vector3(0, 0, -1), + new Vector3(1, 0, 0), + new Vector3(-1, 0, 0), + new Vector3(0, 1, 0), + new Vector3(0, -1, 0), + new Vector3(1, 1, 1).normalized, + new Vector3(1, 1, -1).normalized, + new Vector3(1, -1, 1).normalized, + new Vector3(1, -1, -1).normalized, + new Vector3(-1, 1, 1).normalized, + new Vector3(-1, 1, -1).normalized + }; + + + private void Awake() + { + mesh = GetComponent().sharedMesh; + } + + private void OnEnable() + { + SortTrianglesManager.Instance.Regsister(this); + } + + private void OnDisable() + { + SortTrianglesManager.Instance.UnRegsister(this); + } + + public void UpdateCameraPosition(Vector3 pos) + { + if (!isSorted) + { + return; + } +#if UNITY_EDITOR + if(Time.frameCount % 3 != 0 + && Application.isPlaying + ) + { + return; + } +#endif + + var viewDir = (pos - transform.position).normalized; + for (int i = 0; i < viewDirections.Length; i++) + { + if (Vector3.Dot(viewDir, viewDirections[i]) > directionalMinCos) + { + SetIndex(i); + break; + } + } + } + + private int lastIndex = -1; + private void SetIndex(int index) + { + if (lastIndex == index) + { + return; + } + + var indices = sortedIndes[index].Indices; + + //mesh.SetIndexBufferParams((int)meshIndicesCnt, mesh.indexFormat); + //mesh.SetIndexBufferData(indices, 0, indexStart, indices.Length, + // MeshUpdateFlags.DontValidateIndices | + // MeshUpdateFlags.DontResetBoneBounds | + // MeshUpdateFlags.DontNotifyMeshUsers | + // MeshUpdateFlags.DontRecalculateBounds + // ); + mesh.SetIndices(indices, MeshTopology.Triangles, SubMeshIndex, false); + lastIndex = index; + } + +#if UNITY_EDITOR + Vector3 GetAdaptiveUpVector(Vector3 dir) + { + // 处理垂直方向时的万向节死锁 + return (Mathf.Abs(dir.y) > 0.9f) ? Vector3.forward : Vector3.up; + } + + void SetupCamera(Camera renderCamera, Vector3 direction, float modelRadius) + { + // 计算相机位置(避免模型裁剪) + float minDistance = modelRadius / Mathf.Tan(renderCamera.fieldOfView * 0.5f * Mathf.Deg2Rad); + Vector3 cameraPos = transform.position + direction * (minDistance * distanceMultiplier); + + renderCamera.transform.position = cameraPos; + renderCamera.transform.LookAt(transform.position, GetAdaptiveUpVector(direction)); + } + + [StructLayout(LayoutKind.Sequential, Pack = 4)] + struct PrimitiveDepth : IComparable + { + public float depth; + public uint a; + public uint b; + public uint c; + + public int CompareTo(PrimitiveDepth other) + { + var i = depth - other.depth; + if (i > 0) + { + return 1; + } + else if (i < 0) + { + return -1; + } + else + { + return 0; + } + } + } + + void RenderCamera(Camera renderCamera, Material material, ComputeBuffer buffer, int dirIndex) + { + var cmd = CommandBufferPool.Get(); + cmd.ClearRandomWriteTargets(); + cmd.SetRandomWriteTarget(1, buffer); + cmd.SetViewProjectionMatrices(renderCamera.worldToCameraMatrix, renderCamera.projectionMatrix); + cmd.DrawMesh(mesh, transform.localToWorldMatrix, material, SubMeshIndex); + + //cmd.RequestAsyncReadback(buffer, (r) => + //{ + // var datas = r.GetData(); + // datas.Sort(); + // var indices = new int[datas.Length * 3]; + // sortedIndes[dirIndex] = indices; + // int ind = 0; + // for (int i = 0; i < datas.Length; i++) + // { + // var data = datas[i]; + // indices[ind++] = (int)data.a; + // indices[ind++] = (int)data.b; + // indices[ind++] = (int)data.c; + // } + //}); + Graphics.ExecuteCommandBuffer(cmd); + PrimitiveDepth[] datas = new PrimitiveDepth[buffer.count]; + buffer.GetData(datas); + Array.Sort(datas); + var indices = new int[datas.Length * 3]; + sortedIndes[dirIndex] = new MeshIndices() + { + Indices = indices + }; + int ind = 0; + for (int i = 0; i < datas.Length; i++) + { + var data = datas[i]; + indices[ind++] = (int)data.a; + indices[ind++] = (int)data.b; + indices[ind++] = (int)data.c; + } + CommandBufferPool.Release(cmd); + } + + + [ContextMenu("Sort")] + private void SortTriangles() + { + Material material = new Material(Shader.Find("OIT/TrianglesIdDepth")); + Camera renderCamera = new GameObject().AddComponent(); + + Bounds bounds = GetComponent().bounds; + float radius = bounds.extents.magnitude; + for (int i = 0; i < mesh.subMeshCount; i++) + { + meshIndicesCnt += mesh.GetIndexCount(i); + } + if (SubMeshIndex >= mesh.subMeshCount) + { + Debug.LogError($"SubMeshIndex > SubMeshCount :{SubMeshIndex} > {mesh.subMeshCount}"); + return; + } + var subMeshDesc = mesh.GetSubMesh(SubMeshIndex); + indexStart = subMeshDesc.indexStart; + ComputeBuffer buffer = new ComputeBuffer(subMeshDesc.indexCount / 3, Marshal.SizeOf(), ComputeBufferType.Structured); + + for (int i = 0; i < 12; i++) + { + var dir = viewDirections[i]; + SetupCamera(renderCamera, dir, radius); + RenderCamera(renderCamera, material, buffer, i); + } + Graphics.ClearRandomWriteTargets(); + buffer.Dispose(); + GameObject.DestroyImmediate(material); + GameObject.DestroyImmediate(renderCamera.gameObject); + isSorted = true; + } +#endif +} diff --git a/Assets/Scripts/Features/OIT/SortTriangles/SortTrianglesOIT.cs.meta b/Assets/Scripts/Features/OIT/SortTriangles/SortTrianglesOIT.cs.meta new file mode 100644 index 0000000..1389b11 --- /dev/null +++ b/Assets/Scripts/Features/OIT/SortTriangles/SortTrianglesOIT.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1dbacbfb9faa3fa4695d441929e67e91 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Features/OIT/SortTriangles/TrianglesIdDepth.shader b/Assets/Scripts/Features/OIT/SortTriangles/TrianglesIdDepth.shader new file mode 100644 index 0000000..8472551 --- /dev/null +++ b/Assets/Scripts/Features/OIT/SortTriangles/TrianglesIdDepth.shader @@ -0,0 +1,96 @@ +Shader "OIT/TrianglesIdDepth" +{ + SubShader + { + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma geometry geom + + #pragma target 5.0 + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + }; + + struct VSOut + { + float4 position : POSITION; + uint index : TEXCOORD; + }; + + struct GSOut + { + float4 position : SV_POSITION; + }; + + VSOut vert(appdata v, uint index : SV_VertexID) + { + VSOut o; + o.position = UnityObjectToClipPos(v.vertex); + o.index = index; + return o; + } + + struct PrimitiveDepth + { + float depth; + uint a; + uint b; + uint c; + }; + + RWStructuredBuffer primitiveBuffer : register(u1); + + [maxvertexcount(3)] + void geom(triangle VSOut IN[3], uint primID : SV_PrimitiveID, inout TriangleStream triStream) + { + PrimitiveDepth o; + o.depth = (IN[0].position.z + IN[1].position.z + IN[2].position.z) / 3; + o.a = IN[0].index; + o.b = IN[1].index; + o.c = IN[2].index; + // if (o.a > o.b) + // { + // uint tmp = o.b; + // o.b = o.a; + // o.a = tmp; + // } + // + // if (o.a > o.c) + // { + // uint tmp = o.c; + // o.c = o.a; + // o.a = tmp; + // } + // + // if (o.b > o.c) + // { + // uint tmp = o.b; + // o.b = o.c; + // o.c = tmp; + // } + primitiveBuffer[primID] = o; + + for (int i = 0; i < 3; ++i) + { + GSOut gso; + gso.position = IN[i].position; + triStream.Append(gso); + } + } + + fixed4 frag(GSOut i) : SV_Target + { + return 0; + } + ENDCG + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Features/OIT/SortTriangles/TrianglesIdDepth.shader.meta b/Assets/Scripts/Features/OIT/SortTriangles/TrianglesIdDepth.shader.meta new file mode 100644 index 0000000..32a8c13 --- /dev/null +++ b/Assets/Scripts/Features/OIT/SortTriangles/TrianglesIdDepth.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9b976f2c513508d40a91777cee2414f2 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Settings/Mobile/Mobile_High_Renderer.asset b/Assets/Settings/Mobile/Mobile_High_Renderer.asset index 902b4d7..8ce3621 100644 --- a/Assets/Settings/Mobile/Mobile_High_Renderer.asset +++ b/Assets/Settings/Mobile/Mobile_High_Renderer.asset @@ -26,7 +26,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 2f83dd6eb48aa6848950f8a0f61a70de, type: 3} m_Name: LinkedListOITFeature m_EditorClassIdentifier: - m_Active: 1 + m_Active: 0 settings: RenderPassEvent: 500 ComputeShader: {fileID: 7200000, guid: eb30737736968d64e99cd6b7e2cc9efb, type: 3} @@ -137,7 +137,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 4854a869b24c78844a4c077509f99b4f, type: 3} m_Name: MOITFeature m_EditorClassIdentifier: - m_Active: 1 + m_Active: 0 settings: renderPassEvent: 450 settings: @@ -145,7 +145,6 @@ MonoBehaviour: momentPrecision: 32 trigonometric: 0 boundsType: 1 - onlyVisibleRenderers: 0 layerMask: serializedVersion: 2 m_Bits: 4294967295 @@ -153,7 +152,6 @@ MonoBehaviour: renderQueueMax: 3000 compositeMaterial: {fileID: 2100000, guid: f5b0014f90114064c8200b5c9ac93932, type: 2} sortBackToFront: 0 - debugMakeMOITTexGlobal: 0 biasSettings: Moments4Half: 0.00006 Moments4Single: 0.0000005 @@ -452,7 +450,7 @@ MonoBehaviour: failOperation: 0 zFailOperation: 0 m_ShadowTransparentReceive: 0 - m_RenderingMode: 2 + m_RenderingMode: 0 m_DepthPrimingMode: 2 m_CopyDepthMode: 1 m_AccurateGbufferNormals: 0 @@ -469,7 +467,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 791db3d002c63d1409813c72e53105ff, type: 3} m_Name: WBOITFeature m_EditorClassIdentifier: - m_Active: 1 + m_Active: 0 settings: RenderPassEvent: 400 FilterSettings: