티스토리 뷰

Game/MMD

Environment mapping + mirror (2)

newpolaris 2017. 10. 24. 16:24

지난번의 먼가 안타깝게 실험하다 끝난 결과를 뒤로하고 또 미러를 구현할일이 생겨 정리.

지난번 글을 정리하자면,

Environment reflection 을 구현하려면 결국 mapping 을 해서 그걸 참조로 해서 그리는게 싼 편이다.

근대, 거울의 구현은 기초 강좌를 보면 mirrored matrix를 곱해서 그림자를 빼고 그리는데

이 과정자체가 거울 시야에서 일정거리에 있는 개체들 모두에 대해,

stencil or depth buffer 로 그리는 식이다.

http://www.inf.ed.ac.uk/teaching/courses/cg/lectures/slides9.pdf

이런식이면, 거울의 텍스쳐라던가 바닥 텍스쳐를 추가하려면 쉐이더 코드를 고치던가 blend 해야한다.

또한 그리는데 비용이 들어간다.

혹시, 기존에 존재하는 environment mapping 된 cube나 sphere를 사용하려고하면,

Luna에서 적힌것 처럼 위치 정보가 빠졌기 때문에(?) 확대되거나 거리가 맞지 않게 보인다. (cube 생성 시점은 공중에 있기 때문에)

이걸 수정하기 위해 object-oriented box 직사각형 맵에서 correction 한게 아래 내용이다.

https://seblagarde.wordpress.com/2012/09/29/image-based-lighting-approaches-and-parallax-corrected-cubemap/

AABB나 OOB가 필수 인지는 정확히 확인은 못했다. depth map으로 어떻게 안되나?

흠, 바닥에서 어떻게되는지 실험을 위해 코드를 보았다.

난 멀짠건가

    if ( gReflectionEnabled )
    {
        float3 incident = -toEye;
        float3 n = float3(1, 0, 0);
        float t = dot(-n, gEyePosW) - gRadius;
        float nu = dot(n, incident);
        t = t / nu;
        if (t > 0) {
            float3 correctedVec = normalize(incident * t / nu + (gEyePosW - gEnvMapCenterW));
            float4 reflectionColor = gCubeMap.Sample(samAnisotropic, correctedVec);
            litColor += gMaterial.Reflect*reflectionColor;
        }
      }

개판으로 나와서, 원래 일반 reflect code로 바꿔서 테스트

원래 이렇게 까지 잘못나오나?

아 보다 보니 기억난다.

방향백터로 lookup 하는 식이라 근거리 객체는 바보가 된다.

그리고 위의 식은,

https://books.google.co.kr/books?id=6_4VaJiOx7EC&pg=PA214&lpg=PA214&dq=float+raysphere(&source=bl&ots=csXtSRIKJ2&sig=lI2CP0yllkOATCQ9KNGlgacDhH8&hl=ko&sa=X&ved=0ahUKEwiz0Y_j6ojXAhXJI5QKHUw3AMwQ6AEIKzAB#v=onepage&q=float%20raysphere(&f=false

214, 215를 짜본거다. 싸이트에서 이부분.

하다가 안되서 normal 을 강제로 지정한것도 남아있네;

mirror는 포기하고 AABB로 잡아서 그냥 적당히 AABB를 잡아서 구현하였다.

전에 시간 쓴게 아까워서 해본건데.

여러 버그가 보인다. 구현 잘못했나벼. SSR이나 해야겠다.

Update: 찾다보니 더보이고, 나쁘지 않아 보인다. 쓰레기처럼 보였는데;

SSR과 합친단다.. 미... https://www.gamedev.net/forums/topic/667710-localizing-image-based-reflections-issues-questions/

우선 링크들 http://c0de517e.blogspot.kr/2015/03/being-more-wrong-parallax-corrected.html https://www.youtube.com/redirect?v=ZH6s1hbwoQQ&event=video_description&redir_token=pRT8HXIhDaHWCH4Z39syRh5ZXsp8MTUwOTExNjc0MEAxNTA5MDMwMzQw&q=http%3A%2F%2F13thsfg.us.to%2Ffiles%2Fparallaxcubemaps.zip https://www.youtube.com/watch?v=m1YrDGcI4cs (거울이다)

https://www.youtube.com/watch?v=f8_oEg2s8dM (자료 공개 잘해주는 일본 아저씨 - 큐브간 혼합은 지원 안함) https://sites.google.com/site/monshonosuana/directxno-hanashi-1/directx-141 https://github.com/vorg/pex-experiments/tree/master/local-cubemap-reflections (http://marcinignac.com/blog/modular-webgl-with-pex/) https://gist.github.com/marklundin/4f3374383adf071f8bdb1206dba79eff

https://shellsphinx.github.io/2017/05/08/homeproject2/

https://www.youtube.com/watch?v=Vo2fO_3U8tE https://www.youtube.com/watch?v=_XxKxNpubsQ https://www.youtube.com/watch?v=dBytHE5hqvg https://www.youtube.com/watch?v=ZH6s1hbwoQQ

'Game > MMD' 카테고리의 다른 글

Mirror (4)  (0) 2017.10.24
SSR(Screen space reflection) (1)  (0) 2017.10.24
SV_Target 지정시에도 변화가 없을때  (0) 2017.10.23
Pixel shader : shader did not run. no output.  (0) 2017.10.20
Bloom + Emmisive (2)  (0) 2017.10.18
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크