Texture3D和TextureArray以及为什么Terrain要用TextureArray

前言

再一次感叹国内网上资料是真的匮乏,很多概念在网上都找不到相关的中文解释,就比如说Unity中的Texture2DArray网上只有一些所谓的使用方法,却没有人解释它到底是个什么东西,原理是什么,为什么要用它。在知乎看到了一个问题为什么要强调Texture2DArray在地形上的应用?打开看回答也是一头雾水,什么Bind啊,什么不同Layer之间Blend啊,所以我要在这里整理一下这些最近学到的新概念。

TextureArray

按照字面意思理解,Texture Array就是纹理数组,为什么纹理要用数组来存储呢?这里就要提到“绑定(bind)”这个概念。我理解(理解很可能有误或者是不准确的地方,希望大佬指正)的是旧的图形API由于GPU的硬件特性不能同时处理很多Texture,而是有一个叫做Texture slot(纹理单元?)的东西,GPU每次都是根据slot来处理纹理数据,所以如果想要采样一个纹理,需要给纹理绑定一个纹理单元,而这个绑定过程是耗时的,尤其是当你对于一个物体想要采样多张纹理时,那么这就是一个不可忽视的性能消耗,所以就产生了Texture Array这个概念。
Unity官方对Texture Array的解释是“They are useful for implementing custon terrain rendering systems or other special effects where you need an efficient way of accessing many textures of the same size and format”,也就是说这个纹理数组中的所有single texture都要是同样的格式同样的尺寸,这样就可以把它们当作一个整体来看待,只需要bind一次就可以对这些纹理进行采样,就好像在普通的2d纹理基础上加上了厚度,也就是层(slice)的概念,但是它还是2d纹理,和3d纹理的区别我后续会说。

Texture3D

Texture3D首先和TextureArray一样比普通Texture2D多了一个维度,但是Unity中的它只能由程序生成(3D Texture can only be created from script)。所以它通常用于表示体数据或者是Shader的查找表(3D Texture are commoly used as lookup tables by shader, or to represent volumtric data)。它和TextureArray不同之处是它的厚度是连续的,而不是数组那样一层一层的,所以在mipmap时它的z轴也会被处理,相反TextureArray的slice就不会减少,只会和普通Texture2D一样mip UV上的数据,所以Texture3Dt不会被用于Terrain Texture。

为什么Terrain要用TextureArray

这就要说到TetureArray的特性了,一个是上面提到的只需要绑定一次,另一个就是不同Layer之间的Blend。为了理解这个特性我们需要直到一个概念叫做"Texture Splatting"。国内我们找到很好的解释这个概念的文章,所以给大家分享两篇国外的文章,Texture Splatting in Direct3DAdvanced Terrain Texture Splatting。大概的意思就是说,Texture Splatting就是把多个Texture混合的技术,比如默认最底层是不透明的泥土层
泥土
我们想在上面加点大家都喜欢的绿色
小草
我们总不能直接覆盖吧,所以需要使用alphamap来帮助混合
hahaha
这个过程要注意顺序,泥土要在最下层,否则就会覆盖绿色了。
地形纹理经常会用到这个技术,而这个技术又涉及到采样多张纹理,混合多张纹理,所以使用TextureArray作为地形纹理数据可以大大提升效率。

Texture2DArray实战

写了个小demo来试着使用以下新学的东西。使用了7张纯色纹理来创建纹理数组。
no描述</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值