Shader编程学习笔记(五)—— Fixed Function Shader 1
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相关推荐
- Shader编程学习笔记(二)—— Shader和渲染管线
Shader和渲染管线 什么是Shader Shader,中文翻译即着色器,是一种较为短小的程序片段,用于告诉图形硬件如何计算和输出图像,过去由汇编语言来编写,现在也可以使用高级语言来编写.一句话概括 ...
- Shader编程学习笔记(九)—— Cg语言入门1 - 输入输出和语义
Cg入门一:输入输出和语义 本小节对Cg语言进行一个入门了解. 在以前的课程中,我们了解了渲染管线.顶点和片段程序和颜色计算等,在本小结中来了解一个简单的shader的顶点和片段程序的输入输出以及常用 ...
- python网络编程需要学什么,python网络编程学习笔记(五):socket的一些补充 Python 网络编程需要学习哪些网络相关的知识...
python的socket编程问题hdr = recvall(s, 5) if hdr is None: print 'Unexpected EOF receivingstruct在unpack的时候 ...
- 【Linux_Shell 脚本编程学习笔记五、Oracle JDK1.8 安装shell 脚本】
脚本使用说明: 首先在脚本的同级目录下有个 jdk的安装包 脚本和安装包必须在同级目录下才能够安装(脚本没有优化,还可以使用 wget 从网上下载指定版本的 jdk 安装包) #!/bin/sh ...
- UE5 Shader基础学习笔记——01-12 图形管线/创建shader/数学节点/贴图压缩/LerpDotUV/常用向量/坐标空间/MinMaxClampSaturate/法线贴图混合
UE5 Shader基础学习笔记--01-12 图形管线/创建shader/数学节点/贴图压缩/LerpDotUV/常用向量/坐标空间/MinMaxClampSaturate/法线贴图混合 Lec01 ...
- Fixed Function Shader
Fixed function shader(固定管线着色器) Shader "Custom/Text01" { //shader名称 ...
- UE5 Shader基础学习笔记——13-20 DetailNormal/Smoothstep/Length/CeilFloorRound/DDXDDY/SinCos/Power
UE5 Shader基础学习笔记--13-20 DetailNormal/Smoothstep/Length/CeilFloorRound/DDXDDY/SinCos/Power Lec13 Deta ...
- Lua 编程学习笔记
文章目录 Lua 编程学习笔记 一.环境安装 二.Lua 基本语法 1. 注释 2. 标识符 3. 变量 4. 数据类型 5. Lua 运算符 三.循环与流程控制 1. 循环 2. 流程控制 四.函数 ...
- SHELL编程学习笔记
SHELL编程学习笔记 本文描述unix shell的各种应用实例,根据查阅资料和自我总结,作为自己今后复习的模板.本文搜集整理常用的shell应用实例,以例子详述unixshell部分命令的使用,着 ...
最新文章
- Leetode算法刷题宝典.pdf
- Spring-Aop-注解实现
- WSUS 转发邮件中继到Office365
- Aiiage Camp Day4 A Board game
- mysql5.7.17配置_mysql-5.7.17-winx64的安装配置
- CSS中position的absolute和relative用法
- __cdecl __fastcall与 __stdcall 调用约定
- linux 引导管理器,linux系统引导管理器GRUB
- 24个整点报时_大连交通广播整点报时广告怎么做?大连交通广播全新广告价格...
- 【Shell】特殊变量
- 前端汉字encode_js编码转码中文
- 一个博士生接受怎样的训练是完整、全面的科研训练?
- 生如夏花之绚烂,死如秋叶之静美---也传奇
- sequelize时间自动格式化
- Faces Verbatim 组件
- 微信支付-本地测试方法-java代码
- Win11怎么看用了多少流量?
- 简洁易懂的配置Go开发环境MacOS
- 前端学习笔记01---HTML5、CSS3、移动端前端基础学习知识点合集
- 大学本科计算机考试小抄,大学考试允许带小抄 一页开卷学生抄到手酸