Unity3D Shader基础教程
此教程将指引你如何建立自己的Shaders,让你的游戏场景看起来更好。Unity配备了强大的阴影和材料的语言工具称为ShaderLab,以程式语言来看,它类似于CgFX和Direct3D的语法,它不只纪录基本的端点或者映像点(vertex/pixel)资讯,也描述了材质所必要的一切资讯。 在unity材质检视器中可以看到Shaders的性质及多重shader(SubShaders)的描述,针对不同图形硬件,每个描述也都完整的说明了图形硬件的彩现状态,fixed function pipeline如何设定、vertex/ fragment programs如何作用。 Vertex and fragment程序可以使用高阶Cg程式语言或低阶shader组合。 在这个教程中,我们将描述如何使用fixed function与programmable pipelines两种方式于ShaderLab中撰写shaders,我们假设读者拥有基本的OpenGL或Direct3D彩现概念,并对cg有fixed function与programmable pipelines的常识,HLSL或GLSL编程语言技术,一些Shader教程与参考文件可于NVIDIA以及AMD的开发站上取得。 建立一个新的shader有两种方法,可以由菜单Assets->Create->Shader新增,或复制一个既有的shader再进行编辑,新的shader可以透过双击来启动编辑画面(UniSciTE) 下面开始介绍一个基础的shader范例:
复制代码 着色器:开始
复制代码 这个shader范例只是众多shader中最基本的一个,它定义了一个颜色性质,名称为Main Color,并指定了玫瑰色的效果(red=100% green=50% blue=50% alpha=100%),在调用时会跳过Diffuse的材质设定(_Color)并开启顶点光源。 要测试这个shader,你可以建立一个新的材质,并于Shader下拉菜单选择(Tutorial->Basic),再把这个新材质指定到物件上,拖拉材质检视器的颜色表并查看其变化。是时候研究更复杂的事情了! 假如你开启一个既有的复合shader,刚开始看可能会觉得有点难,在开始以前,我们将详细说明unity内建的VertexLit shader。这个shader使用fixed function pipeline产生标准的per-vertex照明。
复制代码 所有的shaders都必须以Shader作为开始,接着是这个shader的名称(例如:VertexLit),这个名称将会显示于检视器(Inspector)。所有的语法都必须放在{ }之内。 如果要把shaders放在unity的submenus下面,请使用斜线,例如:MyShaders/Test,你将会看到有个submenu名为MyShaders,下面有个shader名为Test,或是像这样MyShaders->Test在Properties block下面接着的是SubShader block,每个描述都在这个段落中 Properties properties block内的语法都是单行的,每一个性质描述都由内名称开始(例如:Color,MainTex),在后方的括弧号中所显示的名字也会显示于inspector检视器上,在此之后,描述的是该性质的预设值: 可用的性质类型请参考Properties Reference。预设值与性质有关,以color为例,预设值应该由四个值组成。 现在我们已经定义了四个性质,可以开始撰写实际的shader了在开始以前,先了解shader的结构是如何定义的。 不同的绘图卡有不同的能力,例如:有的绘图卡支援fragment programs但有些没有,有些可以一次处理四个贴图?(four textures)其他的可能只能处理两个或一个,为了要符合所有用户的硬体需求,一个shader可以包涵多个SubShaders,当unity在运算shader时,它将详细察看所有的subshaders而且使用硬体可支持的第一个。
复制代码 此系统提供unity可以支援现有所有的硬体并取得最佳的品质。它作到了,然而,结果是必须撰写很长的shaders语法在每一个SubShader block,你可以设定彩现途径的状态;并定义彩现途径本身。完整的SubShader语法请参照SubShader Reference章节
复制代码 通过指令可以定义一个特殊的方法,用来驱动绘图硬体彩现指定的几何物件 例如:上方语法中有一个Material block,定义了照明时所需要几项固定参数。而指令LightingOn用来开启该照明设备,SeperateSpecular On则是启用Seperate作为特殊镜射效果。到目前为止的所有命令,皆属于支援OpenGL/Direct3D技术硬体本身可使用的固定功能,您可以参考OpenGL红皮书,可以找到更多相关资料。 下一个命令是SetTexture,这是个非常重要的命令,这个命令可以定义影像纹理如何混合、组合以及如何运用于我们的彩现环境里,SetTexture通常跟随于纹理的属性名称之后(我们在这里使用_MainTex ),接下来的combiner block也是定义纹理的应用方式,这个combiner block的命令会在萤幕显示每一个被执行的动作。 让我们开始了一个着色器的一般结构小回顾:
复制代码 最后,我们在这里引入一个新的命令: 该着色的基本构建块,介绍了在第一渲染教程,而性能完整的文件,SubShaders并通过提供。阿建设SubShaders快速方法是使用证在其他着色器定义。该命令UsePass正是如此,所以你可以重用一个整洁时尚着色器代码。作为一个例子下面的命令使用的名称,通过“基地”从内置的镜面着色:
复制代码 着色:顶点和片段程序 为了UsePass为了工作,这个名字必须考虑的一个传递希望使用。通过名称内的命令给它一个名字:
复制代码 顶点和片段方案 写作顶点/片断程序需要一个三维转换,照明和协调空间 - 透彻的认识,因为你必须重写固定功能是一样的OpenGL的API将自己的建造。另一方面,你可以做更多比内置的! 利用ShaderLab Cg语言 当您选择一个项目视图着色,检查员Cg语言编译后显示,这可能有助于在调试援助着色文本。统一自动编译的CG OpenGL和Direct3D的片段,所以你的着色器,使用Cg的工作都将只。请注意,因为企业管治守则是由编辑编译,你不能创建Cg的从脚本在运行时着色器。 一般来说,Cg的片段放在里面通行证块。他们看起来像这样:
复制代码 下面的例子演示了一个Cg的方案,使得对象的颜色正常人完全着色:
复制代码 当应用于一个对象,将图像中的结果如下(如果您的图形卡支持顶点和片段的过程中方案): 我们的“平均值显示”着色没有任何属性,包含一个是空的,除了单一的企业管治守则证单SubShader。最后,向在VertexLit着色器内置的定义后备。让我们解剖了部分企业管治守则的一部分:
复制代码 整个Cg的片段之间写入CGPROGRAM和ENDCG关键字。在开始编译指令#pragma指令给出: 继汇编指令只是普通企业管治守则。我们首先包括一个内置的Cg的文件: 该文件包含常用UnityCg.cginc宣言等的着色器可以保持较小的功能。该文件本身是统一内发现的应用:/应用程序/统一/ Unity.app /目录/ CGIncludes / UnityCG.cginc。在这里,我们将使用appdata_base结构,V2F_POS_FOG宏观和PositionFog从该文件助手作用。我们可以只定义它们直接在着色,不包括文件的过程。 接下来,我们要定义一个片段“顶点”结构(这里命名为v2f) - 什么样的信息是从顶点传递到片断程序。我们通过标准的地位和雾参数和float3颜色参数。颜色将计算出的顶点程序和公正的片段程序的输出。 我们的出发定义的顶点程序 - 垂直功能。在这里,我们在计算标准方法使用UnityCG.cginc辅助功能(位置和雾)输入和输出作为一种颜色正常的:
复制代码 正常的组成部分是-1 .. 1范围内,而色彩在0 .. 1范围内,所以我们在规模和偏见的代码高于正常。接下来,我们定义一个片断程序 - 有关水土功能,只是颜色和产出计算为alpha组件1:
复制代码 就这样,我们的着色完毕!即使这样简单的着色器是非常有用的可视化网格法线。 当然,这种着色不响应所有灯光,而这其中,事情变得有点复杂,对渲染管线和光衰减有关详细信息,参考网页阅读。 下面是一个完整的着色器显示的颜色调制纹理。当然,你可以很容易地做一个纹理合成调用相同的,但问题是这里只是为了说明如何使用Cg的属性:
复制代码 这种着色结构是在前面的例子一样。在这里,我们定义两个属性,即_Color和_MainTex。企业管治守则内我们定义相应的变量:
复制代码 访问中看到着色性能更多信息,Cg语言。 顶点和片段程序在这里不做任何幻想;顶点程序使用从UnityCG.cginc的TRANSFORM_UV宏,以确保质地规模与偏移是正确应用,并片断程序公正样品的质地和颜色属性的繁殖。请注意,因为我们正在编写我们自己的节目片段在这里,我们不需要任何SetTexture命令。如何纹理着色器适用于完全控制的片断程序。 摘要 完整的ShaderLab参考手册在这里。我们也有一个阴影在forum.unity3d.com论坛,从而去那里得到你的着色器的帮助!编程快乐,享受团结和Shaderlab权力。 在这个block内我们设定了一个颜色值,并命名为_Color,我们会在后面使用这个颜色 在下个命令,我们指定如何混合纹理以及颜色值。我们用Combine命令来混合其他纹理或颜色,看起来像下面这样:
复制代码 这里的texture来源是当前的纹理(_MainTex),它将与主要的颜色互相搭配(*),主色为照明设备的颜色,它是由Material计算出来的结果。最终是这两个倍增后的结果会增加照明强度.aplha值(在逗号以后)是由constantColor倍增而得的结果。另一个常用的混合模式称为previous(在这个shader未使用),这是所有previous SetTexture的结果,并且可以用来混合多种纹理和颜色。 原文链接:http://www.u3dchina.com/forum.php?mod=viewthread&tid=1862&extra=page |
Unity3D Shader基础教程相关推荐
- Unity3D Shader官方教程翻译(三)
Unity3D Shader官方教程翻译(三) 1.Shader语法:Pass 1个Pass块可以使一个几何物体被一次渲染. Pass { [Name and Tags] [RenderSetup] ...
- Unity3D逆向基础教程第一课
课程名称:Unity3D逆向基础教程第一课 课程类型:Unity3D 课程内容: 1.unity逆向环境搭建 2.unity文件介绍 3.reflector工具使用 课程时长:25分钟 课程作者:Sa ...
- 【游戏渲染】【译】Unity3D Shader 新手教程(1/6)
http://gad.qq.com/article/detail/7175490 该文章来自用户转载 点击阅读原文 刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散, ...
- Unity3D Shader 新手教程(1/6)
刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散,这也造成初学者对Unity3D Shader编程望而却步.该系列教程的第一篇文章(译者注:即本文,后续还有5篇文章) ...
- 【译】Unity3D Shader 新手教程(1/6)
刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散,这也造成初学者对Unity3D Shader编程望而却步.该系列教程的第一篇文章(译者注:即本文,后续还有5篇文章) ...
- Unity Shader 基础教程
Unity-Shader-基础教程 在Github上看到一篇关于Unity-Shader的教程,感觉还不错,作者写的很好,很适合Unity-Shader的基础入门,我在这里翻译一下,分享给大家,英文水 ...
- 【Unity3D基础教程】给初学者看的Unity教程(零):如何学习Unity3D
转自:https://www.cnblogs.com/neverdie/p/How_To_Learn_Unity3D.html(http://www.cnblogs.com/neverdie/) Un ...
- 【Unity3D基础教程】给初学者看的Unity教程(四):通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider2D...
作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 在第一篇文章[Unity3D基础教程] ...
- 视频教程-shader 基础之 2D技巧集合-Unity3D
shader 基础之 2D技巧集合 多年游戏开发经验,曾担任主程,技术美术TA,现在是独立游戏开发者 是帧同步框架: LockstepEngine RayMarch框架: Unity-Raymarch ...
最新文章
- Solr索引和基本数据操作
- Linux内核探讨-- 第五章
- python在excel中的应用-Python利用pandas处理Excel数据的应用详解
- linux iptables扩展,脚本防火墙
- 汇总运行在Hadoop YARN上的开源系统
- 帝国整站PHP源码,帝国cms 诗词整站源码
- 使用 RUP 管理小型项目和团队
- 换发型算法_GitHub - fredliu168/yry: yry(颜如玉)—— 一个实现人脸融合的算法,可以接近腾讯天天P图疯狂变脸功能的效果...
- html 自动生产,【SQL】用Sql Server自动生产html格式的数据字典
- unity, Invoke延迟执行
- 一个盒子相对于另一盒子垂直居中的方法
- C++VS2019中新建自定义模板与删除自定义模板
- vue 封装dialog_GitHub - 1014156094/vue-mobile-dialog: Vue移动端基础组件 - 对话框
- 取最大值_举一反三17——线段平方和的最小值与最大值
- 早停法的应用(keras)
- Wifi模块—源码分析Wifi启动(Android P)
- 摩尔定律到摩尔第二定律
- 阿里云国际版核心渠道商
- 仓储委外加工/周转加工
- 哨向 Mika Lelush 2
热门文章
- 多旋翼无人机组合导航系统-多源信息融合算法附Matlab代码
- 交换机和路由器的区别_路由器与交换机的区别与联系
- 生物信息学:bedGraph文件、Bed文件转、BAM文件转化
- 把C盘正好分成100G的数值
- 论文 | 图理论 | 2021年斯坦福大学Jiaxuan You博士论文《用图赋能深度学习》译读 摘要和感谢
- simulink-他励直流电动机的直接启动仿真
- 关于APIC的一些概念
- android studio调试,华为手机连接电脑找不到HDB interface的解决方案
- 为什么不要去小公司上班?这是我血与泪的教训!!!
- QWidget子窗口适应父窗口大小