Shader 知识点 第一篇 基本结构

着色器概述

什么是着色器?
着色器Shader —— 运行在图形处理单元(GPU)上的程序,可以对图形硬件的渲染功能进行设置。

Unity 使用 ShaderLab 着色语言,同时支持使用 Cg、HLSL、GLSL 编写的着色器程序。

Shader "name"
{
    [Properties]
    SubShader { }  //可以有多个,unity会找到第一个被用户机器支持的子着色器
    [Fallback]     //如果没有子着色器被支持,那么会尝试使用指定的降级着色器
}

属性块 Properties

对应的变量类型 ——

颜色、向量、4个数、3个数的转换

属性类型 变量类型
Range、Float float(32位)、half(16位)、fixed(11位)
Int
Color、Vector float4、half4、fixed4
2D sampler2D
Rect
Cube samplerCube
3D sampler3D

类型 说明
变量名(”属性面板显示名”,变量类型) = 默认值 属性通过变量名name来访问,通常以下划线开头
数值类型
name(“display name”, Range(min,max)) = num 定义一个浮点数范围
name(“display name”,Float) = num 定义一个浮点数
name(“display name”,Int) = num 定义一个整数
颜色与向量
name(“display name”, Color) = (num,num,num,num) 定义颜色属性,num取值范围 0~1
name(“display name”,Vector) = (num,num,num,num) 定义四维向量属性
纹理类型
name(“display name”,2D) = “name” { options } 定义2D纹理,缺省值为”white”“black”“gray”“bump”
name(“display name”,Rect) = “name” { options } 定义矩形纹理(尺寸非2次方),缺省值同上
name(“display name”,Cube) = “name” { options } 定义立方图纹理,缺省值同上
name(“display name”,3D) = “name”{ options } 定义3D纹理

纹理属性的 options 选项是可选的,具体咋用的还是没太明白(貌似不是太常见)

选项名称 说明
TexGen 纹理生成模式,纹理自动生成纹理坐标时的模式。可以是 TexGen ObjectLinear、TexGen EyeLinear、TexGen SphereMap、TexGen CubeReflect、TexGen CubeNormal,这些模式和OpenGL纹理生成模式相对应。
注意:如果使用自定义的顶点、片段着色器,那么纹理生成模式将被忽略
LightmapMod 光照贴图模式,如果给出这个选项,纹理会被渲染器的光线贴图所影响,即纹理不能被应用在材质中,而是使用渲染器中的设定

SubShader

使得开发者能针对不同性能的显卡编写不同的着色器程序。

一个着色器可以包含一个 SubShader 列表,unity运行时 会根据实际的运行环境,在列表中从上到下选出第一个被用户显卡支持的 SubShader 来呈现效果。

SubShader   //注意两个 S 都是大写
{
    [Tags]         //标签
    [CommonState]  //通用状态,可以为所有的通道初始化所需的通用状态
    Pass           //通道列表,有些效果不能通过单个通道就完成,那就必须使用多次通道
    {
        [Name and Tags]
        [RenderSetup]
        [TextureSetup]
    }
}

定义通道的类型有 Pass、UsePass、GrabPass

标签 Tags

SubShader 使用的标签 —— 告诉unity引擎或其他用户,如何认证这个 SubShader
Tags{ "标签1"="值1" "标签2"="值2" } //键值对,多个之间用的是空格
SubShader 的标签 说明
Queue 决定对象被渲染的次序 Background(1000)、Geometry默认值(2000)、AlphaTest(2450)、Transparent(3000)、Overlay(4000)、(具体看308页)
RenderType 渲染类型,可以用于着色器替换功能(shader replacement)
DisableBatching 禁用批处理,可选值 True、False、LODFading
ForceNoShadowCasting 强制不投射阴影,如果为True,由该子着色器渲染的对象不会投射阴影
IgnoreProjecttor 忽略投影,例如不想在半透明物体上显示其他物体的阴影
CanUseSpriteAtlas 如果该着色器用于精灵对象上,如果设置为False,那么打包图集之后,着色器不起作用
PreviewType 材质属性面板上预览窗口显示的类型,默认材质球,也可以是 Plane、Skybox
Pass 的标签 说明
LightMode 定义该Pass在 Unity 的渲染流水线中的角色
Tags{“LightMode” = “ForwardBase”}
RequireOptions 用于指定当满足某些条件时才渲染该Pass,它的值是一个由空格分隔的字符串。
unity目前支持的选项有 SoftVegatation
Tags{ “RequireOptions” = “SoftVegatation” }

Shader 知识点 第一篇 基本结构_第1张图片

Shader 知识点 第一篇 基本结构_第2张图片


Pass 通道

SubShader 包装了一个渲染方案,而这个方案是由一个个通道(Pass)来执行的。
SubShader 可以包括多个Pass块,每个Pass能使几何对象被渲染一次。

Pass 
{ 
    [Name and Tags]  
    [RenderSetup]       //渲染设置命令,设置显卡的各种状态
    [TextureSetup]      //纹理设置命令
}
特殊的通道 语法 说明
UsePass UsePass “Shader/Name”
GrabPass GrabPass{ [“纹理名”] }

Shader 知识点 第一篇 基本结构_第3张图片

通道渲染设置命令 含义 说明
Lighting 光照 开启或关闭顶点光照,On、Off
Material{ 材质块 } 材质 定义一个顶点光照管线的材质
ColorMaterial 颜色集 当计算顶点光照时使用的顶点颜色,颜色集可以是 AmbientAndDiffuse、Emission
SeparateSpecular 高光开关状态 开启或关闭顶点光照相关的镜面高光颜色,开关状态 On、Off
Color 颜色 设置顶点光照关闭时,使用的颜色
Fog {雾块} 设置雾参数
重点
AlphaTest Alpha 测试 默认值 LEqual,可选值 Less、Greater、LEqual、GEqual、Equal、NotEqual、Alwalys
ZTest 深度测试模式 Less、Greater、LEqual、GEqual、Equal、NotEqual、Always
ZWrite 深度写模式 On、Off
Blend 混合模式 SourceBlendMode、DestBlendMode、AlphaSourceBlendMode、AlphaDestBlendMode
ColorMask 颜色遮罩 颜色值可以是 RGB 或 A 或 0 或任何 R\G\B\A 的组合,设置0可以关闭所有颜色通道的渲染
Offset 深度偏移因子 设置深度偏移,这个命令只接受常数参数
Cull 裁剪模式 设置裁剪模式,可以是 Back、Front、Off

Fallback

如果没有任何 SubShader 能被运行在当前的硬件上,那么尝试使用降级着色器

常见用法
Fallback “着色器名”
Fallback Off

Category

前面所说的渲染设置是在 SubShader 或是在 Pass 中指定的。

Category 分类,是渲染命令的逻辑组,大多数情况下,用于继承渲染状态。(只影响着色器的解析,不影响执行速度)

例如,可以有多个子着色器,它们都需要关闭雾效、设置混合等。

Shader "Example"
{
    Category
    {
        Fog{ Mode Off }
        Blend One One
        SubShader{ }
        SubShader{ }
    }
}

你可能感兴趣的:(Shader,入门到放弃)