第五章 纹理贴图及相关技术

1、纹理、纹素和纹理管线。

2、凹凸贴图及改进

 

 

  1. 纹理、纹素和纹理管线。

简单来说,纹理(Texturing)是一种针对物体表面属性进行“建模”的高效技术。图像纹理中的像素通常被称为纹素(Texels),区别于屏幕上的像素。根据 Kershaw 的术语,通过将投影方程(projector function)运用于空间中的点 ,从而得到一组称为参数空间值(parameter-spacevalues)的关于纹理的数值。这个过程就称为贴图(Mapping,也称映射 ),也就是纹理贴(Texture Mapping,也称纹理映射 )这个词的由来。纹理贴图可以用一个通用的纹理管线来进行描述。

•  第一步。通过将投影方程(projector function)运用于空间中的点 ,从而得到一组称为参数空间值(parameter-space values)的关于纹理的数值。

•  第二步。在使用这些新值访问纹理之前,可以使用一个或者多个映射函数(corresponder function)将参数空间值(parameter-space values )转换到纹理空间。

•  第三步。使用这些纹理空间值(texture-space locations)从纹理中获取相应的值(obtain value)。例如,可以使用图像纹理的数组索引来检索像素值。

•  第四步。再使用值变换函数(value transform function)对检索结果进行值变换,最后使用得到的新值来改变表面属性,如材质或者着色法线等等。

 

物体点A的空间坐标(x,y,z) -> A的UV坐标(U,V) -> (U,V)*255(纹理的分辨率)->取像素位置的颜色值。

 

Unity中的纹理和纹素:sampler2D _MainTex          float4 _MainTex_ST。

我们使用纹理名_ST的方式来声明某个纹理的属性。ST是scale和translation的缩写。_MainTex_ST.xy存储的是缩放值,而_MainTex_ST.zw存储的是偏移值。

使用的时候先在顶点着色器中存储,再在片元着色器中进行纹理采样。

o.uv=TRANSFORM_TEX(v.texcoord,_MainTex);

TRANSFORM_TEX在UnityCG.cginc中的定义为:

#define TRANSFORM_TEX(tex,name)

(tex.xy*name##_ST.xy+name##_ST.zw)。

 

 

2、凹凸贴图及改进

 

主要介绍法线贴图和视差贴图:

法线贴图的原理:https://blog.csdn.net/damenhanter/article/details/22481563

Unity中的法线贴图shader:

从法线贴图中获取到的是这个采样点对应的法线方向,光滑的部分法线方向都为垂直于表面竖直向上的方向,也就是(0,0,1)的方向,而有凹凸的地方,法线就会有偏移值,换句话说,我们让法线贴图采样出来的方向越偏离(0,0,1)方向,就会越加强法线的效果。我们可以减小法线贴图的b值,但b通道越小,法线效果越强,不过这样不直观,换一种方式就是加强法线贴图的r,g值,给r,g通道乘以一个factor,换句话说可以直接乘以一个(factor,factor,1)向量,就达到了增强与减弱法线效果的目的。

 

 

视差贴图(Parallax Map

视差贴图是真正通过改变采样点纹理坐标达到让法线效果看起来更加真实并且可以增强法线效果的目的。简单画了一张示意图解释一下视差贴图的原理:

上面是一个用法线模拟的凹凸表面,红色为我们的视线方向,视线的方向(切线空间的viewDir)是从A指向B,指向相机方向。如果表面真的有凹凸的话,那么视线方向应该和B点相交,但是实际上表面是平的,真实的交点是A点。我们在纹理坐标的层面来看一下,以uv的u轴为例,视线方向xyz转化到切线空间后,正好对应纹理坐标系上的u,v,以及垂直表面的方向。所以,为了让采样点更准确,我们需要调整实际采样时使用的纹理坐标,也就是给一个偏移值,在进行采样MainTex和BumpTex的时候,都加上相应的偏移。那么问题又来了,我们怎么知道这个偏移是多少,怎么控制这个偏移呢?首先,我们的视线方向是一直在改变的,也就是说我们可能从各个方向看这个凸起来的部分,比如我们从右边看(如上图),那么就需要向右边偏移一些;如果从左边看,那么就需要向左偏移一些;如果垂直看表面,那就不需要偏移了。所以,我们正好可以让视线方向转化到切线空间,之后视线方向的x,y轴就是我们uv需要偏移的方向了,这也就是所谓的视差。第二个问题就是我们不知道这个面的高度是多少,最简单的一种方式就是直接给一张高度图,黑色表示不需要凸起,白色表示需要凸起,这样我们进行采样的时候先采这张高度图,就知道这个点对应的高度,也就变相地知道我们需要偏移多少了,凸起越高偏移越多,凸起越低偏移越少(视线方向一致的情况下)。有了这两点,剩下的就再增加一个系数,来控制我们偏移的强度。那么最终我们需要的采样偏移值就等于tanViewDir.xy / tanViewDir.z * height * parallaxScale。这里用tanViewDir.xy / tanViewDir.z,通过切平面垂直的z分量来调整xy方向(uv方向)偏移的大小,也就是说当我们视角越平,uv偏移越大;视角越垂直于表面,uv偏移值越小。

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值