Shader编程一直是一个比较难入门难上手的主题,本篇对Unity Shader编程的一些基础和要点进行了总结。
包括Shader编程相关知识图谱、Shader编程相关数据类型、Shader核心结构体等(后续继续补充)。
每个部分相互独立,可以单独参考,亦可作为一个整体参考。
一、Shader编程知识图谱
个人对Shader编程的理解凝在四个字:色即是光。
无论是要手写Shader程序,还是利用各类Shader制作插件(如ShaderForge)制作Shader,关于“光”的知识是一定要有的。
Shader编程中比较麻烦的一点是,同一个变量在不同的语法阶段表示的方式不同,常用变量类型对照如下:
硬件平台 | CPU | (接口:Inspector面板设置) | GPU |
变量类型 | C#脚本语言 | ShaderLab 属性 | Cg语言 |
纹理贴图 | Texture | 2D | sampler2D |
颜色 | Color | Color | fixed4 / half4 |
3D贴图 | Cubemap | Cube | sampleCUBE |
4元素向量 | Vector4 | Vector | float4 |
浮点数 | float | Float | float |
浮点范围 | float | Range | float |
矩形纹理 | Texture | Rect | sampleRect |
(1)顶点着色器输入结构体
成员类型 | 成员名 | ?? 结构体也可以自定义,但是必须有位置信息 | appdata_base | appdata_tan | appdata_full | appdata_img |
float4 | vertex | 位置 | 1 | 1 | 1 | 1 |
float3 | normal | 法线 | 1 | 1 | 1 |
|
float4 | tangent | 切线 |
| 1 | 1 |
|
fixed4 | color | 顶点颜色 |
|
| 1 |
|
float4 | texcoord | 纹理坐标0 | 1 | 1 | 1 | 1 |
fixed4 | texcoord1 | 纹理坐标1 |
|
| 1 |
|
(2)表面着色器输出结构体
SurfaceOutput | ||
half3 | Abedo | 反射光 |
half3 | Normal | 法线 |
half3 | Emission | 自发光 |
half | Specular | 高光 |
half | Alpha | 透明度 |