프로그래밍 2016. 10. 21. 00:40
728x90

 

지금까지, 대충만 이해하고 사용했었는데,

 

요 블러그에서

잘 설명해 주셨네요

 

http://liepooh.egloos.com/521832

 

 

밑의 버텍스 쉐이더 코드에서,

정점이 모든 변환 매트릭스(월드, 뷰, 프로젝션) 에 대해 계산되었다면,

이 정점은 -1~1 범위의 프로젝션 범위안의 값일까?

 

헷갈려서, 여러 자료를 살펴보다가

내 이해대로 정리를 좀 해본다

 

 

VS()

{

 Out.pos = mul( float4( _In.pos, 1.f ), _matWorld );
 Out.pos = mul( Out.pos, _matView );
 Out.pos = mul( Out.pos, _matProj );

 

 자, 지금 Out.pos 값은 -1~1 범위의 값일까?

}

 

...

...

...

 

답은

-> 카메라공간상에서의 값이다, -1~1 범위가 아니다,

-> 정규화되지 않은 값이므로,

-> 정점좌표, 월드, 카메라와의 거리에 따라 아주 크거나, 아주 작은 소수값일수도 있다 

-> (월드좌표상의 값...)

-> w 값에 카메라와의 거리값이 들어있다

 

 

나는 일단, 위 코드안에서

프로젝션 변환까지 마쳤으면, 값이 -1~1 범위 일꺼라 생각하고 있었는데,

(프로젝션 좌표계의 영역이 -1 ~ 1 이니까, 당연히)

잘못된 생각이었다,

 -> 실제 정점 * view * proj 을 해보니 1 이상의 큰값들을 확인할수 있었다


 

생각하기로는 -1~1 범위인데,

그림자 구현이나, 깊이버퍼 구현에서 depth 이용시에는

다시 w 값으로 나누어 -1~1 영역의 값으로 만드는 계산이 들어가니,

뭔가 좀 아리까리한 상태였다

 


어쨋든, 

최종 픽셀의 위치값은 범위가 정해지지않은 큰값들이다.

그런데,

이값들을 device 에서 출력에 그대로 사용할까?

최종적으로 모니터와 매칭할수 있는 값으로 다시 조정하지 않을까?



버텍스쉐이더에서 넘겨진 픽셀의 x,y,z 위치값은, 

device 에서

w 값으로 나누는 과정이 자동으로 수행되는것이


맞을거 같긴한데...


 


728x90
posted by BK dddDang
: