Fixed Function Shader

  在学习固定管线着色器中要涉及到的知识点是:

  • Properties
  • Material
  • Lighting
  • SetTexture
  • Pass

  首先来回忆一下ShaderLab的基本结构:

shader "name"{[Properties]SubShaders[FallBack]
}

  在shader主要的三个部分中除了SubShaders有且至少需要一个之外,Properties和FallBack都是可以没有的。但是,如果没有Properties,我们就不能为Shader定制属性,没有FallBack,当任何一个SubShader都无法执行的时候,那么这个着色就会失败,就没有任何的方案去用于显示,所以一般条件下我们不了解我们的Shader是否适应所有的平台硬件时,我们都会使用一个FallBack,保证能够得到基本的正确的显示。

  接下来在Unity中创建一个新的工程,并创建一个shader:

1 Shader "Lesson/FixedFunctionShader1" {
2
3     SubShader {
4
5         pass{
6             color(1,1,1,1) // 分别代表了 r,g,b,a
7         }
8     }
9 }

  将该shader命名为"Lesson/FixedFunctionShader1",shader的名字会直接决定shader在material里出现的路径。接下来创建一个material文件,在该material检视面板中选择创建好的shader。在场景中创建一个球体(Sphere),并将新建的material直接拖给这个球体,然后我们在场景中就看到球体是纯白色的,如下图:

  接着我们来改变一下颜色,比如红色:

1 Shader "Lesson/FixedFunctionShader1" {
2
3     SubShader {
4
5         pass{
6             color(1,0,0,1) // 分别代表了 r,g,b,a
7         }
8     }
9 }

  那么,在Unity工程中就可以看到球体变成了红色。

  目前这个颜色是固定设置的,那么有没有办法在着色器的参数部分中去修改这个颜色呢?答案是肯定的,这个时候就需要用到Properties。

 1 Shader "Lesson/FixedFunctionShader1" {
 2
 3     properties{
 4         _Color("Main Color",color)=(1,1,1,1)
 5     }
 6
 7     SubShader {
 8         pass{
 9             // color(1,0,0,1) // 分别代表了 r,g,b,a
10             color[_Color]
11         }
12     }
13 } 

  需要注意的是ShaderLab本身是没有大小写之分的。

  上面shader代码中第四行“_Color("Main Color",color)=(1,1,1,1)”中,“_Color”是Properties中的参数名,而且必须在开头加下划线,否则会报错,括号中的第一个参数“Main Color”是显示在检视面板上的名称,第二个参数“color”是类型。然后赋予一个默认值“(1,1,1,1)”,分别代表了r、g、b、a,当前值为白色。

  第十行“color[_Color]”,将原来“color”的小括号改成了中括号,并赋予Properties里的“_Color”参数,原因是小括号中的值是固定值,中括号里的值是可变参数值。

  然后在球体的检视面板中就可以通过“Main Color”来修改颜色值:

  但是,这种以color形式着色的着色器,让球体看起来只是一个平面的圆,没有体现球体三维立体的感觉,要达到三维立体的感觉需要运用光照。当光从某一个方向照向球体的时候,球体的一部分是高亮面,一部分是黑暗面。
为了达到这个效果,需要引入一些固定管线功能:

 1 Shader "Lesson/FixedFunctionShader1" {
 2
 3     properties{
 4         _Color("Main Color",color)=(1,1,1,1)
 5     }
 6
 7     SubShader {
 8         pass{
 9             // color(1,0,0,1) // 分别代表了 r,g,b,a
10             // color[_Color] // 小括号内容表示固定值,中括号内容表示可变参数值
11             material{
12                 diffuse[_Color] // 漫反射
13             }
14         }
15     }
16 } 

  代码中material材质是一个命令块,在这个命令块中可以添加属性,其中的diffuse属性描述的是材质的漫反射颜色,也可以把它理解为物体本身固有的颜色。然后回到Unity工程,编译成功后可以发现,在当前shader检视面板中无论怎么改变“Main Color”的颜色,球体的颜色都没有什么变化,这是什么原因呢?打个比方在真实的世界当中,所有颜色的呈现都必须依靠光,没有光的话我们将看不到任何东西,在有光的情况下,物体会接受光照,然后并反射出一部分光,这样我们才能够看到物体。ShaderLab默认情况下光照不启用的,因此在这里漫反射没有反应,需要在pass通道中添加光照命令lighting,开启为on,关闭为off。

 1 Shader "Lesson/FixedFunctionShader1" {
 2
 3     properties{
 4         _Color("Main Color",color)=(1,1,1,1)
 5     }
 6
 7     SubShader {
 8         pass{
 9             // color(1,0,0,1) // 分别代表了 r,g,b,a
10             // color[_Color]
11             material{
12                 diffuse[_Color] // 漫反射
13             }
14             lighting on // 光照开关
15         }
16     }
17 }

  回到Unity工程,shader编译成功后就可以看到球体有一定的立体效果了,球体被光照射的面相对变亮了,不背光照射的面相对变黑了,如下图。

  但是球体的状态还是不够形象生动,球体处在某一个环境当中,应该还会受到环境光的影响,所以还需要ambient环境光属性。

 1 Shader "Lesson/FixedFunctionShader1" {
 2
 3     properties{
 4         _Color("Main Color",color)=(1,1,1,1)
 5         _Amnient("Ambient",color)=(0.3,0.3,0.3,1)
 6     }
 7
 8     SubShader {
 9         pass{
10             // color(1,0,0,1) // 分别代表了 r,g,b,a
11             // color[_Color] // 小括号内容表示固定值,中括号内容表示可变参数值
12             material{
13                 diffuse[_Color] // 漫反射
14                 ambient[_Amnient] // 环境光
15             }
16             lighting on // 光照开关
17         }
18     }
19 }

  在环境光ambient命令也配上一个参数“_Amnient”,声明在“Properties”中,类型也是“color”颜色,默认值范围是0~1,如果值为1,表示环境光全部为白色,这样的话即使有光照也反应不了光对物体的影响,环境光把物体全部照到最亮了,因此环境光的默认值rgb可以设置为0.3或者其他值,至于alpha值暂时可以随便设置,可以是1,也可以是0,对于目前的环境光没有影响。

  回到Unity工程中,在检视面板中修改Ambient的颜色值,可以发现环境光属性对球体的影响。

  假如这个球体是非常光滑的物体,我们可以在光滑的物体表面看到独立的高光部分,这个高光部分在ShaderLab固定管线中也有一个命令,为“specular”。
  在material中添加specular,并配上参数“_Specular”,“_Specular”类型“color”,默认颜色为白色。这里需要注意的是,如果在material使用了“specular”命令,还必须在pass通道中添加“separatespecular on”开启命令,否则specular镜面高光不启用。

 1 Shader "Lesson/FixedFunctionShader1" {
 2
 3     properties{
 4         _Color("Main Color",color)=(1,1,1,1)
 5         _Amnient("Ambient",color)=(0.3,0.3,0.3,0)
 6         _Specular("Specular",color)=(1,1,1,1)
 7     }
 8
 9     SubShader {
10         pass{
11             // color(1,0,0,1) // 分别代表了 r,g,b,a
12             // color[_Color] // 小括号内容表示固定值,中括号内容表示可变参数值
13             material{
14                 diffuse[_Color] // 漫反射
15                 ambient[_Amnient] // 环境光
16                 specular[_Specular] // 高光
17             }
18             lighting on // 光照开关
19             separatespecular on // 镜面高光开关
20         }
21     }
22 }

  回到Unity工程,可以发现specular已经起作用,改变specular的颜色也能得到即时的反馈。

  但是这个高光效果看起来很奇怪,大面积地照亮了这个物体,看起来不是很舒服,并没有达到预期物体高光反射的感觉,在这里还需要另一个属性“shininess”,其参数类型为浮点值,用来描述“specular”的强度,它的参数“_Shininess”的类型可以是float,也可以用range给定一个范围,取值范围是[0.0, 128.0],值越高,表示物体越光滑,高光点越小且越亮(聚焦越好)。这里范围给定0~8,默认值为4。

 1 Shader "Lesson/FixedFunctionShader1" {
 2
 3     properties{
 4         _Color("Main Color",color)=(1,1,1,1)
 5         _Amnient("Ambient",color)=(0.3,0.3,0.3,0)
 6         _Specular("Specular",color)=(1,1,1,1)
 7         _Shininess("Shininess",range(0,8))=4
 8     }
 9
10     SubShader {
11         pass{
12             // color(1,0,0,1) // 分别代表了 r,g,b,a
13             // color[_Color] // 小括号内容表示固定值,中括号内容表示可变参数值
14             material{
15                 diffuse[_Color] // 漫反射
16                 ambient[_Amnient] // 环境光
17                 specular[_Specular] // 高光
18                 shininess[_Shininess] // 述specular强度
19             }
20             lighting on // 光照开关
21             separatespecular on // 镜面高光开关
22         }
23     }
24 }

  

  回到Unity工程,在shader编译通过后,可以看到球体的高光部分变得很集中了,通过拖动修改“Shininess”的值,可以看到物体高光反射部分的区域起了相应的变化。

  固定管线着色器中还有一个功能是自发光,叫做“emission”,它可以使物体自身发光,不依赖于外部光源,参数类型也是颜色“color”。 如果将emission设置为白色,那么就会发现整个球体都变成白色了,因为在计算机当中颜色值从0到1,0是全黑,1是全白,因此即使没有光照,物体自发光都已经达到了全白,为了达到真实的感觉我们可以降低自发光的强度。

  以上解释了ShaderLab的固定管线着色器的部分功能,通过设置diffuse(漫反射)、ambient(环境光)、specular(高光)、shininess(高光强度)、emission(自发光)等来修改固定管线着色器的功能,来改变material(材质)对物体产生的着色效果。

Shader编程学习笔记(五)—— Fixed Function Shader 1相关推荐

  1. Shader编程学习笔记(二)—— Shader和渲染管线

    Shader和渲染管线 什么是Shader Shader,中文翻译即着色器,是一种较为短小的程序片段,用于告诉图形硬件如何计算和输出图像,过去由汇编语言来编写,现在也可以使用高级语言来编写.一句话概括 ...

  2. Shader编程学习笔记(九)—— Cg语言入门1 - 输入输出和语义

    Cg入门一:输入输出和语义 本小节对Cg语言进行一个入门了解. 在以前的课程中,我们了解了渲染管线.顶点和片段程序和颜色计算等,在本小结中来了解一个简单的shader的顶点和片段程序的输入输出以及常用 ...

  3. python网络编程需要学什么,python网络编程学习笔记(五):socket的一些补充 Python 网络编程需要学习哪些网络相关的知识...

    python的socket编程问题hdr = recvall(s, 5) if hdr is None: print 'Unexpected EOF receivingstruct在unpack的时候 ...

  4. 【Linux_Shell 脚本编程学习笔记五、Oracle JDK1.8 安装shell 脚本】

    脚本使用说明: 首先在脚本的同级目录下有个 jdk的安装包 脚本和安装包必须在同级目录下才能够安装(脚本没有优化,还可以使用  wget  从网上下载指定版本的  jdk 安装包) #!/bin/sh ...

  5. UE5 Shader基础学习笔记——01-12 图形管线/创建shader/数学节点/贴图压缩/LerpDotUV/常用向量/坐标空间/MinMaxClampSaturate/法线贴图混合

    UE5 Shader基础学习笔记--01-12 图形管线/创建shader/数学节点/贴图压缩/LerpDotUV/常用向量/坐标空间/MinMaxClampSaturate/法线贴图混合 Lec01 ...

  6. Fixed Function Shader

    Fixed function shader(固定管线着色器) Shader "Custom/Text01" {                        //shader名称 ...

  7. UE5 Shader基础学习笔记——13-20 DetailNormal/Smoothstep/Length/CeilFloorRound/DDXDDY/SinCos/Power

    UE5 Shader基础学习笔记--13-20 DetailNormal/Smoothstep/Length/CeilFloorRound/DDXDDY/SinCos/Power Lec13 Deta ...

  8. Lua 编程学习笔记

    文章目录 Lua 编程学习笔记 一.环境安装 二.Lua 基本语法 1. 注释 2. 标识符 3. 变量 4. 数据类型 5. Lua 运算符 三.循环与流程控制 1. 循环 2. 流程控制 四.函数 ...

  9. SHELL编程学习笔记

    SHELL编程学习笔记 本文描述unix shell的各种应用实例,根据查阅资料和自我总结,作为自己今后复习的模板.本文搜集整理常用的shell应用实例,以例子详述unixshell部分命令的使用,着 ...

最新文章

  1. Leetode算法刷题宝典.pdf
  2. Spring-Aop-注解实现
  3. WSUS 转发邮件中继到Office365
  4. Aiiage Camp Day4 A Board game
  5. mysql5.7.17配置_mysql-5.7.17-winx64的安装配置
  6. CSS中position的absolute和relative用法
  7. __cdecl __fastcall与 __stdcall 调用约定
  8. linux 引导管理器,linux系统引导管理器GRUB
  9. 24个整点报时_大连交通广播整点报时广告怎么做?大连交通广播全新广告价格...
  10. 【Shell】特殊变量
  11. 前端汉字encode_js编码转码中文
  12. 一个博士生接受怎样的训练是完整、全面的科研训练?
  13. 生如夏花之绚烂,死如秋叶之静美---也传奇
  14. sequelize时间自动格式化
  15. Faces Verbatim 组件
  16. 微信支付-本地测试方法-java代码
  17. Win11怎么看用了多少流量?
  18. 简洁易懂的配置Go开发环境MacOS
  19. 前端学习笔记01---HTML5、CSS3、移动端前端基础学习知识点合集
  20. 大学本科计算机考试小抄,大学考试允许带小抄 一页开卷学生抄到手酸

热门文章

  1. 下一个五年,存储的生意在哪里?
  2. hive项目之微博ETL项目总结分析
  3. 【vue作业】vue实现海贼王网页介绍--动漫网站设计
  4. CAN工具 - PCAN - 半自动化
  5. 什么是亚马逊强关联,亚马逊账号关联详解
  6. OpenWrt支持usb tethering
  7. 高等数学之极限的原理及易错题计算
  8. 《Android软件安全权威指南》原生程序分析 阅读笔记
  9. Hololens开发学习笔记-4
  10. android随手记(持续更新)