4.4 KiB
Raw Blame History

title, date, excerpt, tags, rating
title date excerpt tags rating
GBuffer&Material&BasePass 2023-12-08 17:34:58

# GBuffer

UE5 GBuffer内容 UE GBuffer存储数据

OutGBufferA = WorldNormal/PerObjectGBufferData
OutGBufferB = Metallic/Specular/Roughness/EncodeShadingModelIdAndSelectiveOutputMask(GBuffer.ShadingModelID, GBuffer.SelectiveOutputMask);
OutGBufferC = BaseColor/GBufferAO
OutGBufferD = GBuffer.CustomData;
OutGBufferE = GBuffer.PrecomputedShadowFactors;

// 0..1, 2 bits, use CastContactShadow(GBuffer) or HasDynamicIndirectShadowCasterRepresentation(GBuffer) to extract  
half PerObjectGBufferData;

ToonGBuffer修改&数据存储:

OutGBufferA:PerObjectGBufferData => 可以存储额外的有关Tonn渲染功能参数
OutGBufferB:Metallic/Specular/Roughness => 
			? / SpcularMask(控制高光形状与Mask) / ? / ?
			//ToonHairMask OffsetShadowMask/SpcularMask/SpecularValue	
OutGBufferD:CustomData.xyzw => 
			ShaderColor.rgb / NoLOffset //ShadowColor这里可以在Material里通过主光向量、ShadowStep、Shadow羽化计算多层阴影效果。
OutGBufferE:GBuffer.PrecomputedShadowFactors.xyzw => 
			ToonDataID/ ToonObjectID(判断是否是一个物体) /OutlineMask 控制Outline绘制以及Outline强度 / ToonAO  
OutGBufferF:velocity => 
			? / ? / ? / ?

蓝色协议的方案 !蓝色协议的方案#GBuffer

Toon PerObjectGBufferData具体功能表

从3开始0、1、2已被占用。

  • ?

ToonData

高光

  • PBR高光使用Roughness控制是否可行是否需要传入GBuffer一个Mask贴图
  • 自定义高光:高光贴图、高光颜色、参数化高光形状、多层高光

顶点色

蓝色协议

用于存储一些低精度数据,插值即可

  • 顶点色:
    • R:阴影区域控制(强度) 0~1
    • G:描边宽度
    • B:ToonAO
  • 第二套顶点色UV Channel1
    • R:深度偏移
    • G:用来区分内轮廓不同部位的ID

蓝色协议的R:阴影区域标记 与 B:AO而罪恶装备使用贴图来传递信息。

罪恶装备

对阴影判断阈值的偏移。见前面着色部分顶点AO+手绘修正) R:阴影偏移 G:轮廓线根据与相机的距离扩大多少的系数 B:等高线 Z 轴偏移值

罪恶装备

8,G为阴影控AOR为高光强度参数金属和光滑材质的部分设置的更大一些。B通道用于照明控制。最大值为高光反之值越小高光越淡。

https://zhuanlan.zhihu.com/p/360229590一文中介绍了崩坏3与原神的计算方式

崩坏3的LightMap计算方式

half4 baseColor = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, input.uv.xy);
half4 LightMapColor = SAMPLE_TEXTURE2D(_LightMap, sampler_LightMap, input.uv.xy);
half3 ShadowColor = baseColor.rgb * _ShadowMultColor.rgb;
half3 DarkShadowColor = baseColor.rgb * _DarkShadowMultColor.rgb;

//如果SFactor = 0,ShallowShadowColor为一级阴影色,否则为BaseColor。
float SWeight = (LightMapColor.g * input.color.r + input.lambert) * 0.5 + 1.125;
float SFactor = floor(SWeight - _ShadowArea);
half3 ShallowShadowColor = SFactor * baseColor.rgb + (1 - SFactor) * ShadowColor.rgb;

二级阴影计算:

//如果SFactor = 0,DarkShadowColor为二级阴影色,否则为一级阴影色。
SFactor = floor(SWeight - _DarkShadowArea);
DarkShadowColor = SFactor * (_FixDarkShadow * ShadowColor + (1 - _FixDarkShadow) * ShallowShadowColor) + (1 - SFactor) * DarkShadowColor;

// 平滑阴影边缘
half rampS = smoothstep(0, _ShadowSmooth, input.lambert - _ShadowArea);
half rampDS = smoothstep(0, _DarkShadowSmooth, input.lambert - _DarkShadowArea);
ShallowShadowColor.rgb = lerp(ShadowColor, baseColor.rgb, rampS);
DarkShadowColor.rgb = lerp(DarkShadowColor.rgb, ShadowColor, rampDS);

//如果SFactor = 0,FinalColor为二级阴影否则为一级阴影。
SFactor = floor(LightMapColor.g * input.color.r + 0.9f);
half4 FinalColor;
FinalColor.rgb = SFactor * ShallowShadowColor + (1 - SFactor) * DarkShadowColor;

罪恶装备 对阴影判断阈值的偏移。见前面着色部分顶点AO+手绘修正) G : 轮廓线根据与相机的距离扩大多少的系数 B : 等高线 Z 轴偏移值 A : 轮廓厚度系数。0.5为标准1为最大厚度0为无等高线

蓝色协议

蓝色协议的方案

米哈游