Unity Shader 纹理贴图

标准光照模型 自发光emissive 环境光ambient 高光反射 specular 漫反射 diffuse

环境光Cambient = Gambient

自发光 标准光照模型使用材质的自发光颜色  全局光照自发光会影响周围物体

漫反射 再漫反射中视角是不重要的,反射是随机的,但是跟入射光线的角度很重要

Cdiffuse = Clight*Mdiffuse MAX (0,n.l) saturate 将截取到0 — 1范围

 

纹理映射技术可以把一张图粘到模型表面 逐纹理像素控制模型的颜色

把纹理映射坐标存储在每个顶点上,纹理映射坐标定义该顶点在纹理中对应的2d坐标 使用二维变量(u,v)表示 也被称为UV坐标 u保存纹理的横向坐标,v表示纹理的纵向坐标

纹理的大小可以是多种多样的 比如256x256 512x512 但顶点uv坐标的范围被归一化到[0,1]范围内   注意纹理采样时的纹理坐标比一定是在[0,1]范围内,跟纹理的平铺模式有关

Opengl 纹理圆点左下角  在directx纹理坐标的圆点左上角

还需要声明一个float4类型的变量 _MainTex_ST  名字必须使用纹理名+_ST的方式声明纹理的属性 ST是缩放和平移的缩写

可以让我们得到该纹理的缩放和平移值_MainTex_ST.xy存储的是缩放值 _MainTex_ST.zw存储的是偏移量

这些值可以再纹理属性中调节

struct a2v {float4 vertex:POSITION;float3 normal:NORMAL; float texcoord:TEXCOORD0第一组纹理数据;};

struct v2f  {float4 pos:SV_POSITION;float3 worldnormal:TEXCOORD0;float3 worldpos:TEXCOORD1;float2 uv:TEXCOORD2};

v2f  vert(a2v v)

{

v2f o;

o.pos = UnityObjectToClipPos(v.vertex);

o.worldnormal = UnityObjectToWorldNormal(v.normal);

o.worldpos = mul(unity_ObjectToWorld,v.vertex).xyz;

o.uv = v.texcoord.xy*_MainTex_ST.xy+_MainTex_ST.zw; // or  TRANSFORM_TEX(v.texcoord,_MainTex)

return o;

}

我们使用纹理的属性值_MainTex_ST来对顶点纹理坐标进行转换,得到最终的纹理坐标

filxed4 frag(v2f i):SV_Target

{

fixed3 worldnormal = normalize(i.worldnormal);

fixed3 worldlightdir = normalize(UnityWorldSpaceLightDir(i.worldpos));

fixed3 albedo = tex2D(_MainTex,i.uv).rgb*_Color.rgb;//对纹理进行采样操作

fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz*albedo//环境光

fixed3 diffuse = ——LightColor0.rgb*albedo*max(0,dot(worldnormal,worldlightdir))

fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldpos))

fixed3 halfdir = normalize(worldlightdir+viewdir)//BlinnPhong模型

fixed3 specular = _LightColor0.rgb*_Specular.rgb*pow(max(0,dot(worldnormal,halfdir)),_Gloss);

return fixed4(ambient+diffuse+specular,1.0)

}

FallBack”Specular”

tex2D第一参数表示要采样的纹理 第二个参数表示纹理坐标  返回计算后的纹理像素  在于Color相乘得到材质的反射率albedo

并与环境光相乘得到环境部分 随后我们使用albedo来计算漫反射光照的结果

 

纹理的最大尺寸和纹理模式 如果导入的纹理大小超过MaxTextureSize Unity将会把该纹理缩放到最大尺寸。通常情况下导入的纹理可以是非正方的 但长宽必须是2的幂,如果使用非2幂 NPOT 纹理往往会占用更多的内存空间,并且GPU读取该纹理的速度会下降,Unity内部会把它缩放成最近的2的幂大小

Format决定unity内部使用哪种格式来存储纹理,使用的纹理格式精度越高占用的内存空间越大,可以再导入面板的下方看到存储纹理需要占用的内存空间

凹凸映射 :目的使用一张纹理来修改模型表面的法线,不会改变模型的顶点位置 两种方法,1,使用一张高度纹理模拟表面位移,也叫高度映射,另一种方法是使用一张法线纹理直接存储表面法线,法线映射

法线纹理存储的表面的法线方向 方向的分量范围[-1,1],而像素分量为[0,1]映射关系为     像素 = (法线+1)/2

在Shader对法线纹理进行纹理采样后,需要对结果进行一次反映射过程 法线 = 像素*2 -1

如果模型空间的表面法线存储到一张纹理中 ,这种纹理被称为是模型空间的法线纹理

而在实际制作中,会采用另一种坐标空间 ,模型顶点的切线空间存储法线 这种纹理被称为切线空间的法线纹理

模型空间的法线纹理 :(0,1,0) 经过映射存储纹理对应RGB(0.5,1,0.5)浅绿色 (0,-1,0) 对应(0.5,0,0.5)紫色

切线空间的法线纹理:几乎都是浅蓝色的 纹理实际上存储的是每个点在各自的切线空间中的法线扰动方向 (0,0,1)对应(0.5,0.5,1)浅蓝色 蓝色说明大部分法线与模型法线是一样的

纹理图片要选择NormalMap类型 凹凸映射 NormalMap 还要勾选CreatfromGrayscale

渐变纹理:使用渐变纹理来控制漫反射光照结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值