Shader "Unlit/defaultShader"
{
// 属性数据列表
Properties
{
// 变量名字("显示名字", 变量类型) = 默认值
// 这个变量在所有着色器里都能访问
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
// 绘制远近的物体,细节展示
LOD 100
// 渲染管线,每有一个Pass就会完整的绘制一次
Pass
{
CGPROGRAM // CG代码的开始
// 预编译:# (告诉编辑器:顶点Shader(#pragma vertex vert)、片元着色Shader(#pragma fragment frag)、几何Shader(#pragma geometry geome)等)
#pragma vertex vert
#pragma fragment frag
// 接口导入,Unity 封装的ShaderAPI(在引擎安装文件,Editor/Data/CGIncludes)
#include "UnityCG.cginc"
// Unity 定义了一些语义描述,来描述数据的标准
// POSITION: 存放模型坐标
// TEXCOORD0: 存放纹理坐标
// NORMAL: 存放法线坐标
struct appdata
{
float4 vertex : POSITION; // (顶点Shader开始的时候)模型顶点坐标
float2 uv : TEXCOORD0; // (顶点Shader开始的时候)纹理坐标
};
struct v2f
{
float2 uv : TEXCOORD0; // 由编程者自己定义
float4 vertex : SV_POSITION; // 由编程者自己定义
};
sampler2D _MainTex; // 2D纹理的第一种类型,变量名Properties定义的相同
float4 _MainTex_ST; // 2D纹理的第二种类型(Tiling(,), offset(,)), _MainTex_ST变量名是引擎写死的
// 顶点Shader
// 1、改变模型坐标 --> 改变形状
// 2、坐标变化 --> 观察者的角度来绘制物体
// 模型坐标 * 世界变化矩阵 * 摄像机变换矩阵 * 投影变换矩阵 --> 投影到一个平面的坐标
// appdata: Shader需要使用的来自渲染管线的数据
v2f vert (appdata v)
{
v2f o;
// 坐标空间的转换
o.vertex = UnityObjectToClipPos(v.vertex);
// 纹理坐标变换
//(tex.xy * name##_ST.xy + name##_ST.zw) => (v.uv.xy * _MainTex_ST.xy + _MainTex.zw)
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
// 返回数据给渲染管线,同时将顶点数据插值后给片元
return o;
}
// 着色的调用次数,通常情况下大于顶点调用次数
// 着色好后将颜色放到SV_Target
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
// 纹理采样
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
ENDCG // CG代码的结束
}
}
}
简单的Untiy Shader模板脚本(ShaderLab)
最新推荐文章于 2023-12-09 16:27:34 发布