ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [번역] Octahedron normal vector encoding
    Graphics/번역 2022. 9. 30. 21:21

    개인 공부용으로 번역한 거라 잘못 번역된 내용이 있을 수 있습니다.
    또한 원작자의 동의 없이 올려서 언제든 글이 내려갈 수 있습니다.
    출처 : https://knarkowicz.wordpress.com/2014/04/16/octahedron-normal-vector-encoding/

    Octahedron normal vector encoding


    많은 렌더링 기술이 인코딩된 Normal (unit) vector 로 부터 이득을 얻습니다. 예를 들어, 디퍼드 쉐이딩 G-buffer 공간은 제한된 리소스입니다. 게다가 World space normal 을 uniform precision 로 인코딩 할 수 있는 것은 좋습니다. 몇몇 인코딩 기술은 view space normal 에만 작동합니다, 왜냐하면 normal 방향에 따라서 가변 정밀도를 사용하기 때문입니다.

    World space normal 은 좋은 특성이 있습니다 - 그들은 카메라에 의존하지 않습니다. 이것은 static object 의 specular 와 reflections 이 흔들리지 않는 다는 것을 의미합니다 (FPS 게임에서 idle 상태에서 카메라가 살짝 이동하는 것을 상상해보세요). 게다가 그들의 정밀도는 카메라에 의존적이지 않습니다. 종종 우리는 카메라로 부터 멀어지는 방향의 normal 을 다룰 필요가 있기 때문에 이것은 중요합니다. 예를들면 normal map 그리고 perspective correction 때문에 혹은 뒤쪽의 라이팅(subsurface scattering) 을 위한 라이팅 계산입니다.

    Octahedron-normal vectors [MSS*10] 는 간단합니다. 그리고 Octahedron environment maps [ED08] 의 영리한 확장입니다. 이 아이디어는 normal 을 octahedron 에 프로젝션하고, 그것을 접고 정사각형 위에 둠으로써 인코딩합니다. 이것은 꽤 균일한 값의 분포와 같은 좋은 특성을 가지며 인코딩과 디코딩 비용이 적습니다.

    나는 octaheron 을 3개의 컴포넌트 (XYZ)를 저장하는 것 그리고 Spherical coordinates 를 저장하는 것과 비교했습니다. 아주 과학적인 접근은 아닙니다 - 그냥 반짝이는 반사하는 sphere 를 렌더링했습니다. Normal 은 world space 에 R8G8B8A8 렌더타겟에 저장되어 있습니다. 이 글은 완전한 소스 코드(아쉽게도 원본 논문에서는 제공되지 않음)도 포함되어 있습니다, 그래서 당신은 당신의 엔진에 붙여넣고, 이 압축이 실제로 어떻게 보이는지 볼 수 있습니다.

    XYZ

    float3 Encode( float3 n )
    {
      return n * 0.5 + 0.5;
    }
     
    float3 Decode( float3 f )
    {
      return f * 2.0 - 1.0;
    }

    Spherical coordinates

    float2 Encode( float3 n )
    {
      float2 f;
      f.x = atan2( n.y, n.x ) * MATH_INV_PI;
      f.y = n.z;
     
      f = f * 0.5 + 0.5;
      return f;
    }
     
    float3 Decode( float2 f )
    {
      float2 ang = f * 2.0 - 1.0;
     
      float2 scth;
      sincos( ang.x * MATH_PI, scth.x, scth.y );
      float2 scphi = float2( sqrt( 1.0 - ang.y * ang.y ), ang.y );
     
      float3 n;
      n.x = scth.y * scphi.x;
      n.y = scth.x * scphi.x;
      n.z = scphi.y;
      return n;
    }

    Octahedron-normal vectors

    float2 OctWrap( float2 v )
    {
      return ( 1.0 - abs( v.yx ) ) * ( v.xy >= 0.0 ? 1.0 : -1.0 );
    }
     
    float2 Encode( float3 n )
    {
      n /= ( abs( n.x ) + abs( n.y ) + abs( n.z ) );
      n.xy = n.z >= 0.0 ? n.xy : OctWrap( n.xy );
      n.xy = n.xy * 0.5 + 0.5;
      return n.xy;
    }
     
    float3 Decode( float2 f )
    {
      f = f * 2.0 - 1.0;
     
      // https://twitter.com/Stubbesaurus/status/937994790553227264
      float3 n = float3( f.x, f.y, 1.0 - abs( f.x ) - abs( f.y ) );
      float t = saturate( -n.z );
      n.xy += n.xy >= 0.0 ? -t : t;
      return normalize( n );
    }

    Conclusion

    Spherical coordinates 는 좋지 않은 값 분포를 가지고 성능도 좋지 않습니다. 분포는 spiral [SPS12] 과 같은 종류를 사용하여 분포는 고칠 수 있습니다. 불행히도 여전히 비싼 삼각법(trigonometry)을 요구하고 품질은 octahedron 인코딩에 비해서 미미하게 더 좋습니다.
    언급할 가치가 있는 또 다른 방법은 Crytek 의 best fit normal [Kap10] 입니다. 이것은 극단적인 정밀도를 제공합니다. 반면에 3개의 컴포넌트가 필요하기 때문에 이것은 G-Buffer 의 공간을 절약하지 않을 것입니다. 또한 인코딩하는 것은 512x512 의 룩업 텍스쳐를 사용합니다. 그래서 비용이 꽤 비쌉니다.
    Octahedron 인코딩은 낮은 수의 명령어를 사용하며 거기에는 2개의 non-full rate instruction(”transcendental unit” 에서 계산되어지는) 만 있습니다. 인코딩 중 rcp 1개, 디코딩 중 rcp 1개. 게다가 퀄리티도 꽤 좋습니다.
    결론적으로 octahedron-normal vector 는 품질 대비 성능이 좋으며 spherical coordinates 와 같은 오래된 방법보다 훨씬 낫습니다.
    UPDATE: 댓글에서 Alex 가 지적한 것 처럼, 흥미로운 normal 인코딩 기술들이 [CDE*14] 에 발표되었습니다. 그것은 octahedron normal compression 과 다른 기술들의 상세한 비교를 포함합니다.
    UPDATE 2: Rune Stubbe 의 Octahedron 디코딩 최적화를 추가함

    References

    [MSS10] Q. Meyer, J. Sübmuth, G. Subner, M. Stamminger, G. Greiner – “On Floating-Point Normal Vectors”, Computer Graphics Forum 2010
    [ED08] T. Engelhardt, C. Dachsbacher – “Octahedron Environment Maps”, VMW 2008
    [Kap10] A. Kaplanyan – “CryENGINE 3: Reaching the speed of light”, Siggraph 2010
    [SPS12] J. Smith, G. Petrova, S. Schaefer – “Encoding Normal Vectors using Optimized Spherical Coordinates”, Computer and Graphics 2012
    [CDE14] – Z. H. Cigolle, S. Donow, D. Evangelakos, M. Mara, M. McGuire, Q. Meyer – “A Survey of Efficient Representations for Independent Unit Vectors”, JCGT 2014123456789

    댓글

Designed by Tistory & scahp.