Shader基础笔记(1)-基本结构

新建Shader的分类

  1. Standard Surface Shader - 产生一个包含标准光照模型的表面着色器模板。
  2. Unlit Shader(推荐) - 产生一个不包含光照(但包含雾效)的基本顶点/片元着色器。
  3. Image Effect Shader - 为实现各种屏幕处理后效果提供的基本模板。
  4. Compute Shader - 特殊Shader,利用GPU的并行特性计算一些计算。
  • ShaderLab 是 Unity 提供的编写 Unity Shader 的一种说明性语言。在 Unity 中,所有的 Unity Shader 都是使用 ShaderLab 来编写的。

Shader 的基本结构

Shader "MyShader/Temp01"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100
        Pass
        {    
        CGPROGRAM
        
        ENDCG
        }
    }
}

Shader 基本结构说明

1. 给Shader起个名字

Shader "MyShader/Temp01"
这一行代码设置了 Shader 在材质中出现的位置及名称:

2. 属性

Properties
{
    _MainTex ("Texture", 2D) = "white" {}
}

声明这些属性是为了在材质面板中能够方便地调整各种材质属性。在 Unity 中,这些属性的名字通常由一个下划线开始。括号中的第一个参数,是属性显示在材质面板上的名字。第二个参数,是数据类型。

下面的代码给出了一个展示所有属性类型的例子:

Shader "MyShader/Temp01"
{
   Properties
   {
       // Unmbers and Sliders
      _Int("Int", Int) = 2
      _Float("Float", Float) = 1.5
      _Range("Range", Range(0.0, 5.0)) = 3.0
      
      // Colors and Vectors
      _Color("Color", Color) = (1,1,1,1) 
      _Vector("Vector", Vector) = (2,3,6,1)
      
      // Textures
      _2D("2D", 2D) = ""{}
      _Cube("Cube", Cube) = "white"{}
      _3D("3D", 3D) = "black"{}
   }
   
   FallBack "Diffuse"
}

TIPS:编译器对 Shader 的支持普遍不好,其中比较好用的还是 JetBrans 公司的 Rider。

3. SubShader

每一个 Unity Shader 文件可以包含多个 SubShader 语义块,但至少一个。当 Unity 需要加载这个 Unity Shader 时, Unity 会扫描所有的SubShader 语义块,然后选择第一个能够在目标平台上运行的 SubShader。如果都不支持,Unity 会使用 Fallback 语义指定的 Unity Shader。

每个Pass定义了一次完整的渲染流程,但如果Pass的数目过多,往往会造成渲染性能的下降。因此,应当尽量使用最小数目的Pass。

SubShader 语义块中包含的定义通常如下:
···
Subshader{
// 标签,可选的
[Tags]

// 状态,可选的
[RenderSetup]

Pass{
}
// Other Passes

}
···
SubShader 内的具体内容放到以后再写。

最简单的 Unity Shader

尽管 Unity Shader 可以做的事情非常多(例如设置渲染状态等),但其最重要的任务还是指定各种着色器所需的代码。这些着色器代码可以写在 SubShader 语义块中(表面着色器的做法),也可以写在 Pass 语义块中(顶点/片元着色器和固定函数着色器的做法)。

在 Unity 中,我们可以使用2种最常用的形式来编写 Unity Shader。

1. 表面着色器(Surface Shader)

表面着色器是 Unity 自己创造的一种着色器代码类型,它需要的代码量很少,Unity 在背后做了很多工作,但渲染的代价比较大。其本质与接下来的顶点/片元着色器一样,我们可以理解成 Unity 对顶点/片元着色器的更高一层的抽象。它存在的价值在于,Unity为我们处理了很多光照细节,使得我们不需要再操心这些“烦人的事情”。

一个非常简单的例子:

Shader "MyShader/Temp01"
{  
   Subshader{
       Tags { "RenderType" = "Opaque" }
       CGPROGRAM
       #pragma surface surf Lambert
       struct Input{
           float4 clolr : COLOR;
       };
       void surf (Input IN, inout SurfaceOutput o){
           o.Albedo = 1;
       }
       ENDCG
   }
   
   FallBack "Diffuse"
}

可见,表面着色器被定义在 SubShader 语义块(而非Pass语义块)中的 CGPROGRAM 和 ENDCG 之间。原因是:表面着色器不需要开发者关心使用多少个 Pass、每个 Pass 如何渲染等问题,Unity 会在背后为我们做好这些事情。我们要做的只是告诉它:“嘿,使用这些纹理去填颜色,使用这个法线纹理去填充法线,使用Lambert光照模型,其他的不要来烦我!”

2. 顶点/片元着色器(Vertex/Fragment Shader)

顶点/片元着色器更加复杂,但也更加灵活。

一个非常简单的例子:

Shader "MyShader/Temp01"
{  
   Subshader{     
       Pass{
           CGPROGRAM
           #pragma vertex vertex
           #pragma fragment fra
           
           float4 vert(float4 v : POSITION) : SV_POSITION {
               return UnityObjectToClipPos (v);
           }
           
           fixed4 frag() : SV_Target {
               return fixed4(1.0, 0.0, 0.0, 1.0);
           }
           ENDCG
       }
   }
}

我们将主要使用顶点/片元着色器。

扩展阅读

Unity官网的 Unity Shader 文档:官方文档

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容