Unity Shader学习 第五章 基本的Shader学习
Unity的场景是一个天空盒(skybox). 不是纯色的
#pragma vertex vert
#pragma fragment frag
告诉编译器 哪个函数是顶点着色器. 哪个函数是片元着色器
SV_POSITION 告诉顶点着色器. Unity输出 是裁剪空间中的顶点坐标.
SV_Target 屏幕输出
UNITY_MATRIX_MVP 内置的 模型-观察- 投影 矩阵
被替换成了: UnityObjectToClipPos
着色器数据从哪里来
- 使用结构体传参
- 如 a2v a表示Application 应用 v表示vertex 顶点着色器
顶点着色器和片元着色器的通信
定义如 v2f 这样的结构体.
在顶点着色器最后返回 return v2f类型的
函数的定义如下:
v2f vert(a2v i){
v2f o;
//...
return o;
}
fixed4 frag(v2f i){
return fixed4();
}
Unity的内置变量
https://blog.csdn.net/laverfever/article/details/23171155
头文件包含Unity内置
#include "UnityCG.cginc"
如何进行Shader调试?
方法1: 假彩色图. 假颜色生成一种图像.
用图像来可视化一些数据.
注意: 颜色的范围在 [0,1]
方法2: Graphics Debugger
纹理坐标差异
OpenGL 左下是 (0,0)
DirectX 左上是(0,0)
Shader代码整洁之道
float / half / fixed
数值类型有这三种.
- float 32位
- half 16位
- fixed 11位 精度范围 -2.0到2.0
避免没有必要的计算
不同的 shader Target / 不同的着色器阶段. 可使用的临时寄存器和指令数目都不同.
如:
#pragma target 2.0
#pragma target 3.0
…
所有的OpenGL被当成支持到Shader Model3.0
慎用分支和循环语句
GPU和CPU对于分支的处理不同. 最好别使用分支与循环
建议:
- 分析判断语句使用的变量最好为常数!
- 每个分支指令操作指令尽可能少
- 分支嵌套要尽可能少
不要除以0!!!
Unity Shader学习 第六章 基本光照
光源
-
实时渲染中,将光源看做没有体积的点
-
如何量化光!!! 辐照度irradiance
-
吸收与散射
- 散射到内部: 折射和透射
- 散射到外部: 反射 分为 高光反射 和 漫发射
着色
- 着色就是根据材质的属性 光源信息 使用某个等式去计算沿着观察方向的出射度的过程.
- 这个等式叫做 “光照模型”
BRDF 光照模型!!!
-
计算光照颜色. 需要知道光线和一个表面是如何交互的.
-
当光线从某个方向照射到一个表面时. 有多少光被反射,反射的方向有哪些?
-
BRDF(Bidirectional Reflectance Distribution Function) 双向反射分布方程
标准光照模型
Phong模型 只关心 直接光照 direct light
- 自发光 emissive 没有全局光照时.自发光不会影响周围的物体
- 高光反射 specular 光线发生完全镜面反射散射多少辐射量
- 漫反射 diffuse 向每个方向散射多少能量
- 环境光 ambient 描述其他所有间接光照
Blinn-Phong模型
- 简化了Phong模型的部分计算.
逐像素还是逐顶点
per-pixel-lighting
- 逐像素就是说在片元着色器中计算光照
- Phong着色
per-vertex-lighting
- 逐顶点就是在顶点着色器中计算光照. 会插值出所有像素的光照
- Gouraud Shading
Unity中的环境光和自发光
UNITY_LIGHTMODEL_AMBIENT 环境光
saturate函数 将颜色值规范到0~1之间
实践:
- 实现 逐顶点漫反射 / 高光反射
- 实现 逐像素漫反射 / 高光反射