Unity着色器学习
2016-03-23 16:01
447 查看
本文转载自:http://www.omuying.com/article/25.aspx
一. Unity中三种着色器书写格式:
1. surface shaders 表面着色器
2. vertex and fragment shaders and 顶点和片段着色器
3. fixed function shaders 固定功能着色器
二. 顶点着色器与片段着色器
三维空间中任何复杂的模型都是由若干个三角形组成,顶点就是指这些三角形的顶点,而片段(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)。
一. Unity中三种着色器书写格式:
1. surface shaders 表面着色器
2. vertex and fragment shaders and 顶点和片段着色器
3. fixed function shaders 固定功能着色器
二. 顶点着色器与片段着色器
三维空间中任何复杂的模型都是由若干个三角形组成,顶点就是指这些三角形的顶点,而片段(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)。
相关文章推荐
- unity实现多点触控代码
- 在Unity中实现动画的正反播放代码
- unity实现摄像头跟随
- Unity3D上路_01-2D太空射击游戏
- Unity3D上路_02-第一视角射击游戏
- Unity3D上路_03-塔防游戏
- Unity3D上路_04-基础资源介绍
- Unity3D上路_05-网络相关
- [软件资讯]Unity已支持将3D游戏导出成Flash
- Unity 武器拖尾效果
- unity常见问题之20题
- Unity3D动画存储插件
- unity 赛车相机跟随物体移动
- uLua中遇到的问题
- Unity3d 协程、调用函数、委托
- Unity3d摄像机Camera参数详解
- Unity3d多线程
- 猫都能学会的Unity3D Shader入门指南(一)
- iTween基础之Move(移动)
- Unity3d之Http通讯GET方法和POST方法