框架
文章目录
- 框架
- 开头
- 属性
- 书写格式
- `SubShader`
- `Tags`
- `LOD`
- `Pass`
- 顶点着色器,片元着色器
- 变量
- 定义的函数
- POSITION 、 SV_POSITION 表示语义
- 完整案例
开头
unity自带的框架,用于创建
Shader "ShaderLab学习/Shader01"
属性
属性,这里是暴露给外部交互的属性,可以是图片,颜色,数值等等
Properties
{
}
书写格式
shader中类比c++,书写格式会有所不一样
c++
color _Color = ragb(1.0,1.0,1.0,1.0);//颜色
而shader中格式为:
属性名(“属性说明”,属性类型) = 属性默认值
_Color("颜色",color) = (1.0,1.0,1.0,1.0)
当然,也有一些特殊的写法
滑块条
_Amount("法线扩张程度",Range(-1,1))=0.0
Range是float类型以范围的方式用滑块条表现的特殊形式
_Light("亮度",Range(0,1)) = 1.0
SubShader
Tags
渲染标记,此处是将渲染的物体标记为不透明物体
Tags { "RenderType"="Opaque" }
LOD
Pass
一个pass表示一次渲染的过程,一个subshader中可以有多个pass
顶点着色器,片元着色器
这两个函数是没有默认函数的,哪怕最简单的函数也需要自己写一个
用于处理每一个片元和每一个顶点
//表示开始shader代码编程
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
变量
如果在属性中写了属性值,需要在这里定义同名的变量才能在Shader中使用
但是如果为私有变量,可以直接在这里定义,而不需要在属性中定义
fixed4 _Color;
half _Light;
定义的函数
POSITION 、 SV_POSITION 表示语义
POSITION 表示模型空间顶点位置
SV_POSITION 表示投影空间的顶点位置
下方顶尖函数的意思是:传入一个模型空间的函数,转出一个投影空间的函数
片元函数的为:颜色乘亮度值
float4 vert (float4 v:POSITION):SV_POSITION
{
//直接调用Unity提供的函数转换到投影空间
return UnityObjectToClipPos(v);
}
//指定的片元着色器
//SV_Target 表示最后输出的颜色
fixed4 frag () : SV_Target
{
return _Color * _Light;
}
这个shader的效果为颜色的变化跟着亮度走
完整案例
Shader "ShaderLab学习/Shader01"
{
//属性,这里是暴露给外部交互的属性,可以是图片,颜色,数值等等
Properties
{
//类比C++中定义变量的格式
//color _Color = ragb(1.0,1.0,1.0,1.0);//颜色
//属性定义的方式
//属性名("属性说明",属性类型) = 属性默认值
_Color("颜色",color) = (1.0,1.0,1.0,1.0)
//Range是float类型以范围的方式用滑块条表现的特殊形式
_Light("亮度",Range(0,1)) = 1.0
}
SubShader
{
//渲染标记,此处是将渲染的物体标记为不透明物体
Tags { "RenderType"="Opaque" }
LOD 100
//UnityShaderLab中LOD的作用
//
//UnityShader学习参考
//https://www.zhihu.com/column/c_1545188441411055618
//一个pass表示一次渲染的过程,一个subshader中可以有多个pass
Pass
{
//表示开始shader代码编程
CGPROGRAM
//指定顶点着色器函数 vert
#pragma vertex vert
//指定片元着色器函数 frag
#pragma fragment frag
//如果在属性中写了属性值,需要在这里定义同名的变量才能在Shader中使用
fixed4 _Color;
half _Light;
/*
fixed half float 都表示浮点数
float 单精度浮点数
half 表示的是半精度浮点数
fixed 定点数
浮点数后面跟数字表示有多少个浮点数
float 一个浮点数
float2 表示两个浮点数 也可以表示二维向量 float2 a; a.x a.y 分别访问对应float
float3x3 可以人为是二维数组也可以是矩阵
*/
//指定的顶点着色器函数
//POSITION 、 SV_POSITION 表示语义
//POSITION 表示模型空间顶点位置
//SV_POSITION 表示投影空间的顶点位置
float4 vert (float4 v:POSITION):SV_POSITION
{
//直接调用Unity提供的函数转换到投影空间
return UnityObjectToClipPos(v);
}
//指定的片元着色器
//SV_Target 表示最后输出的颜色
fixed4 frag () : SV_Target
{
return _Color * _Light;
}
ENDCG
}
}
}