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游戏开发学习分享之表面着色器讲解的主要内容,如果未能解决你的问题,请参考以下文章
[Unity3D]Unity3D游戏开发之自己主动寻路与Mecanim动画系统的结合