| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 游戏开发 -> 【技术美术实践部分】初识Unity Shader:基础总结! -> 正文阅读 |
|
[游戏开发]【技术美术实践部分】初识Unity Shader:基础总结! |
写在前面 这篇博客是对《Unity Shader 入门精要》第3章-Unity Shader基础的学习记录和总结。从这篇开始我就再也不是“纸上谈兵”得学习理论知识啦! 激动的心颤抖的手! 如何在Unity里创建Shader?创建材质?怎么把一个shader赋给材质?shader怎么赋给场景中的游戏对象?...如果你这些问题都有疑问——还不快去学!这篇博客不会讲这些基础的东西了,只会记录我想要写下来保存的内容(见谅~ 1 如何设置用Sublime打开Shader之前在学习Unity的时候需要写C#脚本,当时用的是Visual Studio 2022写的,external tool设定的就是VS2022,结果打开Shader发现,即使添加了ShaderlabVS插件,在VS里写Shader竟然无法自动缩进!每次都要一个tab一个tab的手打(心累),于是转战之前Houdini用的sublime。 于是,我参考下面这篇教程,想要完成同时达到:用VS打开C#,用sublime打开Shader,这一效果的配置 用SublimeText当Unity Shader的编辑器 - meteoric_cry - 博客园 (cnblogs.com) 结果我只完成了在sublime里添加Unity Shader包的操作,怎么都实现不了Unity双击.shader文件自动跳到sublime打开的效果,索性直接用了最粗暴的办法: 直接修改系统打开目标文件的默认程序,.shader文件选择“始终以sublime打开”,.cs文件选择“始终以VS 2022打开”。 这种粗暴的办法用起来也没啥不妥,但是其实用sublime写Shader也有不爽的地方——不能自动美化格式,但他可以自动缩进呀!相比VS已经够香的了~ 2 我使用的Unity版本和环境Unity我用的是Unity2021.3.8f1,但《入门精要》书是2016出版用的是Unity5.2.1,上Unity官网看的话,Unity版本3.x --> 4.x --> 5.x --> 2017.x --> ... --> 2022.x,时间线是依次推进的。 系统的话我是用的Win10,Windows是基于DirectX的。 不同Unity版本内置函数的使用既然提到了Unity版本,这里就先打个预防针,要留意一些Unity不同版本之间内置函数使用的差异性,比如我在学习后面的内容时遇到了:
shader中的UnityObjectToClipPos和UNITY_MATRIX_MVP 上文中清楚的提到了Unity5.6版本之后,Shader中的:
不过,我发现Unity还是很智能的,它会帮你转换写的低版本函数。 3 Unity Shader与ShaderlabUnity提供了Unity Shader让我们能更加轻松地管理着色器代码以及渲染设置,由于渲染设置包含了很多相对复杂的内容,例如逐片元操作(也叫合并)中——做的很多测试工作(深度测试、模板测试)、开启/关闭混合功能等等,我们不需要复杂和冗长的代码去管理,使得上手就轻松了很多。 总之,Unity Shader意义虽然挺抽象,但它本质上就是一个文本文件,有了它,我们学习和编写着色器的过程变得更加简单。 行,那我们怎么才能去使用这个Unity Shader来实现控制呢?——Unity提供了ShaderLab这样一种说明语言,所有的Unity Shader都由它来编写。既然是说明语言,那一定有某些表说明的“标签”,在ShaderLab中这样的“标签”就是一些嵌套在花括号内部的语义(Properties、SubShader等等),这些语义定义了Unity Shader的结构。啊,还有一点,如果你学习过DirectX,一定知道它用FX效果文件(.fx)来管理渲染方式,它也包含了渲染状态的设置和HLSL代码,可以把ShaderLab和FX效果文件类比着记忆。 4 ?ShaderLab的语义ShaderLab的语义定义了整个Unity Shader的结构,语义的话有Properties、SubShader、Fallback语义块,它们三个是最最常用的语义,接下来我将参考《入门精要》中3.3章对语义部分的介绍进行叙述。 4.1 Properties语义块为什么会说Properties语义块是材质和Unity Shader的桥梁?因为它定义的内容就是一些材质属性(property),这些属性会在Unity的Inspector面板中展现出来,把材质属性在Inspector面板暴露出来,我们调整起来更加方便! 须知:即使我们不在Properties语义块中定义某些属性,只要在后续的代码段中定义变量,也能使用这些属性变量,因此Properties语义块的作用仅仅是为了让属性可视化在Inspector面板中。 一个Properties语义块格式通常如下:
其中, Name——名字,这是我们在Shader中访问它用到的属性名字,通常以一个下划线“_”开头 display name——显示名字,这是显示在Inspector面板中的名字 propertyType——属性类型,这是我们需要指定的类型,下面会举出常见的属性 DefaultValue——默认值,我们需要给每个属性指定默认值 4.1.1 常见的属性类型Properties语义块支持的属性类型
其中,?2D、Cube、3D的""内要么是空的,要么是Unity内置的纹理名称(black、white、bump等),至于它们是什么?在之前的HLSL常用函数介绍中,纹理映射函数就已经说过了纹理有1D(几乎不用了)、2D、Cube和3D。如果要指定纹理属性,需要在顶点着色器中编写计算相应纹理坐标的代码。 4.1.2 演示
4.2 SubShader语义块每个Unity Shader都会至少有一个SubShader语义块。由于不同显卡有不同的渲染能力(很好理解,高级的显卡有更多更复杂的计算能力,而低端一点仅支持部分指令),Unity加载当前Unity Shader时会扫描所有的SubShader语义块,选择一个适合当前平台运行的SubShader语义块。如果都不支持,那么就会使用Fallback语义(后续会提到)指定的Unity Shader。 一个SubShader语义块的格式通常如下:
4.2.1 渲染状态设置还记得第3节介绍Unity Shader的时候,介绍了它可以让我们更方便地处理渲染设置吗?这就是在SubShader中实现的。ShaderLab提供了一系列渲染状态的设置指令,可以设置显卡的各种状态,是否开启混合模式、是否开启深度测等等,把冗长的代码凝炼成了RenderSetup的指令! 题外话:这里也正好验证了介绍GPU管线概述提到的——逐片元操作我们可进行配置但不是可编程的,这一特性。 还须注意,
ShaderLab常见的渲染状态设置选项
4.2.2 SubShader的标签Tags是一个键值对(Key/Value Pair),键和值都是字符串类型。目的是告诉Unity引擎,当前的SubShader希望如何以及何时渲染当前对象。 还须注意,SubShader的标签类型和接下来讲的Pass语义块的标签类型不一样,不能互通用~ SubShader的标签格式通常如下:
SubShader的标签类型
定义的这些标签可以在Unity Shader的导入设置面板查看到: 4.2.3?Pass语义块Pass语义块可以说是最重要的部分,几乎整个渲染管线可编程的着色器代码都写在Pass语义块内了,它的格式通常如下:
可以是:
还可以使用ShaderLab的UsePass命令——通过访问其名字,直接使用其他Unity Shader中的Pass,这样可以提高代码的复用性,但须注意用UsePass命令时必须使用大写名字,例如:
前面说了,Pass的标签不同于SubShader的标签,但目的是一样的,都是告诉Unity如何渲染该物体,Pass的标签: Pass的标签类型
前面SubShader的状态设置同样适用于Pass。 4.3?Fallback语义块这个其实就是一个保证:万一当前的显卡实在太low了,现有的所有SubShader都无法运行,FallBack语义块就相当于一个最次备选,给他准备一个Fallback内置的最最low的Shader。 格式通常如下:
Fallback不仅有这一个功能,还能影响阴影的投射。渲染阴影纹理时,Unity需要在Unity Shader中寻找一个阴影投射的Pass,而Fallback刚好有内置的这样一个通用的Pass,有了它我们就不需要再单独写一个Pass了,说明正确设置Fallback是多么的重要! 5 Unity Shader的形式5.1 表面着色器学习渲染管线的时候似乎还没听说过这个着色器。 《入门精要》是这么描述的:它是Unity自创的一种着色器代码类型,本质上和顶点/片元着色器是一样的。总结下来有这两个特点,
5.2 顶点/片元着色器他们是老朋友了,在Unity中是用Cg/HLSL语言编写的,灵活性相比表面着色器高很多。这里就不介绍啥代码结构啦,后面当然会再次遇到,到时候再剖析也不迟。 5.3 固定函数着色器(被抛弃关于“固定”,其实我在PC和手机的主流图形API介绍中就提到了:“OpenGL ES 2.0——引入可编程着色器,弃用了1.x中需对固定功能”,其中的固定功能就是指的这个固定函数着色器,是OpenGL ES 1.1及之前的版本会用的,DX的话是7.0之前,现在只有一些旧设备需要使用啦,所以才会说“被抛弃”。 对于它我们不深入了解,只需要知道有过就行。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年5日历 | -2025/5/3 3:26:33- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |