Shader 知识点 第一篇 基本结构

着色器概述

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

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

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

属性块 Properties

对应的变量类型 ——

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

属性类型变量类型
Range、Floatfloat(32位)、half(16位)、fixed(11位)
Int
Color、Vectorfloat4、half4、fixed4
2Dsampler2D
Rect
CubesamplerCube
3Dsampler3D

类型说明
变量名(”属性面板显示名”,变量类型) = 默认值属性通过变量名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” }

这里写图片描述

这里写图片描述


Pass 通道

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

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

这里写图片描述

通道渲染设置命令含义说明
Lighting光照开启或关闭顶点光照,On、Off
Material{ 材质块 }材质定义一个顶点光照管线的材质
ColorMaterial颜色集当计算顶点光照时使用的顶点颜色,颜色集可以是 AmbientAndDiffuse、Emission
SeparateSpecular高光开关状态开启或关闭顶点光照相关的镜面高光颜色,开关状态 On、Off
Color颜色设置顶点光照关闭时,使用的颜色
Fog {雾块}设置雾参数
重点
AlphaTestAlpha 测试默认值 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{ }
    }
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值