Unity Shader Example 26 (Texture2DArray)

来源:互联网 发布:趴在桌上睡觉知乎 编辑:程序博客网 时间:2024/06/05 09:38
Shader "Unlit/Test"{Properties    {        _texArr ("Tex", 2DArray) = "" {}    }    SubShader    {        Pass        {            CGPROGRAM            #pragma vertex vert            #pragma fragment frag            // to use texture arrays we need to target DX10/OpenGLES3 which            // is shader model 3.5 minimum            #pragma target 3.5                        #include "UnityCG.cginc"struct appdata_t {float4 vertex : POSITION;float2 texcoord : TEXCOORD0;float4 texcoord3 : TEXCOORD2;};            struct v2f            {                float3 uv : TEXCOORD0;                float4 vertex : SV_POSITION;//float4 texcoord3 : TEXCOORD2;            };UNITY_DECLARE_TEX2DARRAY(_texArr);            v2f vert (appdata_t v)            {                v2f o;                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);o.uv.xy = v.texcoord;// 动态使用                o.uv.z = v.texcoord3.x;                return o;            }                                    half4 frag (v2f i) : SV_Target            {                return UNITY_SAMPLE_TEX2DARRAY(_texArr, i.uv);            }            ENDCG        }    }}


Shader "Test-Multi"{Properties{// must add_MainTex_Arr ("_MainTex_Arr", 2DArray) = "" {}_RegionTex_Arr ("_RegionTex_Arr", 2DArray) = "" {}_LightTex_Arr ("_LightTex_Arr", 2DArray) = "" {}_MaskTex_Arr ("_MaskTex_Arr", 2DArray) = "" {}_AlphaMul ("AlphaMul", float) = 1}SubShader{Tags {"Queue"="Transparent""RenderType"="Transparent"}Blend SrcAlpha OneMinusSrcAlphaZWrite OnPass{CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma target 3.5#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;float2 uv3 : TEXCOORD2;};struct v2f{float4 vertex : SV_POSITION;float3 uv : TEXCOORD0;};UNITY_DECLARE_TEX2DARRAY(_MainTex_Arr);uniform float4 _MainTex_ST_Arr[10];UNITY_DECLARE_TEX2DARRAY(_RegionTex_Arr);uniform float4 _RegionTex_ST_Arr[10];uniform fixed4 _RedRegionCol_Arr[10];uniform fixed4 _GreenRegionCol_Arr[10];uniform fixed4 _BlueRegionCol_Arr[10];uniform half _RedRegionIntensity_Arr[10];uniform half _GreenRegionIntensity_Arr[10];uniform half _BlueRegionIntensity_Arr[10];UNITY_DECLARE_TEX2DARRAY(_LightTex_Arr);uniform float4 _LightTex_ST_Arr[10];UNITY_DECLARE_TEX2DARRAY(_MaskTex_Arr);uniform float _uSpeed_Arr[10];uniform float _vSpeed_Arr[10];            uniform float _AlphaMul;uniform float4 _LightColor_Arr[10];uniform float _LightColorBrightness_Arr[10];v2f vert (appdata v){v2f o;o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);o.uv.xy = v.uv.xy;o.uv.z = v.uv3.x;return o;}fixed4 frag (v2f i) : SV_Target{float index = ceil(i.uv.z);fixed2 uv = i.uv.xy;float3 mainUv = float3(uv * _MainTex_ST_Arr[index].xy + _MainTex_ST_Arr[index].zw, index);fixed4 baseCol = UNITY_SAMPLE_TEX2DARRAY(_MainTex_Arr, mainUv);float3 regionUv = float3(uv * _RegionTex_ST_Arr[index].xy + _RegionTex_ST_Arr[index].zw, index);fixed4 adjCol = UNITY_SAMPLE_TEX2DARRAY(_RegionTex_Arr, regionUv);float4 redRegionCol = _RedRegionCol_Arr[index];float4 greenRegionCol = _GreenRegionCol_Arr[index];float4 blueRegionCol = _BlueRegionCol_Arr[index];float redRegionIntensity = _RedRegionIntensity_Arr[index];float greenRegionIntensity = _GreenRegionIntensity_Arr[index];float blueRegionIntensity = _BlueRegionIntensity_Arr[index];float3 tempCol = adjCol.r * redRegionCol.rgb * redRegionIntensity + adjCol.g * greenRegionCol.rgb * greenRegionIntensity+ adjCol.b * blueRegionCol.rgb * blueRegionIntensity+ adjCol.a * fixed3(1,1,1);fixed3 finishCol = baseCol.rgb * tempCol;fixed4 maskCol = UNITY_SAMPLE_TEX2DARRAY(_MaskTex_Arr, mainUv);float3 uvLight = float3(i.uv.xy * _LightTex_ST_Arr[index].xy + _LightTex_ST_Arr[index].zw, index );fixed4 lightCol = UNITY_SAMPLE_TEX2DARRAY(_LightTex_Arr, uvLight);lightCol.rgb *= maskCol.rgb * lightCol.a * _LightColorBrightness_Arr[index] * 2.0f * _LightColor_Arr[index].rgb;finishCol += lightCol.rgb;baseCol.a = baseCol.a * _AlphaMul;return fixed4( finishCol, baseCol.a);}ENDCG}}}


以上是Shader使用Texture2DArray,注意的就是,float index = ceil(i.uv.z);,因为i.uv在fs会插值,所以,index作为数组的索引的时候,需要变为整数。




构造Texture2DArray:


Texture2DArray CreateTexture2DArray(List<Texture2D> texList)    {        Texture2DArray tex2DArr = null;        if (texList.Count > 0)        {            tex2DArr = new Texture2DArray(texList[0].width, texList[0].height, texList.Count, texList[0].format, false, true);            for (int i = 0; i < texList.Count; i++)            {                Texture2D txt = texList[i];                Graphics.CopyTexture(txt, 0, 0, tex2DArr, i, 0);            }        }        return tex2DArr;    }



修改Mesh的信息:


for (int meshIndex = 0; meshIndex < srcMeshs.Count; meshIndex++)        {            SkinnedMeshRenderer smr = srcMeshs[meshIndex];            for (int sub = 0; sub < smr.sharedMesh.subMeshCount; sub++)            {                CombineInstance ci = new CombineInstance();                ci.mesh = Mesh.Instantiate(smr.sharedMesh);                if (ci.mesh.uv3.Length == 0)                {                    Vector2[] uv3 = new Vector2[ci.mesh.uv.Length];                    for (int i = 0; i < uv3.Length; i++)                    {                        uv3[i].x = subComs.Count;                    }                    ci.mesh.uv3 = uv3;                }                ci.subMeshIndex = sub;                subComs.Add(ci);                CollectBonesInfo(bones, smr, allBones);            }        }


0 0
原创粉丝点击