一、基本概念
- 定义:纹理是为了控制模型的外观,使用的是纹理映射技术,逐纹素地控制模型的颜色(与像素 进行区分)。
- 方法:在建模时利用纹理展开技术把纹理映射坐标存储在每个顶点上,纹理映射坐标定义了该顶点在纹理中对应的2D坐标,用一个二维变量(u,v)来表示。
- 注意:纹理的大小可以多样,但是通过归一化后,UV坐标的范围都在[0,1]m内。
二、利用单张纹理
-
代码逻辑图 -
代码
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/Chapter7-SingleTexture2"
{
Properties
{
_Color ("Color Tint", Color) = (1,1,1,1)
//设置纹理
_MainTex ("Main Tex", 2D) = "white" {}
_Gloss ("Gloss", Range(8.0,256)) = 20
_Specular ("Specular", Color) = (1,1,1,1)
}
SubShader
{
Pass{
Tags { "LightingMode"="ForwardBase"}
CGPROGRAM
fixed4 _Color;
sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _Specular;
float _Gloss;
struct a2v{
float3 normal : NORMAL;
float4 vertex : POSITION;
//在模型阶段进行纹理采样
float3 texcoord : TEXCOORD0;
};
struct v2f{
float4 pos : POSITION;
float3 worldNormal : TEXCOORD0;
float 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 = TRANSFORM_TEX(v.texcoord,_MainTex);
return o;
}
fixed4 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(UnityWorldSpaceLightDir(i.worldPos));
fixed3 halfDir = normalize(viewDir+worldLightDir);
fixed3 specular = _LightColor0.rgb * _Specular.rgb + pow(max(0, dot(worldNormal , halfDir)) , _Gloss);
return fixed4(ambient + diffuse + specular,1.0);
}
ENDCG
}
}
FallBack "Diffuse"
}
三、纹理属性
1. Wrap Mode:决定了纹理坐标与物体表面纹理该如何对应
- 主要有两种模式,一种是重复,代表着如果纹理坐标大于1,那么后续坐标的整数部分会被丢弃,使得坐标一直在1以内,这样纹理不断重复。
- 还有一种是填充模式,如果纹理坐标大于1,那么后续纹理坐标就会为1位置时的纹素值。
2. Filter Mode:决定了当纹理由于变换时而产生拉伸时将会采用哪种滤波模式:
- Point模式使用了最近邻滤波,在放大或缩小时,他的采样像素数目通常只有一个,因此图像会看起来有一种像素的风格。
- Mipmap :在介绍三线性插值前,必须提到的就是Mipmap了,Mipmap也叫做多级渐变纹理技术,用于观察者/相机距离物体不同距离时为了更准确的表示纹理颜色所提出来的。远处的纹理被压缩后再进行插值会得到明显的锯齿(颜色过度不均),于是提出根据距离远近,将原始纹理进行压缩,再在该位置对应的纹理上进行插值。
- Bilinear和Trilinear模式表示了双线性插值和三线性插值。双线性插值表示会在该坐标周围的四个像素里进行插值得到该坐标实际的颜色值。三线性插值表示除了在周围的四个像素里进行插值外,还会结合Mip对应的信息进行插值,最后得到该坐标实际的颜色值。
四、凹凸映射
1.定义:使用一张纹理在不改变模型顶点位置的前提下,通过修改纹理表面的法线使得模型表面看起来凹凸不平。主要方法有高度映射和法线映射两种。
2.高度映射:
定义:也就是利用一张高度图实现凹凸映射,高度图中存储的是强度值,其中颜色越深表示物体表面越向外凸起,颜色越浅表示物体表面越向内凹陷。
优点:可以明确知道物体表面凹凸的情况
缺点:计算更复杂,实时性不足
3.法线映射
定义:
|