设为首页 加入收藏

TOP

Unity3D 的物理渲染和光照模型(二)
2015-07-20 12:52:38 来源: 作者: 【 】 浏览:33
Tags:Unity3D 物理 渲染 光照 模型
e surf Toonstruct Input {float2 uv_MainTex;};sampler2D _MainTex;void surf (Input IN, inout SurfaceOutput o) {o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;}sampler2D _RampTex;fixed4 LightingToon (SurfaceOutput s, fixed3 lightDir, fixed atten){half NdotL = dot(s.Normal, lightDir);NdotL = tex2D(_RampTex, fixed2(NdotL, 0.5));fixed4 c;c.rgb = s.Albedo * _LightColor0.rgb * NdotL * atten * 2;c.a = s.Alpha;return c;}ENDCG}Fallback "Diffuse"}


?


toon


?


LightingToon模型计算了光强的朗伯系数NdotL并使用ramp纹理以将其离散化。该例子中仅映射了四级光强阶。不同的ramp纹理将细化地获得不同的toon shading变形。


?


ramp


镜面: Blinn-Phong模型


朗伯模型并不能仿真镜面反射材料。这种情况下就需要另一种技术; Unity4.x 采用了 Blinn-Phong 模型. 不需要计算法向量N 和光矢量 L的点积, 而是通过L和视角V的角平分矢量 H 来计算 :


BlinnPhong


? ? \[\mathrm{Lambertian\,model:} \,\,\,\     I = N \cdot L\]


Unity3D 的物理渲染和光照模型Unity3D 的物理渲染和光照模型Unity3D 的物理渲染和光照模型


? ?


数量?Unity3D 的物理渲染和光照模型 通过 Unity3D 的物理渲染和光照模型? 和 Unity3D 的物理渲染和光照模型?设置进一步计算。如果你想深入了解Unity中光照模型的计算, 可以下载其内置着色器的源码. 朗伯和Blinn-Phong表面函数都是在Lighting.cginc文件中计算的。而在 Unity5 中需要在遗产着色器(Legacy shaders)中寻找。


在Unity5中物理渲染


就像本文在前面提出的那样, Uniy4.x使用朗伯光照模型作为其默认着色器。Unity5中发生了改变, 其引入了 物理渲染 (PBR). 这个名字听起来相当有趣啊, 但是与其它光照模型没有什么不同。相比于朗伯反射, PBR提供了一个更加逼真的光线物体作用模型。术语physically 来源于,PBR考虑了材料的物理属性, 比如能量守恒以及光的散射。Unity5为艺术家和开发者提供了两种不同的方法,用于创建他们的PBR 材料: 金属工作流 和 镜面工作流。在前者中,一个材料对光的反射取决于其是什么样的金属(或者说,含有多少金属的量)。


简单来说就是,光是电磁波啊,其行为因接触到的是导体还是绝缘体而不同(电磁波唱由电场和磁场组成,但电场属性实际上比磁场属性更重要)。在镜面工作流中, 所提供的是镜面映射。尽管被当做两个不同的东西呈现出来, 金属材料和镜面材料实际上以不同的方式初始化同一个着色器;Marmoset 上有一个很好的例程展现了同样的材料如何通过金属和镜面工作流分别创建。这也是为什么当第一次接触 Unity5 着色器时会因为源代码中出现了同一事物却有两个工作流现象时会产生误解。 Joe Wilson 创建了一个相当清晰的例程来知道我们的艺术家:如果你想学习怎么通过 PBR 创建非常逼真的材质,这将是非常好的开始哟。如果需要更详细的技术信息,在 Unity5 博客里关于 PBR 的地方猛戳a very well done?primer


metallic


Unity5 中新光照模型名字既简单又标准。取这个名字是因为现在 PBR 是每一个 Unity3D 中新建对象的初始材料。而且,每一个新建的着色器文件会被自动配置为一个 PBR 表面着色器:


Shader "Custom/NewShader" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
?
CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf Standard fullforwardshadows
?
// Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0
?
sampler2D _MainTex;
?
struct Input {
float2 uv_MainTex;
};
?
half _Glossiness;
half _Metallic;
fixed4 _Color;
?
void surf (Input IN, inout SurfaceOutputStandard o) {
// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
// Metallic and smoothness come from slider variables
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
Shader "Custom/NewShader" {Properties {_Color ("Color", Color) = (1,1,1,1)_MainTex ("Albedo (RGB)", 2D) = "white" {}_Glossiness ("Smoothness", Range(0,1)) = 0.5_Metallic ("Metallic", Range(0,1)) = 0.0}SubShader {Tags { "RenderType"="Opaque" }LOD 200CGPROGRAM// Physically based Standard lighting model, and enable shadows on all light types#pragma surface surf Standard fullforwardshadows // Use shader model 3.0 target, to get nicer looking lighting#pragma target 3.0sampler2D _MainTex;struct Input {float2 uv_MainTex;};half _Glossiness;half _Metallic;fixed4 _Color;void surf (Input IN, inout SurfaceOutputStandard o) {// Albedo comes from a texture tinted by colorfixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;o.Albedo = c.rgb;// Metallic and smoothness come from slider variableso.Metallic = _Metallic;o.Smoothness = _Glossiness;o.Alpha = c.a;}ENDCG}FallBack "Diffuse"}


14行将告知 Unity3D 该表面着色

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇B树——思路、及C语言代码的实现 下一篇排序算法之快速排序

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: