add SortTrianglesOIT
This commit is contained in:
parent
4658e677d6
commit
7084bacb84
@ -5,7 +5,7 @@ ModelImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
materials:
|
||||
materialImportMode: 2
|
||||
materialImportMode: 0
|
||||
materialName: 0
|
||||
materialSearch: 1
|
||||
materialLocation: 1
|
||||
|
||||
@ -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: []
|
||||
|
||||
@ -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}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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");
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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<SortTrianglesOIT> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 574e17ad9180f924eb9f25d78d145483
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
231
Assets/Scripts/Features/OIT/SortTriangles/SortTrianglesOIT.cs
Normal file
231
Assets/Scripts/Features/OIT/SortTriangles/SortTrianglesOIT.cs
Normal file
@ -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<MeshFilter>().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<PrimitiveDepth>
|
||||
{
|
||||
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<PrimitiveDepth>();
|
||||
// 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<Camera>();
|
||||
|
||||
Bounds bounds = GetComponent<Renderer>().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<PrimitiveDepth>(), 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
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1dbacbfb9faa3fa4695d441929e67e91
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -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<PrimitiveDepth> primitiveBuffer : register(u1);
|
||||
|
||||
[maxvertexcount(3)]
|
||||
void geom(triangle VSOut IN[3], uint primID : SV_PrimitiveID, inout TriangleStream<GSOut> 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
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,9 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9b976f2c513508d40a91777cee2414f2
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures: []
|
||||
nonModifiableTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -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:
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user