지난번 에도 말했지만, 3D에서 가장 중요한 것은 바로.. vertex.. 즉, 점이다.. 이 점이 바로 3D의 가장 기본적인 요소가 되는 것이다. 같은 위치의 vertex를 가지고 랜더링 하는 방식에 따라 어떻게 기록되는 지는 보았으니, 이제 vertex의 집합으로 하나의  큐브. (정육면체)를 띄우는 예제를 보겠다..

 먼저 선언에 관해서 보자..


먼저 Texture 변수를 선언한 것을 알 수 있다.. 이번 예제는 텍스쳐를 로드해서 버텍스에 적용시킨다. 텍스쳐란 바로, 겉을 덮는 그림이라고 생각하면된다.. 그렇다면, 과연 어떤 점에 텍스쳐의 어떤 부분을 넣을 지를 어떻게 정하는가가 중요하겠다... 그 것이 바로.. UV 좌표가 되겠다..

즉.. 현재의 버텍스와 그다음 버텍스 그다음 버텍스의 각 위치의 UV 좌표를 지정하면, 텍스쳐 상에 UV 좌표와 서로 매치를 시켜서, 텍스쳐의 그 면을 그 삼각형에 그려준다..  아래의 버텍스 배열을 보며 더 알아보자..


먼저 제일 위에 4개의 UV 좌표를 보면 먼저 (0,0) 부터 (1,0)(0,1)(1,1) 이렇게 모두 있다. 먼저 (0,0) 이라면 텍스쳐 상의 맨 왼쪽 상단의 픽셀이 된다. 그리고 1,0을 오른쪽 끝, 0,1은 왼쪽 최하단, 1,1은 오른쪽 최하단 이다.

 그럼 각 점의 위치로 4각형을 그리면, z는 현재 제외하고 생각하면...
1번이 -1,1 로 좌측 상단, 1,1로 우측 상단 -1,-1로 좌측 하단, 1,-1로 우측 하단 순이라는 것을 알 수 있다..

그렇기 떄문에 이 순서로 4각형을 그리면, 텍스쳐의 4면의 모든 부분에 딱 맞아져서 정확히 맵핑이 되는 것이다..

물론 실제로 각 UV의 좌표들은 맥스 상에서 모델러들이 모델링 작업을 하면서, 직접 좌표를 구해서 우리가 원하는 형태로 출력해서 주게 된다. 하지만 자기만의 포멧을 만들려면, 이런 부분도 알아야 가능한 것이다..


그 다음은 바로.. 적용시킬 텍스쳐를 로드하는 것이다. 다이렉트x에서는 함수를 지원하고 있으므로 바로 사용하면된다.. 첫번째에는 디바이스, 그다음은 로드할 텍스쳐의 파일명, 그리고 마지막에는 텍스쳐 변수다..

아래 샘플러스테이트에 설정해 준 것은 바로, 확대 축소시.. 어떤 형태로 할 것인가를 지정해 주는 것이다.. 예를들면, 텍스쳐의 픽셀 수는 정해져 있다. 그런데 3D상의 모델링은 카메라 뷰에 따라 화면좌표에 크게도, 작게도 나올 수 있다. 그렇게 되면 실제 맵 소스에 있는 픽셀량보다.. 많아질수도 적어질수도 있는데 그 때에 어떻게 늘릴지, 어떻게 줄일지를 결정하는 상태값이다. 보통 기본적으로 LINEAR로 해놓는다..


 그리고 초기화 부분에 가보면.. 이곳에서 텍스쳐를 로드 했다는 사실을 알 수 있다.. 그리고 CreateVertex버퍼를 보면 24를 Vertex라는 우리가 새로 정의한 구조체의 크기만큼 만드는 것을 알 수 있다.



이제 모든 초기화가 끝났으면 랜더로 가보자.. 위의 장면에 있는 것들은 큐브의 회전을 위해 있는 부분이므로, 별로 신경쓰지 않아도 된다.


이제 BeginScene 이후부터 살펴보면, SetTexture로 현재 그릴 텍스쳐를 설정하고, StreamSource에 버텍스 버퍼를 넣어준다. 그 후에 지정된 배열을 가지고 삼각형스트립 상태로 그려주면...

 


이렇게 우리가 의도한 텍스쳐가 입혀진, 사각형이 나타난다..
이 텍스쳐를 보면, 각 지점의 UV좌표가 opengl과 다이렉트x에서 어떻게 다른지 각 표시해 놓았다..
Posted by 바람처럼..
|