分享

【原创】Unity3d 表面着色器学习笔记

 雪柳花明 2016-05-31
本文永久地址:http://www./article/25.aspx,【文章转载请注明出处!】

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

1、surface shaders, 表面着色器
2、vertex and fragment shaders and 顶点和片段着色器 3、fixed function shaders. 固定功能着色器

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

三维空间中任何复杂的模型都是由若干个三角形组成的,顶点(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是你自己定义的结构。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)。 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多