Shader编程学习笔记(四)——Unity Shader的组织形式(ShaderLab)

Unity Shader的组织形式

Unity Shader的形态

  Unity官方手册上讲Unity Shader有三种不同的编写方案,这三种编写方案分别是surface shaders、vertex and fragment shaders和fixed function shaders。 从前面几篇笔记中可以了解到,可编程图形管线中能够编写shader的主要是两个部分:vertex shader和fragment shader,但Unity还有surface shaders和fixed function shaders。

  对于fixed function shaders,从表面意思来理解就是固定管线着色器,在可编程管线硬件出现之前,很多的光照流水计算都会放在硬件里进行处理,我们把这样的固定管线功能也看作是对应于固定管线硬件的操作,这种shader的功能是很保守的,比如说启用简单的光照,进行简单的纹理采样等等,对于现在绝大多数硬件都能得到很好的支持。

  surface shaders是Unity中被推荐和鼓励使用的着色器,当你在Unity(Unity5之前)中创建一个shader时,默认的代码就是使用surface shaders。那么为什么会有surface shaders这样的着色器呢?它和vertex and fragment shaders又有什么关系呢?我们可以这样理解,可编程图形管线能够识别就是两种shader程序:vertex shader和fragment shader,至于surface shader是在vertex shader和fragment shader上面的一种包装,Unity引擎最终会把surface shaders代码编译成能够被硬件识别和调用的vertex and fragment shaders。

  Unity官方推荐在学习shader时先去阅读ShaderLab syntax的基本概念,然后再去阅读surface shaders或者vertex and fragment shaders的相关内容。fixed function shaders只能够使用ShaderLab语法进行编写,而surface shaders和vertex and fragment shaders不限于ShderLab语法,是可以使用Cg/HLSL,甚至可用GLSL去编写,它是镶嵌在ShaderLab中的一种代码片段。

ShaderLab基本结构

  ShaderLab是Unity定制的专门编写Shader的一种方案。使用ShaderLab可以把上文提到的三种shader用同一种格式来编写,这样就不会导致编写不同的shader需要不同的语法。前文中对shader、材质和贴图等它们之间的关系做了一个形象的比喻:材质是最终要使用的对象,shader是关于如何加工和处理的一种方案,是一种程序片段,至于贴图、颜色等它们是属于这个加工方案中的材料。那么当要建立一个Shader,要把它用于在材质上去使用的时候,既需要有算法,也需要添加一些原材料,首先来了解一下ShaderLab的主要结构,以下是ShaderLab的基本结构:

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

  Properties的作用是能够允许在Unity材质(material)检视面板中为材质去定义一些需要的参数,如颜色、贴图、参数等,这些都属于原材料,被shader程序使用。

  SubShader的作用就是专门为GPU渲染所编写的shader程序片段,在一个shader当中有并且至少需要一个SubShader,也可以有多个SubShader,但是在执行时只能选择其中的一个SubShader。那为什么允许多个SubShader同时存在呢?原因是shader中的某一种算法或者某一种指令可能不支持当前的硬件,比如说一个shader程序有多个SubShader,当这个shader程序被执行的时候,首先会去检测当前硬件能不能完好地支持第一个SubShader,如果第一个SubShader可以被当前硬件良好支持,那么就会使用当前SubShader,如果不能,那么就去检测下一个SubShader。在编写shader时,假如不能确定当前的SubShader在某些老旧的硬件上得到良好的支持,可以编写第二个SubShader,用来适配这些老旧的、稍差的图形硬件,当然也可以继续编写第三个、第四个、第五个等等,编写的SubShader功能要依次简化、运算指令依次简单,用来满足更多的硬件支持。如果编写的SubShader都不能支持当前的硬件时,就需要用到ShaderLab的“FallBack”功能了。

  FallBack的意思就是回滚。如果当前硬件无法支持所有的SubShader时,Unity会将当前的着色回滚,回滚到FallBack所指定的shader,因此FallBack指令后跟随的一般都是系统自带比较简单的,能够被绝大多数硬件执行的shader。以下列举了几个Unity官方的内建的shader,更加具体的信息可以查阅Unity官方手册。

Unity Build-In Shader

  • Unlit. This is just a texture,not affected by any lighting.(不发光。这只是一个纹理,不被任何光照影响)

  这是Unity中最为简单的shader,执行效率非常快,该shader经常被用于UI系统。

  • VertexLit.(顶点光照)

  该shader拥有在顶点上渲染光照的能力。

  • Diffuse.(漫反射)

  漫反射也是一种光照形态,不过它不仅仅在顶点上进行光照计算,在片段程序中也要进行光照计算。

  • Normal Mapped.This is a bit more expensive than Diffuse:it adds more texture(normal map),and a couple of shader instructions.(法线贴图,比漫反射更昂贵:增加了一个或更多纹理(法线贴图)和几个着色器结构)

  法线贴图技术是一种比较传统的图形渲染技术,通过一张贴图进行采样计算,但这张贴图不是一张普通的贴图,而是一张存储法向量的贴图,把这张图采样出来的数据当做法向量,然后再进行光照计算,主要目的就是当几个模型面片顶点数量不多,构成的面片细节不多的时候,为了表达丰富的细节,可以使用法线贴图去弥补这样的细节,以假乱真,因此法线贴图shader的使用率很高。

  • Specular.This adds specular highlight calculation.(高光。增加了特殊的高光计算)

  Specular指的是镜面高光反射,主要用于模拟光滑物体,比如金属、玻璃等。

  • Normal Mapped Specular.Again,this is a bit more expensive than Specular.(高光法线贴图。比高光更昂贵一点)

  该shader结合了以上两点,既有法线贴图,又有高光显示。

  • Parallax Normal mapped.This adds parallax normal-mapping calculation.(视差法线贴图。增加了视差法线贴图计算)
  • Parallax Normal Mapped Specular.This adds both poarallax normal-mapping and specluar highlight calculation.(视差高光法线贴图。增加了视差法线贴图和镜面高光计算)

  视差即视觉的差异,比较形象的解释就是当人的左眼和右眼分别去看同一个物体时,两只眼睛看到的结果是不一样的,正是由于人的左眼和右眼有三厘米左右的距离,人看到的这个世界是三维的、立体的。
  那么视差法线贴图的作用是什么呢?原因就是当法线贴图进行贴图映射的时候,是为了更好地表现物体的细节,法线数据存储在纹理当中,但是该纹理是不可变的,当物体渲染出来后,会得到一个比较好的结果,表现了物体凹凸的细节,所以法线贴图在有些教科书当中也叫作凹凸贴图,但是当把有法线贴图的物体进行旋转,照理说有些地方由于视角的偏差是看不到它的凹凸的形态或者说看到凹凸感觉会更强烈,由于法线贴图是一个固定的贴图,就会达不到这样的效果,而视差法线贴图的作用就弥补这样的缺陷。

时间: 2024-10-08 13:26:26

Shader编程学习笔记(四)——Unity Shader的组织形式(ShaderLab)的相关文章

Shader编程学习笔记(七)—— Surface shader 1

Surface shader 本小结对Unity的Surface Shader做一个大概的了解.主要了解在Surface Shader当中比较重要的几个部分,分别是: SurfaceOutput Input lighing shadow 首先查看一下Unity的官方手册中的Writing Surface Shaders,其中描述道:如果要编写一个shader去和光进行交互是比较复杂的,因为光照会有不同的光照类型,不同的阴影选项和不同的渲染路径(包括foward和deferred renderin

Shader编程学习笔记(三)——三大主流编程语言 HLSL/GLSL/Cg

三大主流编程语言 HLSL/GLSL/Cg Shader Language Shader Language的发展方向是设计出在便携性方面可以和C++.Java等相比的高级语言,“赋予程序员灵活而方便的编程方式”,并“尽可能的控制渲染过程”同时“利用图形硬件的并行性,提高算法效率”. Shader Language目前主要有3种语言:基于OpenGL的OpenGL Shading Language,简称GLSL;基于DirectX的High Level Shading Language,简称HLS

Shader编程学习笔记(八)—— Surface Shader 2

Surface Shader 上一小结主要了解了Surface Shader使用了“#pragma surface surf Standard fullforwardshadows”指令的意义,这一小节主要了解“surf”surface函数. void surf (Input IN, inout SurfaceOutputStandard o) { // Albedo comes from a texture tinted by color fixed4 c = tex2D (_MainTex,

Shader编程学习笔记(一)—— 图形硬件简史与可编程管线

图形处理器(GPU)简史 GPU发展简史 GPU英文全称Graphic Processing Unit,中文翻译为“图形处理器”,在现代计算机系统中的作用变得越来越重要. 20世纪六.七十年代,受硬件条件的限制,图形显示器只是计算机输出的一种工具.限于硬件发展水平,人们只是纯粹从软件实现的角度来考虑图形用户界面的规范问题.此时还没有GPU的概念. GPU概念在20世纪70年代末和80年代初被提出,使用单片集成电路(monolithic)作为图形芯片,此时的GPU被用于视频游戏和动画方面,它能够很

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

Shader和渲染管线 什么是Shader Shader,中文翻译即着色器,是一种较为短小的程序片段,用于告诉图形硬件如何计算和输出图像,过去由汇编语言来编写,现在也可以使用高级语言来编写.一句话概括:Shader是可编程图形管线的算法片段. 它主要分为两类:Vertex Shader和Fragment Shader. 什么是渲染管线 渲染管线也称为渲染流水线,是显示芯片内部处理图形信号相互独立的并行处理单元.一个流水线是一序列可以并行和按照固定顺序进行的阶段.就像一个在同一时间内,不同阶段不同

Shader之学习笔记四

Shader "属性/属性定义" { //具体属性定义后面是没有分号的 切记 Properties { //定义颜色属性 颜色的变化 对应材质球颜色同步变化 _Color ("Color", Color) = (1,1,1,1) //定义2d贴图 white:material的颜色是white 默认值 也可以修改为black... _MainTex1 ("Albedo1 (RGB)", 2D) = "white" {} //缺

【Unity 3D】学习笔记四十二:粒子特效

粒子特效 粒子特效的原理是将若干粒子无规则的组合在一起,来模拟火焰,爆炸,水滴,雾气等效果.要使用粒子特效首先要创建,在hierarchy视图中点击create--particle system即可 粒子发射器 粒子发射器是用于设定粒子的发射属性,比如说粒子的大小,数量和速度等.在创建完粒子对象后,在右侧inspector视图中便可以看到所有的粒子属性: emit:是否是使用粒子发射器. min size:粒子最小尺寸. max size:粒子最大尺寸. min energy:粒子的最小生命周期

【Unity 3D】学习笔记四十一:关节

关节 关节组件可以添加至多个游戏对象中,而添加关节的游戏对象将通过关节连接在一起并且感觉连带的物理效果.需要注意的是:关节必须依赖于刚体组件. 关节介绍 关节一共分为5大类:链条关节,固定关节,弹簧关节,角色关节和可配置关节. 链条关节(hinge joint):将两个物体以链条的形式绑在一起,当力量大于链条的固定力矩时,两个物体就会产生相互的拉力. 固定关节(fixed joint):将两个物体永远以相对的位置固定在一起,即使发生物理改变,它们之间的相对位置也将不变. 弹簧关节(spring

【Unity 3D】学习笔记四十三:布料

布料 布料是特殊的组件,它可以变化成任意形状,比如说:随风飘的旗子,窗帘等 创建布料的方法有两种:创建布料对象,在游戏对象中添加布料组件.前者通过hierarchy视图中选择create--cloth即可,创建后,系统会自动将互动布料组件(interactive clothe)与布料渲染组件(cloth renderer)添加值该对象中.后者是在导航菜单中选component--physics--interactive cloth菜单项即可. 交互布料组件是由网格组成的布料,只要用于布料的逻辑判