This commit is contained in:
DCFApixels 2025-03-05 09:44:27 +08:00
parent 414ead5134
commit 76574124ca
15 changed files with 176 additions and 328 deletions

View File

@ -46,7 +46,7 @@ namespace DCFApixels
#region Mesh //TODO потестить
[IN(LINE)]
public DrawHandler Mesh<TMat>(Mesh mesh, Vector3 position, Quaternion rotation, Vector3 size)
where TMat : struct, IStaticMaterial
where TMat : struct, IStaticMaterial_InstancedProcedural
{
return Gizmo(new MeshGizmo<TMat>(mesh, position, rotation, size));
}
@ -81,7 +81,7 @@ namespace DCFApixels
}
}
private readonly struct MeshGizmo<TMat> : IGizmo<MeshGizmo<TMat>>
where TMat : struct, IStaticMaterial
where TMat : struct, IStaticMaterial_InstancedProcedural
{
public readonly Mesh Mesh;
public readonly Quaternion Rotation;
@ -116,7 +116,7 @@ namespace DCFApixels
[IN(LINE)]
public DrawHandler Mesh<TMesh, TMat>(Vector3 position, Quaternion rotation, Vector3 size)
where TMesh : struct, IStaticMesh
where TMat : struct, IStaticMaterial
where TMat : struct, IStaticMaterial_InstancedProcedural
{
return Gizmo(new InstancingMeshGizmo<TMesh, TMat>(position, rotation, size));
}
@ -153,7 +153,7 @@ namespace DCFApixels
}
private readonly struct InstancingMeshGizmo<TMesh, TMat> : IGizmo<InstancingMeshGizmo<TMesh, TMat>>
where TMesh : struct, IStaticMesh
where TMat : struct, IStaticMaterial
where TMat : struct, IStaticMaterial_InstancedProcedural
{
public readonly Quaternion Rotation;
public readonly Vector3 Position;
@ -184,17 +184,17 @@ namespace DCFApixels
#region Line
[IN(LINE)]
public DrawHandler Line<TMat>(Vector3 start, Vector3 end)
where TMat : struct, IStaticMaterial
where TMat : struct, IStaticMaterial_InstancedProcedural
{
return Gizmo(new WireLineGizmo<TMat>(start, end));
}
[IN(LINE)]
public DrawHandler Line(Vector3 start, Vector3 end)
{
return Gizmo(new WireLineGizmo<LineMat>(start, end));
return Gizmo(new WireLineGizmo<UnlitMat>(start, end));
}
private readonly struct WireLineGizmo<TMat> : IGizmo<WireLineGizmo<TMat>>
where TMat : struct, IStaticMaterial
where TMat : struct, IStaticMaterial_InstancedProcedural
{
public readonly Vector3 Start;
public readonly Vector3 End;
@ -256,7 +256,7 @@ namespace DCFApixels
}
}
private readonly IStaticMaterial _material;
private readonly IStaticMaterial_InstancedProcedural _material;
private int _buffersLength = 0;
private PinnedArray<Matrix4x4> _matrices;
@ -271,7 +271,7 @@ namespace DCFApixels
public virtual int ExecuteOrder => _material.GetExecuteOrder();
public virtual bool IsStaticRender => true;
public MeshRendererBase(IStaticMaterial material)
public MeshRendererBase(IStaticMaterial_InstancedProcedural material)
{
_materialPropertyBlock = new MaterialPropertyBlock();
_material = material;
@ -316,7 +316,7 @@ namespace DCFApixels
}
public void Render(CommandBuffer cb)
{
Material material = _material.GetMaterial_SupportCumputeShaders();
Material material = _material.GetMaterial_InstancedProcedural();
var items = new GizmosList<UnmanagedGizmoData>(_gizmos.Array, _prepareCount).As<GizmoData>().Items;
_materialPropertyBlock.Clear();
_jobHandle.Complete();
@ -340,44 +340,46 @@ namespace DCFApixels
public readonly Vector3 Position;
public readonly Vector3 Size;
}
private struct DrawData
{
public Matrix4x4 Matrix;
public Color Color;
}
private struct PrepareJob : IJobParallelFor
{
[NativeDisableUnsafePtrRestriction]
public Gizmo<GizmoData>* Items;
[NativeDisableUnsafePtrRestriction]
public Matrix4x4* ResultMatrices;
[NativeDisableUnsafePtrRestriction]
public Vector4* ResultColors;
public DrawData* ResultData;
public void Execute(int index)
{
ref readonly var item = ref Items[index];
//if (item.IsSwaped == 0) { return; }
ResultMatrices[index] = Matrix4x4.TRS(item.Value.Position, item.Value.Rotation, item.Value.Size);
ResultColors[index] = item.Color;
(ResultData + index)->Matrix = Matrix4x4.TRS(item.Value.Position, item.Value.Rotation, item.Value.Size);
(ResultData + index)->Color = item.Color;
}
}
private readonly IStaticMesh _mesh;
private readonly IStaticMaterial _material;
private readonly IStaticMaterial_InstancedProcedural _material;
private readonly MaterialPropertyBlock _materialPropertyBlock;
private GraphicsBuffer _graphicsBuffer;
private int _buffersLength = 0;
private PinnedArray<Matrix4x4> _matrices;
private PinnedArray<Vector4> _colors;
private PinnedArray<DrawData> _drawDatas;
private PinnedArray<Gizmo<GizmoData>> _gizmos;
private JobHandle _jobHandle;
private int _prepareCount = 0;
public InstancingMeshRendererBase(IStaticMesh mesh, IStaticMaterial material)
private readonly bool _enableInstancing;
public InstancingMeshRendererBase(IStaticMesh mesh, IStaticMaterial_InstancedProcedural material)
{
_mesh = mesh;
_material = material;
_materialPropertyBlock = new MaterialPropertyBlock();
_matrices = PinnedArray<Matrix4x4>.Pin(DummyArray<Matrix4x4>.Get());
_colors = PinnedArray<Vector4>.Pin(DummyArray<Vector4>.Get());
_drawDatas = PinnedArray<DrawData>.Pin(DummyArray<DrawData>.Get());
_enableInstancing = IsSupportsComputeShaders && _material.GetMaterial_InstancedProcedural().enableInstancing;
}
public virtual int ExecuteOrder => _material.GetExecuteOrder();
public virtual bool IsStaticRender => true;
@ -390,10 +392,10 @@ namespace DCFApixels
if (_buffersLength < count)
{
_matrices.Dispose();
_colors.Dispose();
_matrices = PinnedArray<Matrix4x4>.Pin(new Matrix4x4[DebugXUtility.NextPow2(count)]);
_colors = PinnedArray<Vector4>.Pin(new Vector4[DebugXUtility.NextPow2(count)]);
int capacity = DebugXUtility.NextPow2(count);
_drawDatas.Dispose();
_drawDatas = PinnedArray<DrawData>.Pin(new DrawData[capacity]);
AllocateGraphicsBuffer(capacity);
_buffersLength = count;
}
if (ReferenceEquals(_gizmos.Array, items) == false)
@ -408,31 +410,39 @@ namespace DCFApixels
var job = new PrepareJob
{
Items = _gizmos.Ptr,
ResultMatrices = _matrices.Ptr,
ResultColors = _colors.Ptr,
ResultData = _drawDatas.Ptr,
};
_jobHandle = job.Schedule(count, 64);
}
protected void Render(CommandBuffer cb)
{
Material material = _material.GetMaterial_SupportCumputeShaders();
Mesh mesh = _mesh.GetMesh();
_materialPropertyBlock.Clear();
_jobHandle.Complete();
if (IsSupportsComputeShaders)
if (_enableInstancing)
{
_materialPropertyBlock.SetVectorArray(ColorPropertyID, _colors.Array);
cb.DrawMeshInstanced(mesh, 0, material, -1, _matrices.Array, _prepareCount, _materialPropertyBlock);
Material material = _material.GetMaterial_InstancedProcedural();
_jobHandle.Complete();
_graphicsBuffer.SetData(_drawDatas.Array);
cb.DrawMeshInstancedProcedural(mesh, 0, material, -1, _prepareCount, _materialPropertyBlock);
}
else
{
Material material = _material.GetMaterial();
_jobHandle.Complete();
for (int i = 0; i < _prepareCount; i++)
{
_materialPropertyBlock.SetColor(ColorPropertyID, _colors.Ptr[i]);
cb.DrawMesh(mesh, _matrices.Ptr[i], material, 0, -1, _materialPropertyBlock);
_materialPropertyBlock.SetColor(ColorPropertyID, _drawDatas.Ptr[i].Color);
cb.DrawMesh(mesh, _drawDatas.Ptr[i].Matrix, material, 0, -1, _materialPropertyBlock);
}
}
}
private readonly static int _BufferPropertyID = Shader.PropertyToID("_DataBuffer");
private void AllocateGraphicsBuffer(int capacity)
{
_graphicsBuffer?.Dispose();
_materialPropertyBlock.Clear();
_graphicsBuffer = new GraphicsBuffer(GraphicsBuffer.Target.Structured, capacity, Marshal.SizeOf<DrawData>());
_materialPropertyBlock.SetBuffer(_BufferPropertyID, _graphicsBuffer);
}
}
#endregion
@ -469,7 +479,7 @@ namespace DCFApixels
}
}
private readonly IStaticMesh _mesh = default(WireLineMesh);
private readonly IStaticMaterial _material;
private readonly IStaticMaterial_InstancedProcedural _material;
private readonly MaterialPropertyBlock _materialPropertyBlock;
private GraphicsBuffer _graphicsBuffer;
@ -480,11 +490,14 @@ namespace DCFApixels
private JobHandle _jobHandle;
private int _prepareCount = 0;
public WireLineRendererBase(IStaticMaterial material)
private readonly bool _enableInstancing;
public WireLineRendererBase(IStaticMaterial_InstancedProcedural material)
{
_material = material;
_materialPropertyBlock = new MaterialPropertyBlock();
_drawDatas = PinnedArray<DrawData>.Pin(DummyArray<DrawData>.Get());
_enableInstancing = IsSupportsComputeShaders && _material.GetMaterial_InstancedProcedural().enableInstancing;
}
public virtual int ExecuteOrder => _material.GetExecuteOrder();
public virtual bool IsStaticRender => true;
@ -516,22 +529,19 @@ namespace DCFApixels
};
_jobHandle = job.Schedule(count, 64);
}
private readonly static int _BufferPropertyID = Shader.PropertyToID("_DataBuffer");
public void Render(CommandBuffer cb)
{
Mesh mesh = _mesh.GetMesh();
if (IsSupportsComputeShaders)
if (_enableInstancing)
{
Material material = _material.GetMaterial_SupportCumputeShaders();
Material material = _material.GetMaterial_InstancedProcedural();
_jobHandle.Complete();
_graphicsBuffer.SetData(_drawDatas.Array);
cb.DrawMeshInstancedProcedural(mesh, 0, material, -1, _prepareCount, _materialPropertyBlock);
}
else
{
Material material = _material.GetMaterial_Default();
Material material = _material.GetMaterial();
_jobHandle.Complete();
for (int i = 0; i < _prepareCount; i++)
{
@ -540,6 +550,7 @@ namespace DCFApixels
}
}
}
private readonly static int _BufferPropertyID = Shader.PropertyToID("_DataBuffer");
private void AllocateGraphicsBuffer(int capacity)
{
_graphicsBuffer?.Dispose();

View File

@ -202,7 +202,7 @@ namespace DCFApixels
public void Render(Camera camera, GizmosList<WidthLineGizmo> list, CommandBuffer cb)
{
if (camera == null) { return; }
default(UnlitOverwriteMat).GetMaterial_SupportCumputeShaders().SetPass(0);
default(UnlitOverwriteMat).GetMaterial_InstancedProcedural().SetPass(0);
GL.Begin(GL.QUADS);
Vector3 cameraPosition = camera.transform.position;
foreach (ref readonly var item in list)
@ -256,7 +256,7 @@ namespace DCFApixels
public void Render(Camera camera, GizmosList<WidthOutLineGizmo> list, CommandBuffer cb)
{
if (camera == null) { return; }
default(UnlitOverwriteMat).GetMaterial_SupportCumputeShaders().SetPass(0);
default(UnlitOverwriteMat).GetMaterial_InstancedProcedural().SetPass(0);
GL.Begin(GL.LINES);
var cameraPosition = camera.transform.position;
foreach (ref readonly var item in list)
@ -318,7 +318,7 @@ namespace DCFApixels
{
if (camera == null) { return; }
GL.PushMatrix();
default(UnlitOverwriteMat).GetMaterial_SupportCumputeShaders().SetPass(0);
default(UnlitOverwriteMat).GetMaterial_InstancedProcedural().SetPass(0);
GL.Begin(GL.LINES);
var cameraPosition = camera.transform.position;
foreach (ref readonly var item in list)

View File

@ -8,13 +8,13 @@ Material:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Line
m_Shader: {fileID: 4800000, guid: 4dc765b931552b54b957905b156bae66, type: 3}
m_Shader: {fileID: 4800000, guid: 37036939f3d0a824c82a3f34093d4a42, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_EnableInstancingVariants: 1
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
@ -24,7 +24,10 @@ Material:
serializedVersion: 3
m_TexEnvs: []
m_Ints: []
m_Floats: []
m_Colors: []
m_Floats:
- _FakeLight: 0
- _VertexColor: 0
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1

View File

@ -24,7 +24,8 @@ Material:
m_Shader: {fileID: 4800000, guid: 37036939f3d0a824c82a3f34093d4a42, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_ValidKeywords:
- _VERTEXCOLOR_ON
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 1
@ -110,6 +111,7 @@ Material:
- _DstBlend: 0
- _DstBlendAlpha: 0
- _EnvironmentReflections: 1
- _FakeLight: 0
- _GlossMapScale: 0
- _Glossiness: 0
- _GlossyReflections: 0
@ -124,6 +126,7 @@ Material:
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Surface: 0
- _VertexColor: 1
- _WorkflowMode: 1
- _ZWrite: 1
m_Colors:

View File

@ -1,135 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &-8282512757102464268
MonoBehaviour:
m_ObjectHideFlags: 11
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
m_Name:
m_EditorClassIdentifier:
version: 9
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: UnlitOverwrite
m_Shader: {fileID: 4800000, guid: 7bfe6625bfb0167438e98aa0d69e97e7, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 1
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses:
- MOTIONVECTORS
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BaseMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_Lightmaps:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_LightmapsInd:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_ShadowMasks:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _AddPrecomputedVelocity: 0
- _AlphaClip: 0
- _AlphaToMask: 0
- _Blend: 0
- _BlendModePreserveSpecular: 1
- _BumpScale: 1
- _ClearCoatMask: 0
- _ClearCoatSmoothness: 0
- _Cull: 2
- _Cutoff: 0.5
- _DetailAlbedoMapScale: 1
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _DstBlendAlpha: 0
- _EnvironmentReflections: 1
- _GlossMapScale: 0
- _Glossiness: 0
- _GlossyReflections: 0
- _Metallic: 0
- _OcclusionStrength: 1
- _Parallax: 0.005
- _QueueOffset: 0
- _ReceiveShadows: 1
- _Smoothness: 0.5
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Surface: 0
- _WorkflowMode: 1
- _ZWrite: 1
m_Colors:
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: e3db4ecf82b06ef4fa7fdb30e68362fa
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -199,7 +199,7 @@ Transform:
m_GameObject: {fileID: 817216530089604692}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: -5, y: 0, z: 0}
m_LocalPosition: {x: -5, y: -2.5, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []

View File

@ -45,7 +45,6 @@ Shader "DCFApixels/DebugX/Handles Buillboard"
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
float4 worldOrigin = mul(UNITY_MATRIX_M, float4(0, 0, 0, 1));
float4 viewOrigin = float4(UnityObjectToViewPos(float3(0, 0, 0)), 1);
float4 worldPos = mul(UNITY_MATRIX_M, v.vertex);
@ -56,7 +55,6 @@ Shader "DCFApixels/DebugX/Handles Buillboard"
o.vertex = clipsPos;
//o.vertex = UnityObjectToClipPos(v.vertex);
o.color = v.color * UNITY_ACCESS_INSTANCED_PROP(Props, _Color) * _DebugX_GlobalColor;
return o;
}

View File

@ -50,7 +50,6 @@ Shader "DCFApixels/DebugX/Handles Dot"
distance = lerp(distance, 1, isOrthographic);
float fov = radians(UNITY_MATRIX_P[1][1] * 2.0);
float scale = distance * (1 / fov) * 0.015;
return scale * _DebugX_GlobalDotSize;
@ -68,7 +67,6 @@ Shader "DCFApixels/DebugX/Handles Dot"
M._m22 *= scaleMultiplier;
float4 worldOrigin = mul(M, float4(0, 0, 0, 1));
float4 viewOrigin = float4(UnityObjectToViewPos(float3(0, 0, 0)), 1);
float4 worldPos = mul(M, v.vertex);
@ -77,9 +75,8 @@ Shader "DCFApixels/DebugX/Handles Dot"
float4 clipsPos = mul(UNITY_MATRIX_P, viewPos);
o.vertex = clipsPos;
//o.vertex = UnityObjectToClipPos(v.vertex);
o.color = v.color * UNITY_ACCESS_INSTANCED_PROP(Props, _Color) * _DebugX_GlobalColor;
o.color = v.color * UNITY_ACCESS_INSTANCED_PROP(Props, _Color) * _DebugX_GlobalColor;
return o;
}
ENDCG

View File

@ -1,73 +0,0 @@
Shader "DCFApixels/DebugX/Handles Line"
{
SubShader
{
Tags { "Queue"="Transparent" "RenderType"="Transparent" "IgnoreProjector"="True" "ForceNoShadowCasting"="True" }
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off
Fog { Mode Off }
Lighting Off
Offset -1, -1
ZTest On
CGINCLUDE
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_instancing
#include "UnityCG.cginc"
struct InstanceData
{
float4x4 m;
float4 color;
};
struct appdata_t
{
float4 vertex : POSITION;
};
struct v2f
{
float4 vertex : SV_POSITION;
half4 color : COLOR;
};
StructuredBuffer<InstanceData> _DataBuffer;
float4 _DebugX_GlobalColor;
v2f vert (appdata_t v, uint instanceID : SV_InstanceID)
{
v2f o;
InstanceData data = _DataBuffer[instanceID];
float4 pos = mul(data.m, v.vertex);
o.vertex = UnityObjectToClipPos(pos);
o.color = data.color * _DebugX_GlobalColor;
return o;
}
ENDCG
Pass
{
ZTest LEqual
CGPROGRAM
half4 frag (v2f i) : SV_Target
{
return i.color;
}
ENDCG
}
Pass
{
ZTest Greater
CGPROGRAM
half4 frag (v2f i) : SV_Target
{
return i.color * half4(1, 1, 1, 0.1);
}
ENDCG
}
}
}

View File

@ -1,9 +0,0 @@
fileFormatVersion: 2
guid: 4dc765b931552b54b957905b156bae66
ShaderImporter:
externalObjects: {}
defaultTextures: []
nonModifiableTextures: []
userData:
assetBundleName:
assetBundleVariant:

View File

@ -3,6 +3,9 @@ Shader "DCFApixels/DebugX/Handles Unlit"
Properties
{
_Color ("Color", Color) = (1,1,1,1)
[Toggle] _VertexColor("Vertex Color", Float) = 0
[Toggle] _FakeLight("Fake Light", Float) = 0
[Toggle] _OnePass("One Pass", Float) = 0
}
SubShader
{
@ -19,12 +22,57 @@ Shader "DCFApixels/DebugX/Handles Unlit"
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_instancing
#pragma shader_feature_local _VERTEXCOLOR_ON
#pragma shader_feature_local _FAKELIGHT_ON
#pragma shader_feature_local _ONEPASS_ON
#pragma instancing_options procedural:setup
#include "UnityCG.cginc"
#ifdef UNITY_PROCEDURAL_INSTANCING_ENABLED
struct InstanceData
{
float4x4 m;
float4 color;
};
StructuredBuffer<InstanceData> _DataBuffer;
#endif
void setup()
{
#ifdef UNITY_PROCEDURAL_INSTANCING_ENABLED
InstanceData data = _DataBuffer[unity_InstanceID];
float4x4 m = data.m;
float rotation = m.w * m.w * _Time.y * 0.5f;
rotate2D(m.xz, rotation);
unity_ObjectToWorld._11_21_31_41 = float4(m.w, 0, 0, 0);
unity_ObjectToWorld._12_22_32_42 = float4(0, m.w, 0, 0);
unity_ObjectToWorld._13_23_33_43 = float4(0, 0, m.w, 0);
unity_ObjectToWorld._14_24_34_44 = float4(m.xyz, 1);
unity_WorldToObject = unity_ObjectToWorld;
unity_WorldToObject._14_24_34 *= -1;
unity_WorldToObject._11_22_33 = 1.0f / unity_WorldToObject._11_22_33;
_Color = data.color;
#endif
}
struct appdata_t
{
float4 vertex : POSITION;
#if _FAKELIGHT_ON
float3 normal : NORMAL;
#endif
#if _VERTEXCOLOR_ON
float4 color : COLOR;
#endif
uint instanceID : SV_InstanceID;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
@ -34,18 +82,28 @@ Shader "DCFApixels/DebugX/Handles Unlit"
half4 color : COLOR;
};
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_DEFINE_INSTANCED_PROP(float4, _Color)
UNITY_INSTANCING_BUFFER_END(Props)
float4 _Color;
float4 _DebugX_GlobalColor;
v2f vert (appdata_t v)
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
#ifdef UNITY_PROCEDURAL_INSTANCING_ENABLED
InstanceData data = _DataBuffer[v.instanceID];
float4 pos = mul(data.m, v.vertex);
o.vertex = UnityObjectToClipPos(pos);
half4 color = data.color;
#else
o.vertex = UnityObjectToClipPos(v.vertex);
o.color = v.color * UNITY_ACCESS_INSTANCED_PROP(Props, _Color) * _DebugX_GlobalColor;
half4 color = _Color;
#endif
#if _VERTEXCOLOR_ON
color *= v.color;
#endif
o.color = color * _DebugX_GlobalColor;
return o;
}
ENDCG
@ -60,6 +118,7 @@ Shader "DCFApixels/DebugX/Handles Unlit"
}
ENDCG
}
Pass
{
ZTest Greater

View File

@ -43,12 +43,17 @@ namespace DCFApixels.DebugXCore
public readonly struct MaterialsList
{
public readonly Material Lit;
//public readonly Material Lit_InstancedProcedural;
public readonly Material Unlit;
public readonly Material Line;
//public readonly Material Unlit_InstancedProcedural;
public readonly Material UnlitOverwrite;
//public readonly Material UnlitOverwrite_InstancedProcedural;
public readonly Material Billboard;
//public readonly Material Billboard_InstancedProcedural;
public readonly Material Dot;
//public readonly Material Dot_InstancedProcedural;
public readonly Material Wire;
//public readonly Material Wire_InstancedProcedural;
internal readonly Material TextBackground;
}

View File

@ -5,8 +5,11 @@ namespace DCFApixels.DebugXCore
public interface IStaticMaterial : IStaticData
{
int GetExecuteOrder();
Material GetMaterial_SupportCumputeShaders();
Material GetMaterial_Default();
Material GetMaterial();
}
public interface IStaticMaterial_InstancedProcedural : IStaticMaterial
{
Material GetMaterial_InstancedProcedural();
}
public interface IStaticMesh : IStaticData
{
@ -16,53 +19,47 @@ namespace DCFApixels.DebugXCore
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public readonly struct LitMat : IStaticMaterial
public readonly struct LitMat : IStaticMaterial_InstancedProcedural
{
public int GetExecuteOrder() => 0;
public Material GetMaterial_SupportCumputeShaders() => DebugXAssets.Materials.Lit;
public Material GetMaterial_Default() => DebugXAssets.Materials.Lit;
public Material GetMaterial_InstancedProcedural() => DebugXAssets.Materials.Lit;
public Material GetMaterial() => DebugXAssets.Materials.Lit;
}
public readonly struct UnlitMat : IStaticMaterial
public readonly struct UnlitMat : IStaticMaterial_InstancedProcedural
{
public int GetExecuteOrder() => 100_000;
public Material GetMaterial_SupportCumputeShaders() => DebugXAssets.Materials.Unlit;
public Material GetMaterial_Default() => DebugXAssets.Materials.Unlit;
public Material GetMaterial_InstancedProcedural() => DebugXAssets.Materials.Unlit;
public Material GetMaterial() => DebugXAssets.Materials.Unlit;
}
public readonly struct LineMat : IStaticMaterial
{
public int GetExecuteOrder() => 100_000;
public Material GetMaterial_SupportCumputeShaders() => DebugXAssets.Materials.Line;
public Material GetMaterial_Default() => DebugXAssets.Materials.Unlit;
}
public readonly struct BillboardMat : IStaticMaterial
public readonly struct BillboardMat : IStaticMaterial_InstancedProcedural
{
public int GetExecuteOrder() => 200_000;
public Material GetMaterial_SupportCumputeShaders() => DebugXAssets.Materials.Billboard;
public Material GetMaterial_Default() => DebugXAssets.Materials.Billboard;
public Material GetMaterial_InstancedProcedural() => DebugXAssets.Materials.Billboard;
public Material GetMaterial() => DebugXAssets.Materials.Billboard;
}
public readonly struct DotMat : IStaticMaterial
public readonly struct DotMat : IStaticMaterial_InstancedProcedural
{
public int GetExecuteOrder() => 300_000;
public Material GetMaterial_SupportCumputeShaders() => DebugXAssets.Materials.Dot;
public Material GetMaterial_Default() => DebugXAssets.Materials.Dot;
public Material GetMaterial_InstancedProcedural() => DebugXAssets.Materials.Dot;
public Material GetMaterial() => DebugXAssets.Materials.Dot;
}
public readonly struct GeometryUnlitMat : IStaticMaterial
public readonly struct GeometryUnlitMat : IStaticMaterial_InstancedProcedural
{
public int GetExecuteOrder() => 1_000_000;
public Material GetMaterial_SupportCumputeShaders() => DebugXAssets.Materials.Unlit;
public Material GetMaterial_Default() => DebugXAssets.Materials.Unlit;
public Material GetMaterial_InstancedProcedural() => DebugXAssets.Materials.Unlit;
public Material GetMaterial() => DebugXAssets.Materials.Unlit;
}
public readonly struct UnlitOverwriteMat : IStaticMaterial
public readonly struct UnlitOverwriteMat : IStaticMaterial_InstancedProcedural
{
public int GetExecuteOrder() => 1_000_000;
public Material GetMaterial_SupportCumputeShaders() => DebugXAssets.Materials.UnlitOverwrite;
public Material GetMaterial_Default() => DebugXAssets.Materials.UnlitOverwrite;
public Material GetMaterial_InstancedProcedural() => DebugXAssets.Materials.UnlitOverwrite;
public Material GetMaterial() => DebugXAssets.Materials.UnlitOverwrite;
}
public readonly struct WireMat : IStaticMaterial
public readonly struct WireMat : IStaticMaterial_InstancedProcedural
{
public int GetExecuteOrder() => 1_000_000;
public Material GetMaterial_SupportCumputeShaders() => DebugXAssets.Materials.Wire;
public Material GetMaterial_Default() => DebugXAssets.Materials.Wire;
public Material GetMaterial_InstancedProcedural() => DebugXAssets.Materials.Wire;
public Material GetMaterial() => DebugXAssets.Materials.Wire;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////