虚幻4引擎中的着色器外文翻译资料

 2022-11-06 15:19:48

英语原文共 59 页,剩余内容已隐藏,支付完成后下载完整资料


Real Shading in Unreal Engine 4

虚幻4引擎中的着色器

by Brian Karis, Epic Games

作者 Brian Karis, Epic Games

介绍

大约一年前,我们决定投入一些时间来改进我们的着色模型,并拥有更多基于物理的材料工作流程。这部分是由于我们想要渲染更逼真的图像,但我们也对通过更基于物理的方法可以实现什么材料创建和材料分层的使用感兴趣。喜欢追求美感的人觉得这对工作流程和质量将是一个巨大的改进,我已经在另一个工作室看到了这些好处,我们已经转换到离线合成的材料层。Epic的艺术家们在实验中使用我们的技术,在着色器中做了层次分明。成为一个额外的要求。

为了支持这个方向,我们知道材料分层需要简单和高效。与完美的时机来到迪斯尼的演示[2]关于他们的身体基础的阴影和用于Wreck-It Ralph的材料模型。布伦特·伯利证明了一个非常小的集合材料参数可以足够复杂以用于离线故事片呈现。他还表示一个相当实用的阴影模型可以很适合大多数采样材料。他们的工作成了灵感和基础,像他们的“原则”,我们决定为我们自己的系统定义目标:

实时性能

首先,它需要有效地使用许多一次性可见光;

降低复杂性

bull;应该尽可能少的参数。 一个大数组的参数或者导致决策麻痹,试验和错误或需要 许多价值的互连属性改变了一个单一的预期效果。

bull;我们需要能够互换使用基于图像的照明和分析光源,因此参数必须在所有光类型 中一致

直观的界面

bull;我们喜欢简单易懂的值,而不是诸如折射率之类的物理值。

感知线性

bull;我们希望通过掩模支持分层,但我们只能承受每个像素一次。 这个意味着参数混 合阴影必须尽可能匹配阴影结果。

容易掌握

bull;我们希望避免对电介质和导体的技术理解的需要以最小化创建基本的物理似真的 材料所需的努力。

强大的

bull;应该很难错误地创建物理上不可信的材料。

bull;所有参数组合应尽可能稳定和合理。

富有表现力

bull;延迟着色限制了我们可以拥有的着色模型的数量,因此我们的基础着色模型需要 具有足够的描述性,以覆盖真实世界中发生的99%的材料。

bull;所有可分层材料都需要共享相同的参数集,以便在它们之间进行混合。

灵活

bull;其他项目和许可证持有者可能不会共享照片写实的相同目标,因此需要足够灵活, 使非照片级的渲染。

着色模型

弥散BRDF

我们评估了Burley的弥漫模型,但与朗伯弥散相比只有很小的差异(等式1),所以我们不能证明额外的成本。 此外,任何更复杂的扩散模型将难以有效地利用基于图像或球面谐波照明。 结果,我们没有投入太多精力来评估其他选择。

f(l,v) =Cdiff/pi; (1)

其中c diff是材料的漫反射率。

微面镜面BRDF

一般的Cook-Torrance [5,6] microfacet镜面阴影模型是:

f(l,v) =D(h)F(v,h)G(l,v,h)/4(n · l)(n · v) (2)

有关详细信息,请参见本课程中的[9]。

我们开始与迪斯尼的模型,并评估每个术语的重要性相比,更多高效的替代品。 这比它听起来更困难; 每个术语的公布公式不必须使用相同的输入参数,这对于正确的比较是至关重要的。

镜面D

对于正态分布函数(NDF),我们发现迪斯尼的GGX / Trowbridge-Reitz的选择非常值得。 使用Blinn-Phong的额外费用相当小,自然的外观由更长的“尾巴”吸引我们的艺术家。 我们也采纳了迪士尼重新参数化alpha;=粗糙度2

D(h) =alpha;2/pi; ((n · h) 2 (alpha; 2 minus; 1) 1) 2 (3)

镜面G

我们评估了更多的镜面几何衰减项的选择比任何其他。 到底,我们选择使用Schlick模型[19],但是k =alpha;/ 2,以便更好地拟合史密斯模型GGX [21]。 通过这个修改,Schlick模型与alpha;= 1完全匹配Smith,是一个公平的在范围[0,1]上的近似近似(图2所示)。 我们还选择使用迪斯尼的修改以通过使用(粗糙度 1)/2重新映射粗糙度来减少“热”之前平方。 重要的是要注意该调整仅用于分析光源; 如果应用于基于图像的照明,掠射角的结果将太暗。

k =(Roughness 1) 2/8

G 1 (v) =n · v/((n · v)(1 minus; k) k)

G(l,v,h) = G 1 (l)G 1 (v) (4)

镜面F

对于Fresnel,我们使用Schlick的近似法作为典型的选择[19],但是,我们使用球形高斯近似[10]来代替幂。 它是更多高效地计算和差异是不可察觉的。 公式是:

F(v,h) = F 0 (1 minus; F 0 )2 (minus;5.55473(v·h)minus;6.98316)(v·h) (5)

其中F 0是法线入射时的镜面反射率。

图2:Schlick与k =alpha;/ 2非常接近地匹配Smith

基于图像的照明

要使用基于图像的照明的阴影模型,需要求解辐射积分通常使用重要性抽样来完成。 下面的公式描述了这种数值积分:

(6)

以下HLSL代码显示了如何使用我们的着色模型:

float3 ImportanceSampleGGX( float2 Xi, float Roughness, float3 N )

{

float a = Roughness * Roughness;

float Phi = 2 * PI * Xi.x;

float CosTheta = sqrt( (1 - Xi.y) / ( 1 (a*a - 1) * Xi.y ) );

float SinTheta = sqrt( 1 - CosTheta * CosTheta );

float3 H;

H.x = SinTheta * cos( Phi );

H.y = SinTheta * sin( Phi );

H.z = CosTheta;

float3 UpVector = abs(N.z) lt; 0.999 ? float3(0,0,1) : float3(1,0,0);

float3 TangentX = normalize( cross( UpVector, N ) );

float3 TangentY = cross( N, TangentX );

// Tangent to world space

return TangentX * H.x TangentY * H.y N * H.z;

}

float3 SpecularIBL( float3 SpecularColor, float Roughness, float3 N, float3 V )

{

float3 SpecularLighting = 0;

const uint NumSamples = 1024;

for( uint i = 0; i lt; NumSamples; i )

{

float2 Xi = Hammersley( i, NumSamples );

float3 H = ImportanceSampleGGX( Xi, Roughness, N );

float3 L = 2 * dot( V, H ) * H - V;

float NoV = saturate( dot( N, V ) );

float NoL = saturate( dot( N, L ) );

float NoH = saturate( dot( N, H ) );

float VoH = saturate( dot( V, H ) );

if( NoL gt; 0 )

{

float3 SampleColor = EnvMap.SampleLevel( EnvMapSampler, L, 0 ).rgb;

float G = G_Smith( Roughness, NoV, NoL );

float Fc = pow( 1 - VoH, 5 );

float3 F = (1 - Fc) * SpecularColor Fc;

// Incident light = SampleColor * NoL

// Microfacet specular = D*G*F / (4*NoL*NoV)

// pdf = D * NoH / (4 * VoH)

SpecularLighting = SampleColor * F * G * VoH / (NoH * NoV);

}

}

return SpecularLighting / NumSamples;

}

即使是重要性抽样,仍需要采集许多样品。 样品计数可以通过使用mip图显着减少[3],但计数仍然需要大于16。 因为我们在每个像素的许多环境地图之间混合局部反射,我们只能实际上为每个样品提供单个样品。

分割和近似

为了实现这一点,我们通过将它分成两个和来近似上述和。 每个单独的总和可以然后进行预先计算。 这种近似对于常数L i(1)是精确的并且对于共同是相当准确的环境。

预过滤的环境地图

我们预先计算不同粗糙度值的第一个和,并将结果存储在mip-map中水平的cubemap。 这是游戏行业大多使用的典型方法[1,9]。 一微小的差别是我们将环境图与我们阴影的GGX分布进行卷积模型使用重要性抽样。 因为它是一个microfacet模型,分布的形状改变基于对表面的视角,因此我们假定该角度为零,即n = v = r。 这个各向同性假设是第二个近似的源,不幸的是我们没有得到漫长的反射在掠角。 与分割总和近似相比,这实际上是我们的IBL解决方案的更大的误差源。 如下面的代码所示,我们发现加权costheta;lk实现更好的结果:

float3 PrefilterEnvMap( float Roughness, float3 R )

{

float3 N = R;

float3 V = R;

float3 PrefilteredColor = 0;

const uint NumSamples = 1024;

for( uint i = 0; i lt; NumSamples; i )

{

float2 Xi = Hammersley( i, NumSamples );

float3 H = ImportanceSampleGGX( Xi, Roughness, N );

float3 L = 2 * dot( V, H ) * H - V;

float NoL = saturate( dot( N, L ) );

if( NoL gt; 0 )

{

PrefilteredColor = EnvMap.SampleLevel( EnvMapSampler, L, 0 ).rgb * NoL;

TotalWeight = NoL;

}

}

return PrefilteredColor / TotalWeight;

}

环境BRDF

第二个和包括一切。 这与将镜面BRDF与a相同全白环境 i.e. L i (l k ) = 1

通过在Schlick的Fresnel中代入:F(v,h)= F 0 (1-F 0)(1 - v·h)5,我们发现F 0可以从积分中提取出来。

这留下两个输入(粗糙度和costheta;v)和两个输出(比例和偏差到F 0),所有这些

方便地在[0,1]的范围内。 我们预先计算此函数的结果并将其存储在2D中

查找纹理(LUT)。<!--

剩余内容已隐藏,支付完成后下载完整资料


资料编号:[139305],资料为PDF文档或Word文档,PDF文档可免费转换为Word

您需要先支付 30元 才能查看全部内容!立即支付

课题毕业论文、外文翻译、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。