2016-02-04 73 views
3

它会出现标准资产效应Screen Space Ambient Obscurance不适用于正交相机。这很奇怪,因为基本的SSAO脚本工作得很好。我怀疑这个问题是由于片段深度的计算错误造成的。正视相机的屏幕空间环境遮挡?

有没有一种方法可以编辑效果以使其与正交相机一样按预期工作?

+0

如果有帮助,似乎其他人设法修复“原始”着色器(请参阅https://github.com/mrdoob/three.js/issues/6446#issuecomment-96634340)。我试图改变它,但它不起作用。也就是说,Unity着色器已经从原来的改变了。 –

+0

three.js与团结有什么关系? –

+0

没有什么,但他们(似乎)谈论使用原着色器(这是通用的)。该着色器已移植到Unity,但已经发生了很大变化。 –

回答

0

也许这是一个有点晚了,但我只是面临着同样的问题,这里 是如何解决:

(更改ScreenSpaceAmbientObscurance.shader

float LinearEyeDepthOrth(float z) 
{ 
    // uniform float4 _ProjectionParams; 
    // x = 1 or -1 (-1 if porject is flipped) 
    // y = near plane 
    // z = far plane 
    // w = 1/far plane 

    // http://www.derschmale.com/2014/03/19/reconstructing-positions-from-the-depth-buffer-pt-2-perspective-and-orthographic-general-case/ 
    // Z_view = Z_near + Z_ndc(Z_far - Z_near) 
    return _ProjectionParams.y + z * (_ProjectionParams.z - _ProjectionParams.y); 
} 

float3 ReconstructCSPosition(float2 S, float z) 
{ 
    float linEyeZ = LinearEyeDepthOrth(z); 
    //return float3(((S.xy * _MainTex_TexelSize.zw) * _ProjInfo.xy + _ProjInfo.zw) * linEyeZ, linEyeZ); 
    return float3(((S.xy * _MainTex_TexelSize.zw) * _ProjInfo.xy + _ProjInfo.zw), linEyeZ); 
    ... 
} 

这种变化之后,将在你的正交相机中正确渲染。