DOTS支持的shader

最近项目需要用到DOTS的技术,发现除了程序部分需要做代码调整外,Shader的编写也需要进行一些调整,不然运行的时候会出些各种奇怪的现象,比如不显示模型,模型位置错乱等等。

由于也在慢慢摸索,可能有部分写的不对的地方,请各位大佬指教。。。

支持DOTS的Shader分为带骨骼的SkinnedMeshedRender和普通的MeshedRender,普通的MeshedRender实现的方式和普通的GPUInstancing类似,注意是必须增加Instance。

增加变体:

#pragma multi_compile _ DOTS_INSTANCING_ON
#pragma target 4.5

 顶点着色器输入结构体增加:

#if UNITY_ANY_INSTANCING_ENABLED
uint instanceID : INSTANCEID_SEMANTIC;
#endif

顶点着色器输出结构体增加:

#if UNITY_ANY_INSTANCING_ENABLED
uint instanceID : CUSTOM_INSTANCE_ID;
#endif

顶点着色器:

#if UNITY_ANY_INSTANCING_ENABLED
o.instanceID = v.instanceID;
#endif

对于蒙皮对象的Shader,需要另外处理:

 //Properties加入相关
            [HideInInspector]_ComputeMeshIndex("Compute Mesh Buffer Index Offset", Float) = 0
            
            //加入变体
            //DOTS
            #pragma multi_compile _ DOTS_INSTANCING_ON
            #pragma target 4.5
            
            //加入方法和结构//Dots
            #if defined(UNITY_DOTS_INSTANCING_ENABLED)
                // DOTS instancing definitions
                UNITY_DOTS_INSTANCING_START(MaterialPropertyMetadata)
                UNITY_DOTS_INSTANCED_PROP(float, _ComputeMeshIndex)
                UNITY_DOTS_INSTANCING_END(MaterialPropertyMetadata)
                // DOTS instancing usage macros
                // This_macro_cannot_be_called_without_UNITY_DOTS_INSTANCING_ENABLED
                #define _ComputeMeshIndex UNITY_ACCESS_DOTS_INSTANCED_PROP_FROM_MACRO(float, Metadata__ComputeMeshIndex)
            #endif

            // Object and Global properties

            // Graph Functions
            
            struct DeformedVertexData
            {
                float3 Position;
                float3 Normal;
                float3 Tangent;
            };
            uniform StructuredBuffer<DeformedVertexData> _DeformedMeshData : register(t1);

            void Unity_ComputeDeformedVertex_float(uint vertexID, out float3 positionOut, out float3 normalOut, out float3 tangentOut)
            {
                const DeformedVertexData vertexData = _DeformedMeshData[asuint(_ComputeMeshIndex) + vertexID];
                positionOut = vertexData.Position;
                normalOut = vertexData.Normal;
                tangentOut = vertexData.Tangent;
            }
            
               
               //Attributes中加入
                 //DOTS
           uint vertexID : SV_VertexID;
                ///
                
                //Varyings中加入
                //dots
                #if defined(UNITY_DOTS_INSTANCING_ENABLED)
                    float3 SkinnedPosition = 0;
                    float3 SkinnedNormal = 0;
                    float3 SkinnedTangent = 0;
                    Unity_ComputeDeformedVertex_float(v.vertexID, SkinnedPosition, SkinnedNormal, SkinnedTangent);
                #else
                    float3 SkinnedPosition = v.positionOS.xyz;
                    float3 SkinnedNormal = v.normalOS;
                    float3 SkinnedTangent = v.tangentOS.xyz;
                #endif
                v.positionOS = float4(SkinnedPosition,v.positionOS.z);
                v.normalOS = SkinnedNormal;
                v.tangentOS = float4(SkinnedTangent , v.tangentOS.z);
                ///

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity DOTS(DOTS: Data-Oriented Technology Stack)是Unity的一种数据导向技术堆栈,它旨在提高游戏性能和可扩展性。它基于实体组件系统(Entity-Component-System,ECS)的概念,其中游戏对象被拆分为实体(Entity)和组件(Component),并通过系统(System)进行处理。 在Unity DOTS中,可以使用实体组件系统来管理和处理游戏对象。通过将游戏对象转换为实体和组件的形式,可以实现高效的数据处理和并行计算。例如,在创建实体时,可以使用GameObjectConversionUtility.ConvertGameObjectHierarchy函数将GameObject转换为Entity,并使用IConvertGameObjectToEntity接口进行自定义转换。然后,可以使用系统(System)对实体和组件进行处理,例如旋转方块事件。 Unity DOTS的优势包括更高的性能,更好的可扩展性和更方便的并行计算。通过采用数据导向的设计,可以减少内存访问和数据处理的开销,从而提高游戏的帧率和响应性。 总而言之,Unity DOTS是一种数据导向的技术堆栈,通过实体组件系统和并行计算来提高游戏性能和可扩展性。它可以通过转换游戏对象为实体和组件的形式,并使用系统进行处理来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Unity的Dots技术入门](https://blog.csdn.net/m0_37920739/article/details/108181541)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Unity DOTS简明教程](https://blog.csdn.net/mango9126/article/details/105219215)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值