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
- Unity Shader Example 26 (Texture2DArray)
- Unity Shader Example 1 : Texture
- Unity Shader Example 4 (扭曲)
- Unity Shader Example 7 (溶解)
- Unity Shader Example 17 (Skybox)
- Unity Shader Example 18 (Fresnel)
- Unity Shader Example 19 (fog)
- Unity Shader Example 27 (Noise)
- Unity Shader Example 5 (地形混合)
- Unity Shader Example 6 (区域变色)
- Unity Shader Example 8 (光照贴图)
- Unity Shader Example 9 (均值模糊)
- Unity Shader Example 10 (高斯模糊)
- Unity Shader Example 11 (模板测试)
- Unity Shader Example 12 (Bloom 高光)
- Unity Shader Example 13 (边缘 Bloom )
- Unity Shader Example 14 (平面切割图片 )
- Unity Shader Example 15 (Gerstner Wave)
- jsp使用servlet实现验证码
- 移动端 Tips插件代码
- Nginx的反向代理,负载均衡,缓存,URL重写以及读写分离
- 深入PHP面向对象、模式与实践——高级特性(5)
- HTML5之HTML+CSS3技术介绍
- Unity Shader Example 26 (Texture2DArray)
- 4种数据源
- L1-007. 念数字
- C++知识文档六_对象常量_静态成员_友元_抽象类
- linux注册字符设备和卸载字符设备函数
- Hadoop 2.7.2 最小集群搭建
- django 模型 models详解
- python操作Excel读写--使用xlrd
- Java Socket 简单的Client/Server程序