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

Posted AaronBlog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)。

以上是关于unity3d游戏开发学习分享之表面着色器讲解的主要内容,如果未能解决你的问题,请参考以下文章

Unity Shaders学习笔记之表面着色器

Unity3D之Material(材质着色器纹理)

将着色器添加到游戏对象

[Unity3D]Unity3D游戏开发之自己主动寻路与Mecanim动画系统的结合

ShaderLab学习小结在标准表面shader中加入顶点着色器函数

Unity Shader入门精要学习笔记 - 第17章 Unity的表面着色器探秘