Unity的shader

参考来源
这里

定义

  • shader,着色器,是一段负责将输入的mesh用指定的方式和输入的贴图,颜色等作用,然后输出
  • 输入贴图或者颜色,以及对应的shader,就可以得到一个material,然后将可以把材料给到renderer来进行输出
  • shader如果是自己来写的话,需要新创建一个shader文件
    • 比如在这里老师写的omniProcam的投影的shader,里面的参数就包括了fisheye相机的参数等等。这部分的参数也就是shader的输入,定义了这个shader需要的属性
    • 需要在里面设定不同的subshader,这部分是代码的主题,在每一个里面包含不同的pass。然后运行的时候会从最优先的着色器开始找。在shader的最后需要一个fallback,也就是说所有的subshader都不能运行的时候,需要一个返回情况

代码讲解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Shader "Custom/Diffuse Texture" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200

CGPROGRAM
#pragma surface surf Lambert

sampler2D _MainTex;

struct Input {
float2 uv_MainTex;
};

void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}

属性

  • 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是输出值