没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
1:UnpackNormal, UnityCG.cginc 里的函数
expand,标准法线解压函数
用法:o.Normal = UnpackNormal(packedNormal);
o.Normal = expand(packedNormal.xyz);
2:外部引用属性部分用下划线 ,结构体内的自定义函数不用下划线(规范)
Properties {
_MainTex ("Texture", 2D) = "white" {}
_BumpMap ("Bumpmap", 2D) = "bump" {}
_RimColor ("Rim Color", Color) = (0.26,0.19,0.16,0.0)
_RimPower ("Rim Power", Range(0.5,8.0)) = 3.0 }
SubShader {
。。。
struct Input {
float2 uv_MainTex; //定义_MainTex 的 UV 值
float2 uv_BumpMap;
float3 viewDir;
//输入结构 Input 通常具有着色器所需的所有纹理坐标。纹理坐标必须被命名为纹理名称前加“uv”(或以“uv2”开头以使
用第二纹理坐标集)。
//其他能放入 Input 结构中的值:
� float3 viewDir - 将包含视线方向,用于计算视差 (Parallax) 效果、边缘光照等。
� 带颜色 (COLOR) 语义的 float4 - 将包含插值逐顶点颜色。
� float4 screenPos - 将包含反射效果的屏幕空间位置。例如,在 Dark Unity 中由 WetStreet 着色器 (WetStreet
Shader) 使用。
� float3 worldPos - 将包含世界坐标空间位置。
� float3 worldRefl - 将包含世界坐标反射向量,条件是表面着色器不写入 o.Normal。具体示例可见反射 - 漫反射
着色器 (Reflect-Diffuse Shader)。
� float3 worldNormal - 将包含世界坐标法线向量,条件是表面着色器不写入 o.Normal。
� float3 worldRefl; INTERNAL_DATA - 将包含世界坐标反射向量,条件是表面着色器写入 o.Normal。要基于逐像
素法线贴图获得反射向量,请使用 WorldReflectionVector (IN, o.Normal)。具体示例可见反射 - 凹凸着色器
(Reflect-Bumped Shader)。
� float3 worldNormal; INTERNAL_DATA - 将包含世界坐标法线向量,条件是表面着色器写入 o.Normal。要基于
逐像素法线贴图获得法线向量,请使用 WorldNormalVector (IN, o.Normal)。
}
sampler2D _MainTex;
sampler2D _BumpMap;
float4 _RimColor;
float _RimPower;
}
3: viewDir 意为 World Space View Direction。就是当前坐标的视角方向
4: normalize(IN.viewDir);用于获取到的 viewDir 坐标转成一个单位向量且方向不变。
saturate(dot (normalize(IN.viewDir), o.Normal));算出一[0,1]之间的最靠近(最小值但大于所指的值)的
值
原理以下解释:
=>看图。
=>这里 o.Normal 就是单位向量。外加 Normalize 了 viewDir。因此求得的点积就是夹角的 cos 值。
=>因为 cos 值越大,夹角越小,所以,这时取反来。这样,夹角越大,所反射上的颜色就越多。于
是就得到的两边发光的效果。
5:属性值类型
half3 Albedo; //反射
half3 Normal; //法线
half3 Emission;//自发光
fixed3 AnisoDirection;
half Specular;//镜面反射
half Gloss;//
half Alpha;
6:表面着色器编译指令
� 必须将其放置于子着色器块中,而不能放在通道中。表面着色器自身会编译为多个通道。
� 它使用 #pragma surface ... 指令来表明它是个表面着色器。
#pragma surface 指令是:
#pragma surface surfaceFunction lightModel [optionalparams]
所需参数:
� surfaceFunction - 表明哪个 Cg 函数有表面着色器代码。该函数格式应为 void surf (Input IN, inout
SurfaceOutput o),其中“Input”是您定义的结构。Input 结构应包含表面函数所需的任何纹理坐标和额外自动变量。
� lightModel - 要使用的光照模型。内置的光照模型是 Lambert(漫反射)和 BlinnPhong(高光)。
Optional parameters:
� alpha - Alpha 混合模式。将该参数用于半透明着色器。
� alphatest:VariableName - Alpha 测试模式。将该参数用于透明镂空着色器。镂空值在有变量名 (VariableName) 的浮点
型变量中。
� vertex:VertexFunction - 自定义顶点修改函数。具体示例可见树皮着色器 (Tree Bark Shader)。
� finalcolor:ColorFunction - 自定义最终颜色修改函数。请参阅表面着色器示例。
� exclude_path:prepass 或 exclude_path:forward - 请勿为给定的渲染路径生成通道。
� addshadow - 添加阴影投射器 (shadow caster) 和集合通道 (collector pass)。通常与自定义顶点修改函数一起使用,使
得阴影投射也可获得所有程序性顶点动画效果。
� dualforward - 将双光照贴图用于正向渲染路径中。
� fullforwardshadows - 支持正向渲染路径中的所有阴影类型。
� decal:add - 附加的印花着色器(例如,地形 AddPass)。
� decal:blend - 半透明印花着色器。
� softvegetation - 使表面着色器仅在“软植被”(Soft Vegetation) 开启时被渲染。
� noambient - 请勿应用任何环境光照或球面调和光照 (spherical harmonics light)。
� novertexlights - 请勿在正向渲染 (Forward Rendering) 中应用任何球面调和光照 (spherical harmonic light) 或逐顶点
光照 (per-vertex light)。
� nolightmap - 在该着色器中禁用光照贴图支持(使着色器变小)。
� nodirlightmap - 在该着色器中禁用方向性光照贴图支持(使着色器变小)。
� noforwardadd - 禁用正向渲染附加通道。这会使着色器支持一个全方向灯,而其他所有光照则逐顶点/SH 被计算。也会使
着色器变小。
� approxview - 对于有需要的着色器,逐顶点而不是逐像素计算规范化视线方向。这种方法更快速,但当相机靠近表面时,
视线方向不会完全正确。
� halfasview - 将半方向向量(而非视线方向向量)传递到光照函数中。半方向向量将会被逐顶点计算和规范化。这种方法更
快速,但不会完全正确。
� tessellate:TessFunction - 使用 DX11 GPU 密铺 (tessellation);函数计算密铺 (tessellation) 系数。
7:顶点着色器函数详解
void main_v(
float4 position : POSITION, //镜头的位置属性
float4 normal : NORMAL, //镜头的法线属性
out float4 oPosition : POSITION, //输出到镜头的屏幕坐标
out float4 color : COLOR, //输出到镜头的顶点颜色
uniform float4x4 modelViewProj, //模型顶点的视野坐标
uniform float4x4 worldMatrix,//模型顶点的世界坐标
uniform float4x4 worldMatrix_IT,//模型顶点的自身坐标
uniform float3 globalAmbient,
uniform float3 lightPosition,
uniform float3 lightColor,
uniform float3 Kd)
{
oPosition = mul(modelViewProj, position); //屏幕的输出坐标 = 模型的视野坐标 X 镜头坐标
float3 worldPos = mul(worldMatrix, position).xyz; //顶点的世界坐标 = 顶点的世界矩阵 X 镜头
坐标
float3 N = mul(worldMatrix_IT, normal).xyz;//顶点的法向量 = 顶点的自身矩阵 X
N = normalize(N);
//计算入射光方向
float3 L = lightPosition - worldPos;
L = normalize(L);
//计算方向光漫反射光强
float3 diffuseColor = Kd*lightColor*max(dot(N, L), 0);
//计算环境光漫反射光强
float3 ambientColor = Kd*globalAmbient;
color.xyz = diffuseColor+ambientColor;
color.w = 1;
}
8 :漫反射与 Lambert 模型
I
diff
= I
ambdiff
+I
Idiff
=k
d
I
a
+K
d
I
a
(N·L)
9:镜面反射与 Phong 模型
I
spec
=K
s
I
l
(V·R)
n
剩余29页未读,继续阅读
资源评论
UNuomo
- 粉丝: 8
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功