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

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

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

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

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

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

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

 struct SurfaceOutput
{
half3 Albedo; //反射度
half3 Normal; //法线
half3 Emission; //物体自发光
half Specular; //镜面
half Gloss; //光泽
half Alpha; //透明
};

四、我们的表面着色器应该去用 #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)。

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

  1. 从一点儿不会开始——Unity3D游戏开发学习(一)

    一些废话 我是一个windows phone.windows 8的忠实粉丝,也是一个开发者,开发数个windows phone应用和两个windows 8应用.对开发游戏一直抱有强烈兴趣和愿望,但奈何 ...

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

    在着手研究Unity3D的游戏开发时,3D模型能够考虑从unity的assets store去获取,也能够从网上搜索下载,同一时候咱们也能够尝试下自己动手去做一些简单的模型. 这里就依据unity3d ...

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

    分类:Unity.C#.VS2015 创建日期:2016-03-23 一.基本思路 第1步--了解编辑器 首先了解unity3d的菜单,视图界面.这些是最基本的基础,可以像学word操作一样,大致能明 ...

  4. 从一点儿不会开始——Unity3D游戏开发学习(二) ——GUI控件之Button

    一些废话 我在上一篇“一点儿不会”的系列随笔中说大概一周会发个2~3篇关于Unity的学习笔记.可这就两周过去了,我还停留在一篇的进度上,主要是这两周发生了一些事情导致我更新缓慢.其实截至目前为止,上 ...

  5. Unity3D游戏开发和网络游戏实战书籍及配套资源和一些视频教程分享

    目录 1. 按 2. pdf 3. 配套资源 3.1. Unity网络游戏实战第二版 3.2. Unity网络游戏实战第一版 4. 视频教程 5. 更多坦克大战代码 1. 按 本文主要分享了: Uni ...

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

    昨日曾就某投资人把移动团队失败原因之中的一个归于选择Unity引擎进行了一番评论,工具本身无罪,但怎样理解工具.正确使用Unity引擎确实须要讨论,在选择Unity之前你也许须要了解下这个引擎实际开发 ...

  7. [Unity3D]Unity3D游戏开发之飞机大战项目解说

    大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比較综合的 ...

  8. [Unity3D]Unity3D游戏开发《反对》说到游戏(上)——目标跟踪

    朋友,大家好.我是秦培,欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 首先博主要自我反省,过了这么久才来更新博客,这段时间主要是在忙着写期末的作业,所以博主基本上没 ...

  9. [Unity3D]Unity3D游戏开发3D选择场景中的对象,并显示轮廓效果强化版

    大家好,我是秦培,欢迎关注我的博客,我的博客地址blog.csdn.net/qinyuanpei. 在上一篇文章中,我们通过自己定义着色器实现了一个简单的在3D游戏中选取.显示物体轮廓的实例. 在文章 ...

随机推荐

  1. UrlOper

    using System; using System.Text.RegularExpressions; using System.Web; using System.Collections.Speci ...

  2. winphone开发环境配置

    环境:操作系统win7 要进行winphone开发,必须进行一些环境的配置.下面是我的一些配置总结. 1.操作系统 winphone开发仅仅能在win8下开发.所以首先得安装win8.能够使用nt6 ...

  3. linux命令(32):cat

    1.cat 显示文件连接文件内容的工具: cat 是一个文本文件查看和连接工具.查看一个文件的内容,用cat比较简单,就是cat 后面直接接文件名. 比如: [root@localhost ~]# c ...

  4. 工具WinSCP:windows和Linux中进行文件传输

    工具WinSCP:windows和Linux中进行文件传输 2016-09-21 [转自]使用WinSCP软件在windows和Linux中进行文件传输 当我们的开发机是Windows,服务器是Lin ...

  5. rman备份,恢复

    ackup database format 'd:\tt\%U'; rman> restore database;rman> recover database; ============= ...

  6. js实现类似新闻条目人物简介不间断的滚动

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. LeetCode: Combination Sum II 解题报告

    Combination Sum II Given a collection of candidate numbers (C) and a target number (T), find all uni ...

  8. JVM致命错误日志(hs_err_pid.log)分析(转载)

    当jvm出现致命错误时,会生成一个错误文件 hs_err_pid<pid>.log,其中包括了导致jvm crash的重要信息,可以通过分析该文件定位到导致crash的根源,从而改善以保证 ...

  9. Android开发日记(四)

    在服务器端数据库新建一个表ad 在DataInfo.edxm模型中点击从数据库更新模型,发布. 就新建了一个实体ad 然后新建cs文件 using System; using System.Colle ...

  10. web编码

    1各种编码 A .1 html编码  -HTML标签 this.Response.Write(this.Server.HtmlEncode("<h1>的作用将文本设置为标题样式! ...