一、简介
- 着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立的程序,因为它们之间不能相互通信;它们之间唯一的沟通只有通过输入和输出。
- 在最简配置下,至少都得有两个着色器:一个叫顶点着色器(vertex shader),它将作用于每个顶点上;另一个叫片段着色器(fragment shader),它将作用于每一个采样点。我们采用4倍抗锯齿,因此每个像素有四个采样点。
- 如果我们打算从一个着色器向另一个着色器发送数据,我们必须在发送方着色器中声明一个输出,在接收方着色器中声明一个类似的输入。当类型和名字都一样的时候,OpenGL就会把两个变量链接到一起,它们之间就能发送数据了(这是在链接程序对象时完成的)。
二、代码
Shader "Unlit/NewUnlitShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM//Cg代码段标志, 与END组成一段cg逻辑
#pragma vertex vert//顶点着色器的函数vert
#pragma fragment frag//片段着色器的函数frag
// make fog work
//https://blog.csdn.net/yinfourever/article/details/103072057
#pragma multi_compile_fog//多重编译
#include "UnityCG.cginc"//引用库,unity提供的辅助函数
//网格数据
struct appdata
{
//网格的顶点数据
float4 vertex : POSITION;
//纹理空间中的多维坐标系,值为0-1,用以记录引入纹理的uv坐标
float2 uv : TEXCOORD0;
};
//顶点到片元结构体:用以存储从顶点函数输出和片元函数输入的数据,计算输出的顶点位置,
//自动绘制到屏幕上
//语义上的sv表示系统值(System vaule),SV_POSITION对应的是屏幕上的像素位置
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
//此处是cg语言使用的变量,必须与声明的属性名字一样,
sampler2D _MainTex;
float4 _MainTex_ST;
//顶点函数
v2f vert (appdata v)
{
v2f o;
//将网格顶点对象空间转换到屏幕剪裁平面
o.vertex = UnityObjectToClipPos(v.vertex);
//取到网格数据上的UV信息,网格平铺成二维与纹理一一对应,赋值给v2f结构体
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
//用UnityCG.cginc头文件中内置定义的宏处理雾效,从顶点着色器中输出雾效数据
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
//--------------------------------【片段着色函数】---------------------------
//输入:顶点输出结构体
//输出:float4型的像素颜色值
//---------------------------------------------------------------------------
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
//采样主纹理在对应坐标下的颜色值
fixed4 col = tex2D(_MainTex, i.uv);
// apply fog
//用UnityCG.cginc头文件中内置定义的宏启用雾效
UNITY_APPLY_FOG(i.fogCoord, col);
//返回最终的颜色值
return col;
}
ENDCG
}
}
}