如何在Unity中使用纹理数组

“阵列纹理是地图集的替代方法,因为它们可以存储对象的多层纹理数据,而不会带来一些地图集问题。” — OpenGL Wiki

注意:本教程目前仅适用于正向着色模式

Texture2DArray是相同大小图像的集合,您可以使用3个纹理坐标(u,v,w)进行采样,其中w对应于纹理数组的索引或层。 这样就无需为不同的对象切换纹理,从而极大地改善了我们的渲染性能,并且还可以将具有不同纹理的网格组合在一起。

我一直在Minecraft类型的地形中使用它,该类型的每种块类型使用不同的纹理。 主要优点之一是可以使用纹理包装mip映射 。 在我的游戏中,这意味着我可以轻松实现贪婪的网格划分。

注意:您将必须实现向网格添加第三个纹理坐标。

遗憾的是,Unity不支持在编辑器中创建纹理数组,因此我们必须在代码中进行。 以下是使用普通Texture2D数组创建Texture2DArray的示例。

注意 :所有纹理必须具有相同的宽度和高度

  public Texture2D [] normalTextures; 
public GameObject objectToAddTextureTo; private void CreateTextureArray()
{
//创建Texture2DArray
Texture2DArray texture2DArray =新
Texture2DArray(ordinaryTextures [0] .width,
commonTextures [0] .height,normalTextures.Length,
TextureFormat.RGBA32,true,false); //应用设置
texture2DArray.filterMode = FilterMode.Bilinear;
texture2DArray.wrapMode = TextureWrapMode.Repeat; //遍历普通纹理并将像素复制到
// Texture2DArray
为(int i = 0; i <normalTextures.Length; i ++)
{
texture2DArray.SetPixels(ordinaryTextures [i] .GetPixels(0),
i,0);
} //应用我们的更改
texture2DArray.Apply(); //将纹理设置为材质
objectToAddTextureTo.GetComponent ()
.sharedMaterial.SetTexture(“ _ MainTex”,texture2DArray);
}

它只是循环遍历提供的普通Texture2D数组,并将其像素数据添加到适当的图层。

这是相当复杂的,但是如果您按照以下步骤操作,它将可以解决! 如果行号不对齐,请告诉我,我会解决。

  1. 转到Unity下载档案并下载“内置着色器”。

2.重命名以下文件并将其复制到您的项目中。 我只是在名称的末尾添加了“数组”。
例如,从’UnityStandardCore.cginc’到’UnityStandardCoreArray.cginc’

  • CGIncludes / UnityStandardCore.cginc
  • CGIncludes / UnityStandardCoreForward.cginc
  • CGIncludes / UnityStadardInput.cginc
  • DefaultResourcesExtra / Standard.shader

3.打开“ StandardArray.shader”:

 第3行:着色器“ StandardArray”第8行:8:将表示“ 2D”的“ _MainTex”声明更改为“ 2DArray”第93行:#include“ UnityStandardCoreForwardArray.cginc” 

4.打开“ UnityStandardCoreForwardArray.cginc”

 第19行更改为:#include“ UnityStandardCoreArray.cginc” 

5.打开“ UnityStandardInputArray.cginc”

 第25行:UNITY_DECLARE_TEX2DARRAY(_MainTex);第61行(float2至float3):float3 uv0:TEXCOORD0;第75行(添加行):texcoord.xy = TRANSFORM_TEX(v.uv0.xy,_MainTex); 
texcoord.z = v.uv0.z;
  • 它说要采样_MainTex的任何地方都更改为’UNITY_SAMPLE_TEX2DARRAY(_MainTex,uv)’
  • 每个“ float2 uv”更改为“ float3 uv”

6.打开“ UnityStandardCoreArray”

 第10行:#include“ UnityStandardInputArray.cginc”第251行:一半alpha = Alpha(i_tex.xyz); 

而已!

现在在Unity中,您应该能够选择“ StandardArray”作为材质的一部分的着色器。

由于它取决于您使用Texture2DArrays的方式,因此您必须自己将Mesh UV本身从Vector2更改为Vector3。 “ z”组件将仅对应于Texture2DArray层。

如果您需要帮助,请在评论中让我知道,我会尽力帮助您!