Tangent 공간 변환 행렬이 뭐가 문제가 있었다.(해결편) 개발 노트

Tangent 공간 변환 행렬이 뭐가 문제인 것이냐?!?! ㅡㅡ;;에서 CubeMap을 이용한 Reflection을 구현 중에, 내가 뭔가 탄젠트 계산을 잘못하고 있다는 것을 알게되었다.
굉장히 기초적인 부분이라고 생각하고, 별거 없을 것이다라고 해서, 가볍게 생각했는데, 하나 하나 뜯어보니까, 쉽지 않더라.. ㅡㅡ;
(맥스 익스포터에서 익스포트해서 사용하기 때문에, 덕분에 익스포터도 간만에 뜯어 고쳤다.. ㅡㅡ;; 더러운 맥스 작업 질.. 췟!!)

수정 결과는 다음과 같이 제대로 된 결과가 나오는데, 뭐가 잘못 되었을까?를 집어보자!!!

첫째, 익스포트할 때, 오타....
역시 인간이 문제였다.. 된장...

둘째, Tangent를 계산한 공식은
http://www.terathon.com/code/tangent.html를 사용했는데, ("3D 게임 프로그래밍 & 컴퓨터 그래픽을 위한 수학-제 2판"의 230page에 나와있다.)

분명히 최종 행렬은 "물체공간에서 접선 공간으로 변환"하는 행렬이라고 나와 있다. 그래서,

    float3x3 objToTangentSpace = float3x3(input.tangent, input.binormal, input.normal);
    tangentSpaceLightVec = mul(objToTangentSpace, lightVec);
과 normalMap에서 뽑은 normal과 계산. 즉, tangent 공간 상에서 계산을 했는데, 아래와 같이 위, 아래가 뒤집혀진 것과 같이 나왔다.

혼자서 별 짓을 다해보다가, 하도 이상해서, 정만님에게 도움을 요청했더니,

    float3x3 tangentFrame = float3x3(vTangent, vBinormal, vNormal);
    float3 tangentNormal = SampleNormal(bumpMapSampler, uv);
    return mul(tangentNormal, tangentFrame);

이런 식으로 normalMap에서 뽑은 normal을 객체의 공간으로 변환해서, 객체 공간에서 lightVec등과 계산을 하도록 적용했다고 한다.
결과는.....
잘 나온다.. 오홋.... -_-;;

아직도 솔직히 잘 이해를 못하겠다.
분명히 접선 공간으로 변환하는 행렬을 이용하여, 접선 공간의 normal과 접선 공간으로 변환된 벡터와의 계산이 의미적으로 맞을거라 생각했는데, 어째서 반대란 말인가?!?!

암튼 잘나오긴 한다.

참놔.... 나만 이것 때문에 고민한건가?! ㅡㅡ;;;

결과샷

트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://cagetu.egloos.com/tb/5096995 [도움말]

덧글

  • jufoot 2009/10/16 12:25 # 답글

    제가 생각하고 있는게 맞는 상황인지 모르겠지만 cubemap 자체가 world space data 일테니... object space 가 아닌 world space normal 로 sampling 해야 될거 같네요.
    안그럼 모델 회전해보면 제대로 안나올거 같아요.

    reflectVector = textureCube(reflectionMap, worldNormal);
  • cagetu 2009/10/16 12:35 #

    제 생각에도 그런 것 같기는 했습니다만, 정확하게는 파악을 못하고 있습니다.
    (사실 CubeMap이 World Space를 이용한다는 것도, 이것을 하면서 알게 되었네요.. ^^; nvidia cg - reflection참고)

    확인 해보도록 하지요. 감사합니다. 꾸벅~
덧글 입력 영역



메모장

내가 먼 훗날에 이 글들을 보았을 때, 좋은 추억이 될 수 있기를...

나를 위해... 나에게 쓰는...

msn: cagetu@hotmail.com
mail: cagetu79@gmail.com
tritter: twitter.com/cagetu