前言
记录自己学习unity shader的记录,学习shader道阻且长,贵在坚持。
效果
Shader
Shader "Example/Diffuse Simple" {
SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert
struct Input {
float4 color : COLOR;
};
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = 1;
}
ENDCG
}
Fallback "Diffuse"
}
代码解释
设置渲染类型为“不透明”,更多类型。
Tags { "RenderType" = "Opaque" }
使用表面着色器:
#pragma surface <surface function> <lighting model> <optional parameters>
#pragma surface
是一个指令,用于告诉Unity编译器创建一个表面着色器。
surf
是表面着色器的函数名称。
Lambert
是一个光照模型。在这种情况下,Lambert是一种基本的漫反射光照模型,它假设表面的光照是均匀分布的,不考虑光的折射或反射。Lambert模型通常用于创建一般的、非金属的材质,如木材、石头等。
#pragma surface surf Lambert
Shader本体
struct Input {
float4 color : COLOR;
};
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = 1;
}
定义表面着色器函数surf
,输入和输出参数,Input
结构体定义了一个float4
,从模型顶点获取颜色。输出结构体SurfaceOutput
,是预定义的输出结构,我们的surf
函数的目标就是根据输入把这个输出结构填上。SurfaceOutput
结构体的定义如下:
struct SurfaceOutput {
half3 Albedo; //像素的颜色
half3 Normal; //像素的法向值
half3 Emission; //像素的发散颜色
half Specular; //像素的镜面高光
half Gloss; //像素的发光强度
half Alpha; //像素的透明度
};
精度类型 | |
---|---|
float | 最高精度浮点型32位 |
half | 中等精度16位 |
fixed | 最低精度 |