Shader的笔记
Shader
1.Shader(着色器)
最终目的在于生成或者是渲染一张二维纹理。
2渲染的流水线
应用阶段:把数据加载到显存;设置渲染状态;调用Draw Call。
3.GPU的流水线
顶点着色器:完全可编程的,实现顶点的空间变换、顶点着色等功能。
曲面细分着色器:可选的,用于细分图元。
几何着色器:可选,用于执行逐图元的着色操作,或者产生更多的图元。
裁剪:可配置的,将不在摄像机视野内的顶点裁剪掉,剔除某些三角图元的面片。
屏幕映射:不可配置和编程的,把图元的坐标转换到屏幕坐标系中。
三角设置与三角遍历:固定函数。
片元着色器:完全可编程的,实现逐片元的着色操作。
逐片元操作:不可编程,具有很高的可配置性,可以实现如修改颜色、深度缓冲、进行混合。
4.屏幕坐标系
5.减少Draw Call的开销
避免使用大量很小的网格。不可避免时,尽量想办法合并。
避免使用过多的材质。尽量不同的网格使用同一个材质。
6.固定渲染管线(固定函数的流水线)
7.Unity Shader模板
Standard Surface Shader:包含了标准光照模型的表面着色器模板。
Unlit Shader:产生一个不包含光照(包含雾效)的基本顶点/片元着色器
Image Effect Shader:实现各种屏幕的后处理效果
Compute Shader:产生一种特殊的Shader文件,利用GPU的并行来进行一些与常规渲染流水线无关的计算。
8.Shader的结构
1.Shader “Custom/MyShader”{ }
那么这个Unity Shader在材质面板的位置为:Shader->Custom->MyShader
2.属性:属性将会出现在材质面板上
定义:_属性名(“显示的名称”,类型)=默认值
Properties{
_Range(“Range”,Range(0.0,5.0))=3.0
}
3.SubShader(这种语义是因为不同的显卡具有不同的能力)
文件中可以包含多个SubShader语义块,但最少要有一个。
Unity加载Shader时会去扫描所有的SubShader语义块,选择第一个能执行的SubShader,都不支持,Unity就会使用Fallback语义指定的Unity Shader
定义:
SubShader{
[Tags] //标签(可选的)
[RenderSetup] //状态(可选的)
//这样设置标签和状态将会使用到所有Pass中
Pass{
//Pass的数目过多,会影响渲染的性能
}
}
状态设置:
注:如果不希望状态应用于所有的Pass中,可以将状态设置在单个的Pass中。
标签:键值对(都为字符串类型)
定义:Tags{“标签名1”=”值1” “标签名2”=”值2”}
Tags{“RenderType”=”Opaque”}
注:这些标签不能定义在Pass中。
Pass语义块:
Pass{
[Name]
[Tags]
[RenderType]
//其他代码
}
9.顶点/片元着色器
Shader “MyShader”{
SubShader{
Pass{
CGPROGRAM
#pragma Vertex vert
#pragma fragment frag
float4 vert(float4 v:POSITION) :SV_POSITION{
return UnityObjectToClipPos(v);
}
fixed4 frag() : SV_Target{
return fixed4(1.0,1.0,1.0,1.0);
}
ENDCG
}
}
}
编译指令表示:
#pragma vertex 函数名 //顶点着色器
#pragma fragment 函数名 //片元着色器
自定义结构体:
struct 结构体名称{
类型 变量名:语义;
类型 变量名:语义;
};
顶点着色器是逐顶点调用的,片元着色器是逐片元调用的。
10.属性的使用
11.内置的包含文件(以.cginc结尾,使用时用#include指令将它包含进来)
在官方网站(http://unity3d.com/cn/get-unity/download/archive)上选择下载->内置着色器
Unity的应用程序中直接找CGIncludes,Unity的安装路径/Data/CGIncludes
CGIncludes:包含所有的内置包含文件
DefaultResources:包含了一些内置组件或功能所需的Unity Shader
DefaultResourcesExtra:包含了所有Unity中内置的Unity Shader
Editor:用于定义Unity引入的Standard所用的材质面板
12.语义
13.光的渲染
散射:只改变光线的方向,不改变光线的密度和颜色。
吸收:只改变光线的密度和颜色,不改变光线的方向。
高光反射部分:表示物体表面是如何反射光线的
漫反射部分:表示有多少光线会被折射、吸收和散射出表面。
BRDF光照模型:
自发光:用于描述当给定一个方向时,一个表面本身会向该方向发射多少辐射量。(注:当没有使用全局光照技术,这些自发光的表面并不会真的照亮周围的物体,而是它本身看起来更亮了而已。)
高光反射:用于描述当光线从光源照射到模型表面是,该表面会在完全镜面反射方向散射多少辐射量。
漫反射:用于描述当光线从光源照射到模型表面时,该表面会向每个方向散射多少辐射量。
环境光:用于描述其他所有的间接光照。