但是此文档缺少一些解释,尤其是第二部分有关基于物理的折射。
这是我目前所取得的成就。
这是简单的视差折射效果,正如您可能在屏幕截图中注意到的那样,当视差标度值为时,虹膜的掠射角会有小毛刺。太高了。
这是由视差计算引起的,但是有什么技巧可以避免或最小化这种问题?
我不想深入了解视差映射此刻,所以我不想使用陡峭的视差映射或视差遮挡映射。
这里是代码。没什么特别的。
// 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
我还有一个关于基于物理折射的部分的另一个问题,该问题没有得到很好的解释,我想念如何计算一些值,例如
refractedW
,frontNormalW
或heightW
。如果有人可以提供关于这些值的解释。非常感谢。
#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;
这与基于物理的折射集成在一起,它给出了有趣的结果,但我仍然没有知道如何摆脱在掠射角出现的高视差等级问题...
任何想法如何摆脱这种情况吗?
#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);
}
评论
$ \ begingroup $
也许还有一些方法可以优化斯涅尔定律的计算,对此也欢迎任何建议。
$ \ endgroup $
–马特
16-10-17在15:50