请说明PBR的工作原理,并提供一个Unity ShaderLab实现。
物理基础渲染(PBR)是一种流行的渲染技术,它基于物理定律来模拟表面反射。PBR材质可以根据光线的角度、环境和材质属性计算出正确的颜色,使得渲染结果更加真实。
PBR材质主要考虑以下两个因素:
在PBR中,材质表面的属性通常包括:
下面是一个简单的PBR Shader示例:
Shader "Custom/PBRShader"
{
Properties
{
_BaseColor("Base Color", Color) = (1, 1, 1, 1)
_Metallic("Metallic", Range(0, 1)) = 0.5
_Roughness("Roughness", Range(0, 1)) = 0.5
_MainTex ("Texture", 2D) = "white" {}
_NormalMap("Normal Map", 2D) = "bump" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Standard fullforwardshadows
#pragma target 3.0
sampler2D _MainTex;
sampler2D _NormalMap;
float4 _BaseColor;
half _Metallic;
half _Roughness;
struct Input
{
float2 uv_MainTex;
float2 uv_NormalMap;
};
void surf (Input IN, inout SurfaceOutputStandard o)
{
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb * _BaseColor.rgb;
o.Metallic = _Metallic;
o.Smoothness = 1 - _Roughness;
o.Normal = UnpackNormal(tex2D(_NormalMap, IN.uv_NormalMap));
}
ENDCG
}
FallBack "Diffuse"
}
这个Shader使用了Unity内置的Standard
光照模型,通过Properties定义了材质的基本属性,如基础颜色、金属度、粗糙度等。surf
函数中,我们根据这些属性设置了表面输出的Albedo(基础颜色)、Metallic(金属度)、Smoothness(光滑度)和Normal(法线)。
要使用这个Shader,只需将其分配给任何Unity中的材质,并调整其属性即可。