Unity3D:光照贴图和着色器
推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生
光照贴图和着色器
本页包含有关如何使着色器与 Unity 光照贴图器兼容的信息。
元通行证
元通道是着色器通道,它为全局照明系统提供反照率和发射值。这些值与实时渲染中使用的值是分开的,这意味着您可以使用 Meta Pass 从光照烘焙系统的角度控制游戏对象的外观,而不会影响其在运行时的外观。
例如,如果您希望悬崖上的绿色苔藓在光照贴图中产生夸张的绿色间接光线,但不想在着色器的实时通道中重新着色地形。
Unity 的所有内置材质都具有 Meta Pass,并且标准着色器也包含 Meta Pass。 如果使用了它们,则无需执行任何操作便会启用 Meta Pass。 如果使用的是自定义着色器,您可以添加自己的 Meta Pass。
具有元通道的示例着色器
通过下面的着色器,可以指定仅由光照烘焙系统使用的反照率颜色和反照率纹理,而不会影响运行时的材质外观。 在这个例子中,发光是从 UV 中获取的; 但是可以使用任何值来控制发光。
Shader "Custom/metaPassShader"{
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
_GIAlbedoColor ("Color Albedo (GI)", Color)=(1,1,1,1)
_GIAlbedoTex ("Albedo (GI)",2D)="white"{}
}
SubShader {
// ------------------------------------------------------------------
// Extracts information for lightmapping, GI (emission, albedo, ...)
// This pass is not used during regular rendering.
Pass
{
Name "META"
Tags {"LightMode"="Meta"}
Cull Off
CGPROGRAM
#include"UnityStandardMeta.cginc"
sampler2D _GIAlbedoTex;
fixed4 _GIAlbedoColor;
float4 frag_meta2 (v2f_meta i): SV_Target
{
// We're interested in diffuse & specular colors
// and surface roughness to produce final albedo.
FragmentCommonData data = UNITY_SETUP_BRDF_INPUT (i.uv);
UnityMetaInput o;
UNITY_INITIALIZE_OUTPUT(UnityMetaInput, o);
fixed4 c = tex2D (_GIAlbedoTex, i.uv);
o.Albedo = fixed3(c.rgb * _GIAlbedoColor.rgb);
o.Emission = Emission(i.uv.xy);
return UnityMetaFragment(o);
}
#pragma vertex vert_meta
#pragma fragment frag_meta2
#pragma shader_feature _EMISSION
#pragma shader_feature _METALLICGLOSSMAP
#pragma shader_feature ___ _DETAIL_MULX2
ENDCG
}
Tags {"RenderType"="Opaque"}
LOD 200
CGPROGRAM
// Physically-based Standard lighting model, and enable shadows on all light types
#pragma surface surf Standard fullforwardshadows nometa
// 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"
}
元通技术信息
Enlighten 实时全局光照和光照贴图使用 Unity 的元通道从表面提取反照率值,并通过在每次反弹时使用表面反照率自行处理漫反射传输。
具有黑色(或几乎黑色)反照率的金属表面反射的光很少。由于光照贴图器仅处理漫射光传输,这意味着您可能会看到来自这些类型表面的反射光非常少。Unity 的内置元通道通过提供金属色调颜色的增强版本而不是物理上正确的反照率来说明这一点。这意味着即使从金属材料中,您也可以获得一些反弹。如果您想要不同的行为,您可以创建自定义元通行证。
内置元通道不处理光谱镜面反射。
注意:如果您使用的是 Enlighten 实时全局光照,则播放机中的元通道不如 DynamicGI.SetEsütive 快,但它更灵活,因为您不限于单一颜色。
自定义 RGB 透明度
默认情况下,Unity 中的着色器使用单色透明度。这意味着 Unity 使用材质颜色或反照率纹理的 Alpha 通道来评估通过材质的透光率。
在光照贴图期间,您可以改用自定义 RGB 透明度。这意味着 Unity 使用给定纹理的值来评估通过材质的透光率。当您想要独立于材质颜色或反照率纹理的基于颜色的透明度时,这很有用;例如,如果要烘焙模拟通过彩色玻璃窗照射的光线行为的照明。
要在光照贴图期间使用自定义 RGB 透明度,请将以下行添加到 ShaderLab 代码中:
_TransparencyLM ("Transmissive Texture", 2D) = "white" {}
这将创建一个材质属性,该属性显示在材质检查器中,名称为“透射纹理”。将所需的纹理分配给此字段。
由3D建模学习工作室整理翻译,转载请注明出处!