基本数据类型
float 单个浮点数 (32位浮点数)
float2 两个浮点数 相当于 Vector2 (32位浮点数)
float3 三个浮点数 相当于 Vector3 (32位浮点数)
float4 四个浮点数 相当于 Vector4 (32位浮点数)
half half2 half3 half4 和float一样 只不过它是16位浮点数
int 整型 (32位整型)
fixed fixed2 fixed3 fixed4 和float一样 只不过它是12位浮点数
bool bool类型
sampler2D 纹理对象
string 字符串类型
表面着色器主要是渲染像素的 涉及到输入和输出
1. input saturate float2 --> uv_MainTex --> uv纹理贴图 --> 命名方式必须为uv + 贴图变量名 float3 --> viewDir(视图方向) -->worldPos(世界坐标位置) float4 --> screenPos(屏幕空间位置) -->color:COLOR(语义绑定 每个顶点的内插值颜色) 2.SurfaceOutput half3 --> Albedo(反射值,即颜色纹理rgb) -->Normal(法线,法向量) -->Emission(自发光颜色) half -->Specular(镜面反射度) -->Gloss(光泽度) -->Alpha(透明度)
CG语言的编写规则
CGPROGRAM ——- CG语言开头
#pragma surface surf Lambert —– #pragma -> 预编译指令|surface -> 告诉编译器我的着色器类型(三种surface|vertex|fragment)|surf-> 着色器对应的函数名称|Lambert -> 光照模型(Lambert兰伯特光照模型)
//两个参数输入,输出 就是这个格式 不用改变
void surf(Input IN,inout SurfaceOutput o)
{
//在这里写我们的着色器代码
}
ENDCG ——- CG语言结尾
CG常用函数
1.UnpackNormal
传入的参数是fixed4 返回的是fixed3 也就是传入值对应的 法线
2.saturate
限制值的函数 限制值的范围为 0 - 1
3.dot
点乘的函数
4.tex2D
通过uv查找纹理的每个顶点的颜色值(也就是设置纹理贴图,传入参数是uv纹理)
应用案例
直接上代码来看一下具体的实现
- 最简单的实现单一主颜色/添加纹理贴图
Shader "SurfaceShader/SurfaceShader_001" {
Properties
{
_MainColor("主颜色",Color) = (1,0,0,