固定渲染管线
新建Image Effect Shader
Shader "Custom/text2"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Pass
{
SetTexture [_MainTex] { //设置贴图材质
combine Texture * Previous
}
}
}
}
此时cube上有贴图材质但并没有光照效果
添加代码 < Lighting On > 以打开光照,< Material >设置光照类型
Shader "Custom/text2"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Color ("Color",Color) = (1,1,1,1) //物体反射的颜色
}
SubShader
{
Lighting on
Material{
Diffuse [_Color] //漫反射
}
Pass
{
SetTexture [_MainTex] {
combine Texture * Previous
}
}
}
}
光照类型:
- 自发光(emissive)
这部分用于描述当给定一个方向时,模型表面会向该方向发射多少的辐射量。当没有使用全局光照时,这些自发光表面不会照亮周围物体,只是本身看起来更亮而已。
- 高光反射(specular)
这个部分用于描述当光线从光源照到模型表面时,模型镜面反射产生的光。
- 漫反射(diffuse)
这个部分用于描述当光线从光源照到模型表面时,模型向各个方向产生的光。
- 环境光(ambient)
这个部分用来描述其他间接的光。
可编程渲染管线
与固定渲染管线不同之处在于,可编程渲染管线可以在 CGPROGRAM ... ENDCG 间定义渲染逻辑
Shader "Costom/text3"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always
Pass
{
CGPROGRAM
#pragma vertex vert //vertex表示顶点,vert表示方法名称
#pragma fragment frag //fragment表示片段,frag表示方法名称
#include "UnityCG.cginc" //引用库文件
struct appdata //结构体类型,数据由meshrender传递
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert (appdata v) //顶点着色器执行的方法
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex); //把顶点位置坐标转换为相机坐标
o.uv = v.uv;
return o;
}
sampler2D _MainTex; //与Property中的_MainTex相同,在Property中声明变量,要在此处进行引用
fixed4 frag (v2f i) : SV_Target //片段着色器执行的方法
{
fixed4 col = tex2D(_MainTex, i.uv); //获取纹理中像素的值
// just invert the colors
col.rgb = 1 - col.rgb;
return col;
}
ENDCG
}
}
}
要访问不同的顶点数据,您需要自己声明顶点结构,或者将输入参数添加到顶点着色器。顶点数据由 Cg/HLSL 语义标识,并且必须来自 以下列表:
POSITION
是顶点位置,通常为float3
或float4
。NORMAL
是顶点法线,通常为float3
。TEXCOORD0
是第一个 UV 坐标,通常为float2
、float3
或float4
。TEXCOORD1
、TEXCOORD2
和TEXCOORD3
分别是第 2、第 3 和第 4 个 UV 坐标。TANGENT
是切线矢量(用于法线贴图),通常为float4
。COLOR
是每顶点颜色,通常为float4
。
先执行顶点着色器,再执行片段着色器