unity3d游戏开发学习分享之表面着色器讲解

一、三种着色器的书写格式:

  1、surface shaders, 指的是表面着色器

  2、vertex and fragment shaders and 指的是顶点和片段着色器

  3、fixed function shaders. 指固定功能着色器

  二、顶点着色器与片段着色器

  我们可以这么理解,在Unity的三维空间中,所有复杂模型都是由无数个三角形构成的,那么顶点(Vertex)就是说,这些构成复杂模型的三角形的顶点,而片段(fragment)就是这些三角形的填充区域了。

  三、表面着色器(Surface Shader)标准的输出结构:

1 struct SurfaceOutput
2 {
3 half3 Albedo; //反射度
4 half3 Normal; //法线
5 half3 Emission; //物体自发光
6 half Specular; //镜面
7 half Gloss; //光泽
8 half Alpha; //透明
9 };

四、我们的表面着色器应该去用 #pragma surface surfaceFunction lightModel [optionalparams] 指令,这起到一个声明的作用。

  1、surfaceFunction:接下来,该段表示了在Cg函数中有着表面着色器(surface shader)的代码。格式应该如下:void surf (Input IN,inout SurfaceOutput o), Input是自定义结构,该结构其中应该包括我们所有的纹理坐标(texture coordinates)以及表面函数(surfaceFunction)需要的额外必要变量。

  2、lightModel:就是说使其能够在光照的模式下应用,其内置是Lambert(diffuse)和 BlinnPhong(specular)。

  五、着色器附加输入结构:

  1、float3 viewDir:视图方向(view direction) 的值。这里由于我们需要去计算视差效果(Parallax effects)以及边缘光照(rim lighting)等等,所以我们要包含视图方向(view direction)的值。

  2、float4 COLOR:各个顶点中(per-vertex)颜色插值。

  3、float4 screenPos:屏幕空间中的位置信息。这里因为我们可以去使用反射效果,所以说我们就需要在其中包含屏幕空间中位置的信息。

  4、float3 worldPos:世界空间位置。

  5、float3 worldRefl:世界空间反射向量。这里的话,如果我们的表面着色器(surface shader)不通过法线(o.Normal)参数,那么其将自行包含该参数。

  6、float3 worldNormal:世界空间法线向量(normal vector)。这里指的是如果表面着色器(surface shader)不通过法线法线(o.Normal)参数,那么它将包含这个参数。

  7、float3 worldRefl(INTERNAL_DATA):世界空间反射向量。指表面着色器(surface shader)如果不写入法线(o.Normal)参数,那么将自行包括该参数。我们为了能成功获取到每个顶点法线贴图( per-pixel normal map)的反射向量(reflection vector),所以我们就需要去应用世界的反射向量(WorldReflectionVector (IN, o.Normal))。

  8、float3 worldNormal(INTERNAL_DATA):世界空间法线向量(normal vector)。这里说表面着色器(surface shader)如果不写入法线(o.Normal)参数,那么就会包含这个参数。同样的,我们为了成功获取每个顶点法线贴图( per-pixel normal map)的法线向量(normal vector),我们需要去应用世界法线向量(WorldNormalVector (IN, o.Normal))。

  六、光照模式声明

  该模式指的是以Lighting开头并且与名称组合到一起的规范函数。我们可以在着色器文件(shader file)或导入的文件(included files)中任何地方来声明它。这个函数如下所示:

  1、half4 LightingName(SurfaceOutput s, half3 lightDir, half atten):指的是正向渲染路径中(forward rendering path)所应用的模式,顺便提醒大家,它并不是取决于视图方向的(view direction)。

  2、half4 LightingName(SurfaceOutput s, half3 lightDir, half3 viewDir, half atten):在正向渲染路径(forward rendering path)所应用的光照模式。它是取决于视图方向的(view direction)。

  3、half4 LightingName_PrePass(SurfaceOutput s, half4 light):这是在延时光照路径(deferred lighting path)中使用的。

  当定向解码光照贴图用于向前/延迟光照中的光照函数,或类似的函数中时,需要进行定制。

  1、half4 LightingName_DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, bool surfFuncWritesNormal):这是使用的不依赖于视图方向(view direction)的光照模式(light model)。

  2、half4 LightingName_DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, half3 viewDir, bool surfFuncWritesNormal, out half3 specColor):这是使用的依赖于视图方向(view direction)的光照模式(light model)。

时间: 2024-10-12 21:41:16

unity3d游戏开发学习分享之表面着色器讲解的相关文章

unity3d游戏开发学习之使用3dmax创建导弹模型

在着手研究Unity3D的游戏开发时,3D模型能够考虑从unity的assets store去获取,也能够从网上搜索下载,同一时候咱们也能够尝试下自己动手去做一些简单的模型. 这里就依据unity3d坦克大战教学视频,来制作一个简单的导弹模型:包括弹头,弹身,尾翼.当中,弹头,单身都是使用胶囊来实现,尾翼是使用多边形来实现. 一.制作弹体 打开3dmax后,右側的工具栏中,选择"扩展基本体",这时就能够看到能够选择的形状有异面体.环形结等多种. 选择胶囊,将光标放到原点处開始拖动,拖动

【Unity】1.3 Unity3D游戏开发学习路线

分类:Unity.C#.VS2015 创建日期:2016-03-23 一.基本思路 第1步--了解编辑器 首先了解unity3d的菜单,视图界面.这些是最基本的基础,可以像学word操作一样,大致能明白有几个菜单,几个基本的视图,各自起什么作用就可以了.当然还要了解人物基本的比例和结构. 第2步-了解基本概念 理解场景里面的坐标系统,输入系统,简单的向量概念.Unity3D的坐标系统及向量概念如果不理解清楚,不理解世界坐标,局部坐标的关系,即使一个简单的移动,缩放,旋转的几行代码,也会困惑你半天

unity3D游戏开发学习之使用perfab(预设)创建很多导弹并发射

unity中,perfab是一个很重要的知识点,它是可重复利用的Game Object.这使我联想到cocos2dx中的CCSpriteBatchNode批次渲染可以大大提高渲染效率.同样,unity中的perfab使用批量物体的渲染如大量子弹.城墙等.好,下面我们来在unity中创建导弹. 一.导入3D模型 如果还不知道如何制作简单的3D导弹模型,或者没有该模型的,可以参考这篇文章: http://blog.csdn.net/wangbin_jxust/article/details/2467

Unity3D游戏开发之当游戏开发遇上Excel

各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是http://blog.csdn.net/qinyuanpei. 今天我们的话题是Excel,作为常用的办公软件的Excel相信大家都不陌生啦.可是如果我们认为Excel只是办公软件的话,那么这就不只是天真而是Out了.事实上Excel和游戏开发有着密切的联系,不知道大家还记不记得那款利用Excel开发出来的三国杀,这可能是Excel第一次以游戏开发的身份出现在大家面前吧.我们知道在游戏开发领域有一种工作叫做策划,就像在软件开发领

Unity3D游戏开发之开发游戏带来的问题

昨日曾就某投资人把移动团队失败原因之中的一个归于选择Unity引擎进行了一番评论,工具本身无罪,但怎样理解工具.正确使用Unity引擎确实须要讨论,在选择Unity之前你也许须要了解下这个引擎实际开发过程中的技术特点.以及适应的游戏产品类型,热心读者Fxcarl昨天就这个问题专门撰文一篇,来帮助大家了解Unity游戏开发.分享心得,推荐阅读. 代码驱动带来的技术题 游戏碎片化.U3D 引擎有个非常有力的特色,就是实时编译执行.这意味着不管在不论什么时候,仅仅要按下执行图标,当前的场景就会进入可执

Unity3D游戏开发之设置动画(Animations)属性

Unity3D游戏开发之设置动画(Animations)属性 通过创建角色动画Avatar,在新的动画系统Mecanim中,Unity就设置了角色动画的骨架和蒙皮信息,从而就可以在Unity中实现角色动画了. 切换到动画(Animations)选项卡.选中导入动画(Import Animation)的选项.如果该文件中有动画数据,可以看到动画剪辑的列表(Clips). Tips: Rig选项卡中动画类型(Animation Type)如果选则的是旧版(Legacy),Animations中的属性

Unity3D游戏开发之动画模型导入

Unity3D游戏开发之动画模型导入 导入动画文件后,在工程(Porject)面板中选中,通过Inspector面板修改参数设置. 在项目视图中选中模型文件.如果想用旧版3.x的动画系统导入和编辑动画,请选择legacy选项.如果你有一个人性角色,比如,一个脑袋两条胳膊的两足动物,请选择Humanoid和'Create from this model',这样,一个完美匹配你角色骨骼关系的替身就可以被创建,或者你也可以选择其他预设好的替身. 如果你的角色不是人形物体,比如一个四足动物或者任何其它的

Unity3D游戏开发之虚拟现实项目开发流程

Unity3D游戏开发之虚拟现实项目开发流程 欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,[狗刨学习网]unity极致学院,致力于打造业内unity3d培训.学习第一品牌. 一.系统设计与资料的收集与整理 1.              与项目投资单位沟通并进行系统设计: 2.              收集整理规划图.效果图.现场照片: 3.              拍摄比干文化及景区介

Unity3D游戏开发之《愤怒的小鸟》弹弓实现技能培训

今天我们来做一个高端大气上档次的东西.我相信大家都玩过一款叫做<愤怒的小鸟>的游戏,这款游戏之所以能够受到玩家的喜爱,是因为这是一款物理游戏,在游戏中处处充满了物理.我们熟悉的抛物线.引力等物理元素都在这款游戏中得到了体现.那么<愤怒的小鸟>这款游戏使用的正是Unity引擎,所以我们在游戏中看到了各种各种有趣的物理现象.那么,我们今天呢,就以<愤怒的小鸟>游戏中的小鸟发射器——弹弓为例,来讲述在Unity中如何实现弹性效果. 下面我们开始今天的Unity3D游戏开发技能