马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册帐号
x
虚幻引擎4中的柔性轮廓
自从我第一次写了关于在虚幻引擎4中创建轮廓之后,我想知道是否可以将它们渲染为软的轮廓,而不是苛刻的二进制线,就像在Left 4 Dead或CS:GO的游戏中看到的,如下所示。
最近我做了一个快速实验,使用SpiralBlur的修改版本,这是Unreal Engine 4中提供的一个节点,并且正在使用一些自定义的着色器代码。 这是我得到的结果:
看起来不错 效果比二进制轮廓贵一点,因为我们在SpiralBlur节点中执行了几个步骤以使其看起来非常流畅。 后来在这篇文章中,我将谈论性能。 最终的图像显示了高距离参数的极端设置,从而更清晰地显示淡出。
材质图
不幸的是,我在Spiral Blur节点上找不到任何官方的UE4文档。 内置的实现将场景纹理和多次迭代创建... .螺旋模糊。 默认设置是大约128次迭代,这是非常大的! 我已经使用这个节点作为参考来创建自己的样本自定义深度缓冲区而不是场景颜色。
它的节点图是相当简单的,大多数的逻辑发生在自定义节点内,作为下面的代码示例被添加。
[C++] 纯文本查看 复制代码 float3 CurColor=0;
float2 NewUV = UV;
int i=0;
float StepSize = Distance / (int) DistanceSteps;
float CurDistance=0;
float2 CurOffset=0;
float SubOffset = 0;
float TwoPi = 6.283185;
float accumdist=0;
if (DistanceSteps < 1)
{
return Texture2DSample(CustomDepthTexture,CustomDepthTextureSampler,UV);
}
else
{
while (i < (int) DistanceSteps)
{
CurDistance += StepSize;
for (int j = 0; j < (int) RadialSteps; j++)
{
SubOffset +=1;
CurOffset.x = cos(TwoPi*(SubOffset / RadialSteps));
CurOffset.y = sin(TwoPi*(SubOffset / RadialSteps));
NewUV.x = UV.x + CurOffset.x * CurDistance;
NewUV.y = UV.y + CurOffset.y * CurDistance;
float distpow = pow(CurDistance, KernelPower);
CurColor += ceil(Texture2DSample(CustomDepthTexture,CustomDepthTextureSampler,NewUV))*distpow;
accumdist += distpow;
}
SubOffset +=RadialOffset;
i++;
}
CurColor = CurColor;
CurColor /=accumdist;
return CurColor;
}
性能
性能在850M移动GPU上以1280×720(约?1.5ms)测量,在我的GTX 980 Ti上运行,运行时间为1920×1080,后处理材料为0.8ms。 它在很大程度上取决于螺旋模糊中的迭代量。 您将要保持DistanceSteps和RadialSteps尽可能的低,同时保持平滑的边缘。 在演示中,我决定了4次DistanceSteps和8次RadialSteps,这是32次迭代。
结论
总而言之,答案是肯定的! 完全有可能使这项工作被实现。 我想象,可能会有更有效的方式来模糊自定义深度缓冲区以获得类似的结果,我只是利用可用的着色器代码快速获得概念证明。 重要的是要注意,远离对象的轮廓可以使它看起来略微不光滑,更薄的轮廓有助于柔性轮廓实现并且参数调整是一个问题。
原文标题:Soft outlines in Unreal Engine 4
|