//Shader 文件在选择面板以树状结构组织的
Shader "Hidden/NewImageEffectShader"
{
//这个申明程序中所需要的变量信息
Properties在这里插入代码片
{
//_MainTex 变量名 ; “Texture” 在Inspector面板上显示的名称 ; 2D 指变量类型
// "white" 变量默认值
_MainTex ("Texture", 2D) = "white" {}
}
// Shader 语法块,一个Shader程序至少有一个SubShader,系统在渲染时会依次调用,
// 直到找到匹配的SubShader,否则使用最后默认指定的Shader
SubShader//`在这里插入代码片`
{
// Cull Off:关闭剔除、 ZWrite : 要将像素的深度写入深度缓存中
// Test Always:将当前深度值与缓冲区颜色值的深度对比
Cull Off ZWrite Off ZTest Always
//渲染通道,固定写法
Pass
{
//Shader 代码段开始
CGPROGRAM
//顶点着色器函数编译指令
#pragma vertex vert
//片元着色器函数编译指令
#pragma fragment frag
//引用Unity内置的一些定义,头文件包含
#include "UnityCG.cginc"
//自定义结构体,作为顶点着色器函数的输入参数
struct appdata
{
//float4 4维向量、POSITION 语义,相当于告诉渲染引擎,这个变量是代表什么含义,一般是读取
//模型,材质传过来的顶点数据,在每一帧调用DrawCall的时候,模型的组件Mesh Render组件会把
//他负责的模型顶点数据传给shader
float4 vertex : POSITION;
//TEXCOORD0 纹理语义,初始的纹理坐标,比如模型展的uv
float2 uv : TEXCOORD0;
};
struct v2f//定义结构体v2f,作为顶点着色器输出参数
{
float2 uv : TEXCOORD0;//这个uv是经过计算后的纹理坐标,可能是投射到屏幕上的坐标,也可能是裁剪空间坐标,摄像机空间坐标等等
float4 vertex : SV_POSITION;//经过计算后的顶点数据(位置,缩放,偏移等),可能是投射到屏幕空间的数据,也可能是裁剪空间数据
};
//Vertex Shader 对应的入口
v2f vert (appdata v) //appdata v 作为参数,渲染引擎会把对应语义的信息传递进来,此处会传递顶点的位置信息和纹理信息
{
v2f o;//声明输出结构
//传递进来的顶点坐标是模型坐标系中的坐标值,需要经过矩阵转换车成屏幕坐标
//新的等价写法:o.vertex=UnityObjectToClipPos(v.vertex);
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.uv;
//将计算后的结果输出给渲染引擎,底层会根据具体的语义去做对应的处理
return o;
}
//在Properties 中定义的变量需要在此申明一下才能在程序中使用
sampler2D _MainTex;
//fragment Shader 对应的入口
fixed4 frag (v2f i) : SV_Target//还有一种写法是:COLOR
{
fixed4 col = tex2D(_MainTex, i.uv);
// just invert the colors
col = 1 - col;
return col;
}
ENDCG
}
}
//当上述的SubShader无法匹配硬件环境时,会调这个指定的默认Shader
Fallback "Mobile/VertexLit"
}
shader入门精要(笔记2)
最新推荐文章于 2024-07-03 17:28:40 发布