书籍:
《Unity Shaders and Effects Cookbooks》 作者读的第一本书
《GPU 编程与CG 语言之阳春白雪下里巴人》可以帮助您了解硬件。这本书的作者写得非常好。
《Real-Time Rendering.3rd》 经典,但不适合初学者
《Unity shader入门精要》 一个女生写的书,适合大多数想学习unity Shader的初学者
《untiy3d ShaderLab实战详解》 适用于入门级unity着色器
《3D数学基础:图形与游戏开发》 如果你真的想学好shader,你必须学好数学。我认为这是一本比较系统、全面、适合入门的数学书。
《GPU编程精粹》系列高手可以尝试这个,但不适合初学者学习。
《Unity5.X从入门到精通》着色器章我相信官方水平
我暂时推荐这些书,但实际上还有更多。有需要的话可以互相交流。
博客和教材:
Stormy 着色器教程系列
Unity着色器官方手册
Unity 中的Cg 编程
CgCookie Shader初级视频教程
CgCookie Shader 中级视频教程
《unity shader入门精要》 作者博客
国外教学视频
这些是目前的学习材料。如果大家有更好的,欢迎补充。
逆天利器:
着色器锻造
用于编写着色器的可视化编辑器大大降低了编写着色器的难度。也方便开发者了解shader,大大提高开发效率,适合初学者(一般高手鄙视这个工具,都是高手手写)
Shader Forge插件百度网盘
Shader Forge 教学视频百度网盘
vs2013自动代码补全、语法高亮插件
相信大多数开发者都已经习惯了VS,但是VS不支持shader代码高亮和自动补全。这是无法容忍的。庆幸的是,作者在github上混了很多年,也有很多奇怪的人、奇怪的事,所以就找到了这个插件。
VS Code 高亮自动完成插件
shader基础
概念:Shader(着色器)实际上是一个小程序,负责将输入的Mesh(网格)与输入的纹理或颜色按照指定的方式组合起来,然后输出。绘图单元可以根据该输出将图像绘制到屏幕上。输入的纹理或者颜色等,加上对应的Shader,以及Shader的具体参数设置一起打包存储,结果就是一个Material。之后,我们就可以将材质分配给合适的渲染器进行渲染(输出)。
Shader只是一个指定输入(颜色、纹理等)和输出(渲染器可以理解的点和颜色之间的对应关系)的程序。 Shader开发者要做的就是根据输入进行计算和变换并生成输出。
如图所示:
可以用一句话来概括:
1.GameObject中有MeshRenderer。
2、MeshRenderer中有一个Material列表。
3、每种Material中只有一个Shader;
4.Material在编辑器中公开Shader的可调整属性。
所以,关键是shader怎么写。
unity自建shader使用说明:
Standard Surface Shader会生成一个包含标准护理模型的表面着色器模板(使用Unity5中新添加的基于物理的渲染方法)(为我们提供了典型的表面着色器实现方法)
Unity 着色器将生成一个基本的顶点/片段着色器,没有光照(但有雾)
图像效果着色器为我们实现各种屏幕后处理效果提供了基础模板。
计算着色器将生成一个特殊的着色器文件。这类着色器的目的是利用GPU的并行性来执行一些与常规渲染管线无关的计算。
Unity Shader文件操作说明:
显示生成的代码对于表面着色器,我们通过单击“显示生成的代码”按钮打开一个新文件,该文件将显示Unity 在幕后为表面着色器生成的顶点/片段着色器。
编译并显示代码下拉列表允许开发人员检查最终编译成Unity 着色器所针对的不同图像编程接口(例如opebgl、d3d9、d3d11 等)的着色器代码。我们可以使用这些代码来分析和优化着色器。
Unity内置shader文件分析:
CGincludes 文件夹包含所有内置包含文件
DefaultResources 文件夹包含某些内置组件或功能所需的统一着色器,例如某些GUI 元素使用的着色器。
DefaultResourcesExtra 包含统一的所有内置着色器
Editor文件夹目前只包含一个脚本文件,用于定义unity5中引入的标准着色器使用的材质面板。
(可以从官网下载内置文件:https://unity3d.com/cn/get-unity/download/archive)
Unity Shader的结构
在Unity中,当我们编写着色器时,我们使用ShaderLab。 ShaderLab 是Unity 提供的一种声明性语言,用于编写Unity 着色器。
基本结构如下:
简单来说,可以概括为下图:
着色器名称:
每个Unity Shader文件的第一行都需要通过Shader语义来定义Shader的名称。
着色器属性:
Properties语义块包含一系列属性,这些属性将显示在材质面板中。
属性的语义块通常采用以下形式:
其中,_Color代表属性的名称,‘Main Color’代表材质面板上出现的名称。颜色是为属性定义的类型。默认值代表我们为属性设置的默认值。当我们第一次将Unity Shader分配给材质时,它的默认值会显示在材质面板上。
上述类型可分为以下几类:
数值类型:默认值为data,如Int.Float.Range
四维向量:它们的默认值是用括号包围的四维向量,例如Color.Vector
纹理类型:它们的默认值由一个字符串后跟一个大括号指定,其中该字符串可以为空,也可以为内置纹理的名称,例如“black”、“white”等。 大括号的使用最初用于指定一些纹理属性,但这些选项在Unity 5.0之后的版本中被删除。
具体代码如下:
Properties 语义块的目的只是允许这些属性出现在材质面板中:
子着色器
1.设置渲染状态:
ShaderLab提供了一系列渲染状态设置指令。这些指令可以设置显卡的各种状态,例如开启混合/深度测试。具体选项如下。
2. 标签:
SubShader的标签是一个键值对,它的键和值都是字符串类型。这些键值对是SubShader和渲染引擎之间的沟通桥梁。标签的结构如下:
标签{ " TagName1 "=" Value1 " " TagName2 "=" Value2 "}
标签声明只能在SubShader 场景中声明,不能在Pass 块中声明。虽然也可以在Pass中定义标签,但这些标签与SubShader中的标签不同。具体内容请参考官方文档:https://docs.unity3d.com/Manual/SL-SubShaderTags.html
3.传递语义块:
【名称】:首先我们可以在Pass中定义Pass的名称。
[Tags]:Pass语义块的标签与SubShader的标签不同。以下是Pass 语义块中的标签类型:
4.后备:
该指令用于当其他SubShaders无法操作时,使用Fallback值中的Shader。
Unity Shader的形状:
固定管道
固定管道是为了与旧显卡兼容。它们都是顶点照明。未来,固定管线可能会成为Unity废弃的功能,所以最好不要学习它,当它不存在一样。
顶点/片段着色器
上图是可编程着色器的编程格式。它既复杂又高度灵活。它一直是编写着色器的最喜欢的方式。具体使用方法和参数请参考官方文档:https://docs.unity3d.com/Manual/SL-SubShaderTags.html
表面着色器
表面着色器是顶点/片段着色器之上的抽象包。目的是模拟人类的思维方式,大大降低开发人员的开发难度,使编写的程序易于理解和交流。代码量大大减少。但缺点是程序灵活性低、可扩展性低、性能消耗较高。
具体内容请参考官方文档:https://docs.unity3d.com/Manual/SL-SubShaderTags.html
选择Unity Shader的建议
1. 除非设备不支持可编程管线着色器,否则请考虑使用固定功能着色器。否则,请使用可编程管道着色器。
2. 如果要播放各种光源的资源,可以使用表面着色器,但要注意其在移动端的表现。
3.如果需要使用的灯光数量很少,那么顶点/片段着色器是更好的选择。
4. 如果有很多自定义渲染效果,请选择顶点/片段着色器。
总结
Shader是一门博大精深的学科,因为它涉及到很多计算机图形学相关的内容,仅仅靠一两篇博客是无法解释清楚和理解的。读者如果想要深入学习着色器编程,就必须花费大量的时间来打下基本功。学习不是一朝一夕就能完成的。而且,在学习的过程中,你不仅要知道“怎么用”,更重要的是“为什么要这样用”,通过问题的表象多思考问题的本质,这样才能继续朝着成为一个伟大的人的方向前进!
【Unity 渲染器基础教程与全面总结】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
想学做一个Unity里的游戏美术,这篇文章正好可以帮我入门!
有15位网友表示赞同!
一直对Shader这个东西比较好奇,终于有机会了好好学习一下。
有10位网友表示赞同!
入门指南太棒了,我最近刚开始接触Unity做3D作品,希望能帮上忙。
有8位网友表示赞同!
总结部分肯定很有用,能帮我理清 Shader 的应用场景和技巧。
有17位网友表示赞同!
看到"入门指南"就忍不住想点开看看,也许我也可以尝试制作一些特效啦。
有7位网友表示赞同!
Unity的Shader确实强大,这篇文章应该会有很多实用的小知识分享吧!
有20位网友表示赞同!
学习UGI一直都很想去深入理解Shader机制,这篇指南太好了!
有16位网友表示赞同!
希望入门指南能通俗易懂,这样我就好上手了。
有12位网友表示赞同!
我之前看过一些Shader的教程,感觉很抽象,不知道这篇文章会更具体?
有11位网友表示赞同!
学习Shader可以让我更好地控制游戏画面效果,真的很有吸引力!
有12位网友表示赞同!
看标题就知道这是一篇很棒的文章,收藏 duluuu~
有6位网友表示赞同!
我做的是平台游戏, Shader 也许能帮我制作一些新奇的效果呢?
有16位网友表示赞同!
想要在Unity里创作更酷炫的游戏画面,Shader 绝对是必不可少的技能!
有18位网友表示赞同!
终于找到了一些关于Shader学习的资源了,太开心了!
有13位网友表示赞同!
这篇指南能提供哪些具体的 Shader 应用案例呢?我很期待!
有9位网友表示赞同!
学习Shader 的途径很多,这款指南能让我更好地选择方向吗?
有7位网友表示赞同!
我曾经尝试过一些基础的 Shader,这篇文章会不会带给我全新的技巧?
有6位网友表示赞同!
学习 Shader 需要哪些基础知识?文章里有介绍吗?
有13位网友表示赞同!
我对Unity游戏开发很感兴趣,Shader也是重要的一部分!
有5位网友表示赞同!