纹理最初的目的就是使用一张图片来控制模型的外观。使用纹理映射技术可以把一张图黏在模型表面,逐纹素(名字和像素进行区分)地控制模型的颜色。
美术建模时候通常会在建模软件中利用纹理展开技术把纹理映射坐标存储在每个顶点上。纹理映射坐标定义了该顶点在纹理中对应的2D坐标。通常坐标使用一个二维变量(u,v)来表示,其中u是横向坐标,v是纵向坐标,因此纹理映射坐标也被称为uv坐标。
纹理大小可以是多种多样的,例如可以是256X256或者1024X1024,但顶点uv坐标范围通常都被归一化到[0,1]范围内。需要注意,纹理采样时使用的纹理坐标不一定是在[0,1]范围内,实际上这种不在[0,1]范围内的纹理坐标有时会非常有用。与之关系紧密的是纹理的平铺模式,它决定渲染引擎在遇到不在[0,1]范围内的纹理坐标时如何进行纹理采样。
unity使用的纹理空间通常只有一种坐标系,unity使用的纹理空间是符合OpenGL的传统的,也就是说原点位于纹理的左下角,如下图:
一、单张纹理
我们通常使用一张纹理来代替物体的漫反射颜色,本节在shader中使用单张纹理作为模拟颜色。
1.1实践
本节使用Blinn-Phong光照模型来计算光照。
1.首先定义纹理属性:
Properties {
_Color ("Color Tint", Color) = (1, 1, 1, 1)
_MainTex ("Main Tex", 2D) = "white" {}
_Specular ("Specular", Color) = (1, 1, 1, 1)
_Gloss ("Gloss", Range(8.0, 256)) = 20
}
2.然后声明pass的光照模式、指令、相应变量:
SubShader {
Pass {
Tags { "LightMode"="ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
fixed4 _Color;
sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _Specular;
float _Gloss;