《Unity Shader入门精要》自学笔记(四)第七章 基础纹理

第七章依次学习了单张纹理的映射、凹凸映射(法线纹理)、渐变纹理映射、遮罩纹理映射,一整章跟着敲下来,感觉自己对于纹理的理解也比之前更深入了

下面按小节进行总结,只会记录觉得重要的点,且不会对书上详细讲过的内容进行过多记录

 

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有效果,需要:

  1. 在pass块中声明该变量
	sampler2D _MainTex;
	float4 _MainTex_ST;
  1. 在顶点着色器中对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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值