我正在尝试实现Jorge Jimenez在此演示文稿上解释的视差折射效果:http://www.iryoku.com/downloads/Next-Generation-Character-Rendering-v6.pptx,但我遇到了一些困难。这是有趣的部分的屏幕截图。



但是此文档缺少一些解释,尤其是第二部分有关基于物理的折射。

这是我目前所取得的成就。
这是简单的视差折射效果,正如您可能在屏幕截图中注意到的那样,当视差标度值为时,虹膜的掠射角会有小毛刺。太高了。

这是由视差计算引起的,但是有什么技巧可以避免或最小化这种问题?

我不想深入了解视差映射此刻,所以我不想使用陡峭的视差映射或视差遮挡映射。



这里是代码。没什么特别的。

// height value comes from a texture
float2 offset = height * viewDir;
offset.y = -offset.y;
texcoord -= ParallaxScale * offset;
// Next there is the texture sampling with the texcoord value


我还有一个关于基于物理折射的部分的另一个问题,该问题没有得到很好的解释,我想念如何计算一些值,例如refractedWfrontNormalWheightW。如果有人可以提供关于这些值的解释。

非常感谢。

#1 楼

这是我根据斯涅尔定律计算折射矢量的方法。

float cosine = dot(viewDir, worldNormal);
float sine = sqrt(1 - cosine * cosine);

float sine2 = (_IOR * sine);
float cosine2 = sqrt(1 - sine2 * sine2);

float3 x = -worldNormal;
float3 y = normalize(cross(cross(viewDir, worldNormal), worldNormal));
float3 refractedW = x * cosine2 + y * sine2;


这与基于物理的折射集成在一起,它给出了有趣的结果,但我仍然没有知道如何摆脱在掠射角出现的高视差等级问题...

任何想法如何摆脱这种情况吗?

评论


$ \ begingroup $
也许还有一些方法可以优化斯涅尔定律的计算,对此也欢迎任何建议。
$ \ endgroup $
–马特
16-10-17在15:50

#2 楼

在使用Unity时,我发现了一种计算引擎内部视差偏移的有趣方法。它不是基于物理的,但是它比经典的视差折射提供了更好的结果。

float2 ParallaxOffset(half h, half height, half3 viewDir)
{
    h = h * height - height / 2.0;
    float3 v = normalize(viewDir);
    v.z += 0.42;
    return h * (v.xy / v.z);
}