参考来源
这里
定义
- shader,着色器,是一段负责将输入的mesh用指定的方式和输入的贴图,颜色等作用,然后输出
- 输入贴图或者颜色,以及对应的shader,就可以得到一个material,然后将可以把材料给到renderer来进行输出
- shader如果是自己来写的话,需要新创建一个shader文件
- 比如在这里老师写的omniProcam的投影的shader,里面的参数就包括了fisheye相机的参数等等。这部分的参数也就是shader的输入,定义了这个shader需要的属性
- 需要在里面设定不同的subshader,这部分是代码的主题,在每一个里面包含不同的pass。然后运行的时候会从最优先的着色器开始找。在shader的最后需要一个fallback,也就是说所有的subshader都不能运行的时候,需要一个返回情况
代码讲解
1 | Shader "Custom/Diffuse Texture" { |
属性
Properties
里面定义了这个shader的属性,这里面的所有属性将作为input提供给子着色器_Name("Display Name", type) = defaultValue[{options}]
- 格式
- _属性名
- “display name” 显示给用户的可读的名字
- type属性的类型
- 颜色,RGBA
- 2D,2的指数大小的贴图
- rect,非2的指数大小的贴图
- cube,立方体纹理
- range,一个范围里面的数
- float,任意一个浮点数
- 属性的默认值,比如颜色可以设定成“white”
- opinion项,至少需要在贴图后面加上空白的花括号,只和2d rect或者cube有关系
subshader
- tag:比如渲染类型,如果是非透明的物体要写在opaque里面,透明的写在transparent里面
- LOD:level of detail
CGPROGRAM
,开始的标记,从这里开始是一段CG程序。和最后的ENDCG
是对应的#pragma surface surf Lambert
一个编译指令,声明了要写一个表面的shader,指定了光照模型sampler2D
对贴图进行操作,2d的贴图模型。虽然在之前的属性里面声明过一次,但是因为这里面是cg代码,还是需要重新声明一次- 需要在struct里面定义出来需要输入和输出的数据类型
- uv:uv mapping指的就是把一个2d贴图上面的点按照一定规则映射到3d模型上。如果在贴图变量前边加上uv.
uv_MainTex
指的就是提取这个变量的uv值,也就是说二维坐标 - surf函数,surf是之前定义的光照模型,有两个参数
- In里面的内容是uv值,也就是说每次都会调用贴图上面的坐标点才计算输出
- inout是输出值