第七章依次学习了单张纹理的映射、凹凸映射(法线纹理)、渐变纹理映射、遮罩纹理映射,一整章跟着敲下来,感觉自己对于纹理的理解也比之前更深入了
下面按小节进行总结,只会记录觉得重要的点,且不会对书上详细讲过的内容进行过多记录
7.1单张纹理
这一节主要讲了一个直接铺在物体表面的贴图会对颜色产生的影响,引入了纹理采样函数tex2D()、材质反射率albedo、纹理属性WrapMode以及tilling和offset
纹理采样函数:tex2D(sampler2D, float2)
作用:根据uv坐标(float2)获取纹理(sampler2D)上对应位置的颜色值
纹理属性WrapMode以及tilling和offset
WrapMode中选择repeat后纹理就有了tilling(缩放)和offset(平移)两个float2属性,它们被一起打包进了“纹理名_ST”的float4变量中
想让tilling和offset有效果,需要:
- 在pass块中声明该变量
sampler2D _MainTex;
float4 _MainTex_ST;
- 在顶点着色器中对uv进行变换(下面的代码二选一)
o.uv = v.uv.xy * _MainTex_ST.xy + _MainTex_ST.zw // 内部实现
o.uv = TRANSFORM_TEX(v.uv, _MainTex); // 封装函数
之后在片元着色器中调用tex2D()函数来获取颜色值就可以了
材质反射率albedo
其实就是把纹理上的颜色和自定义_Diffuse颜色相乘得到的颜色值
fixed3 albedo = tex2D(_MainTex, i.uv).rgb * _Diffuse.rgb;
fixed3 ambient = albedo * UNITY_LIGHTMODEL_AMBIENT.xyz;
fixed3 diffuse = albedo * _LightColor0.rgb * saturate(dot(worldNormal, worldLightDir));
它会影响到ambient和diffuse的效果,但不会影响specular的效果
就像用白光打在黑色地面上和打在红色地面上看到的效果不同一样
7.2 凹凸映射
这里感觉是这一章最难的地方了,主要是第一次接触到切线空间,以及需要自己构建变换矩阵的情况
因为不熟练,在写和法线纹理有关shader的时候有一个会偶尔突然卡住脑子,然后又突然惊醒的地方,就是:
嗯?我在干什么?我不是可以直接从a2v里获得NORMAL吗?我从法线纹理里采样的又是啥?喵喵喵?哦对…当然是…要对法线做修改才要用法线纹理啊傻孩子…
所以下面就啰嗦一点用“法线”和“新的法线”来区分,老年人记性不大好…
高度纹理和法线纹理的区别
高度纹理存储的是强度值(intensity),是相对高度,表示模型表面局部的海拔高度。它是一张灰度图,白高黑低
法线纹理存储的是法线方向,由于法线的分量范围是[-1, 1],像素分量范围是[0, 1],需要将法线映射到[0,1]
p i x e l pixel pixel = n o r m