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

2023-10-21 22:18

本文主要是介绍Shader编程学习笔记(四)—— Unity Shader的组织形式(ShaderLab),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文:http://www.cnblogs.com/maple-share/p/5418384.html

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.(视差高光法线贴图。增加了视差法线贴图和镜面高光计算

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

这篇关于Shader编程学习笔记(四)—— Unity Shader的组织形式(ShaderLab)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/257304

相关文章

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学