텍스쳐가 제대로 나오지 않았던 이유는
버텍스 하나에 UV를 여러개 매핑했기 때문이었다.



1. ASE파일의 이해

먼저 규칙을 정해야 합니다...
하나의 점은 하나의 UV좌표를 가진다는 조건입니다.

그럼 점의 수보다 UV수가 많을꺼에요..
다시 말해서 UV수 만큼 점의 수를 늘려야 겠죠..

방법은 "TFaces"를 보면 알꺼에여..
UV을 사용한 면의 구성입니다.
"FACE_LIST"부분은 점의 면의 구성이죠..
그럼 이 두가지를 잘 보시면 감이 오실겁니다

자 예를 들어 볼게요
*MESH_VERTEX_LIST {
*MESH_VERTEX 0 -22.7053 20.2651 1.4493
*MESH_VERTEX 1 25.6039 20.2651 1.4493
*MESH_VERTEX 2 -22.7053 20.2651 57.4879
*MESH_VERTEX 3 25.6039 20.2651 57.4879
*MESH_VERTEX 4 -22.7053 -24.1794 1.4493
........
위는 점의 정보입니다.

그리구 아래는 면의 정보입니다.
*MESH_FACE_LIST {
*MESH_FACE 0: A: 0 B: 2 C: 3
*MESH_FACE 1: A: 3 B: 1 C: 0
*MESH_FACE 2: A: 4 B: 5 C: 7
*MESH_FACE 3: A: 7 B: 6 C: 4
*MESH_FACE 4: A: 0 B: 1 C: 5
......

그리고..
*MESH_TVERTLIST {
*MESH_TVERT 0 0.0000 0.0000 0.0000
*MESH_TVERT 1 1.0000 0.0000 0.0000
*MESH_TVERT 2 0.0000 1.0000 0.0000
*MESH_TVERT 3 1.0000 1.0000 0.0000
*MESH_TVERT 4 0.0000 0.0000 0.0000
*MESH_TVERT 5 1.0000 0.0000 0.0000
*MESH_TVERT 6 0.0000 1.0000 0.0000
*MESH_TVERT 7 1.0000 1.0000 0.0000
*MESH_TVERT 8 0.0000 0.0000 0.0000
*MESH_TVERT 9 1.0000 0.0000 0.0000
*MESH_TVERT 10 0.0000 1.0000 0.0000
*MESH_TVERT 11 1.0000 1.0000 0.0000
......
UV 정보죠..

마지막으로
*MESH_TFACELIST {
*MESH_TFACE 0 9 11 10
*MESH_TFACE 1 10 8 9
*MESH_TFACE 2 8 9 11
*MESH_TFACE 3 11 10 8
*MESH_TFACE 4 4 5 7
*MESH_TFACE 5 7 6 4
*MESH_TFACE 6 0 1 3
*MESH_TFACE 7 3 2 0
*MESH_TFACE 8 4 5 7
*MESH_TFACE 9 7 6 4
.....
UV 면입니다.

잘 그럼 잘 보세요

면의 정보에서...
"0"번째 면은 점 0, 2, 3으로 구성되어 있습니다.
"0"번째 UV면은 UV 9, 11, 10으로 구성되어 있습니다.

^^
하나의 면은 3개의 점으로 이루워져 있구 하나의 점은 하나의 UV값을 가진다.

자~~
그럼 매팽을 한 0번째 면은 어떻게 구성될까요
0번째 면은 점 0, 2, 3으로 구성되어 있구
0번째 점은 UV 좌표 9번 값을 가집니다
2번째 점은 UV 좌표 11번 값을 가지구
3번째 점은 UV 좌표 10번 값을 가지게 되겠죠..

그럼 하나의 면의 구성이 끝났습니다.
이런 식으로 면을 다 구성하면 됩니다.

이것을 DrawPrimitive로 하나의 면씩 출력하면 되겠죠..

하지만..
DrawIndexedPrimitive을 사용하려면..
다른 UV좌표를 가지는 점들을 새로운 점으로 생성해서 할수 밖에 없어요


2. 인덱스화 하기

인덱스화 하려면 하나의 점이 여러개의 U,V를 가지는것을
분리해서 면을 다시 구성해 주시면 됩니다.

즉.. 인텍스화 하면 면,UV 수가 늘어나는것이 아니고..
단지 버텍스 수만 늘어나는 겁니다.

우선은 간단하게 ASE 파일의 내용을 살펴봅시다.
(이것은 설명을 위해 제가 임의로 정한 겁니다. )

버텍스의 정보는 아래와 같습니다.
*MESH_VERTEX_LIST {
*MESH_VERTEX 0 -22.7053 20.2651 1.4493
*MESH_VERTEX 1 25.6039 20.2651 1.4493
*MESH_VERTEX 2 -22.7053 20.2651 57.4879
*MESH_VERTEX 3 25.6039 20.2651 57.4879
*MESH_VERTEX 4 -22.7053 -24.1794 1.4493

페이스의 정보는 아래와 같습니다.
*MESH_FACE_LIST {
*MESH_FACE 0: A: 0 B: 1 C: 2
*MESH_FACE 1: A: 2 B: 1 C: 3
*MESH_FACE 2: A: 0 B: 2 C: 4
*MESH_FACE 3: A: 3 B: 2 C: 1
*MESH_FACE 4: A: 0 B: 1 C: 4

UV 정보는 아래와 같습니다.
*MESH_TVERTLIST {
*MESH_TVERT 0 0.0000 0.0000 0.0000
*MESH_TVERT 1 1.0000 0.0000 0.0000
*MESH_TVERT 2 0.0000 1.0000 0.0000
*MESH_TVERT 3 1.0000 1.0000 0.0000
*MESH_TVERT 4 0.0000 0.0000 0.0000
*MESH_TVERT 5 1.0000 0.0000 0.0000
*MESH_TVERT 6 0.0000 1.0000 0.0000
*MESH_TVERT 7 1.0000 1.0000 0.0000

UV 페이스 정보는 아래와 같습니다.
( 다들 아시겠지만 UV페이스와
버텍스페이스는 동일한 갯수가 존재 합니다. )
*MESH_TFACELIST {
*MESH_TFACE 0 0 3 6
*MESH_TFACE 1 6 3 4
*MESH_TFACE 2 2 6 2
*MESH_TFACE 3 4 6 5
*MESH_TFACE 4 2 3 1

자 이렇게 있다고 봅시다.. 그럼 차근히 찾아 볼까요?

먼저 우리는 위에 설명에서 보았듯이
하나의 면은 3개의 점으로 이루어져 있고
하나의 점은 하나의 UV를 가진다는걸 알게 되었습니다.

자 그럼 먼저 각각의 버텍스가 몇개의 UV를 가지는지를
찾아 볼까요?~

0번째 버텍스는 0,2,4번째 면에 사용되며
모두 첫번째 점(A)에 해당되는군여 그럼
면 0,2,4번째의 점(A)에 해당되는 UV페이스의 값은 0, 2, 2가
되는군요..

즉..
0번째 버텍스는 0, 2번째 UV값을 가지게 되는겁니다
이런식으로 다 찾아 봅시다.

0번째 버텍스는 0,2번째 UV값 두개를 가집니다.
1번째 버텍스는 3,5번째 UV값 두개를 가집니다.
2번째 버텍스는 6번째 UV값 한개를 가집니다.
3번째 버텍스는 4번째 UV값 한개를 가집니다.
4번째 버텍스는 2,1번째 UV값 두개를 가집니다.

자 그럼 이제 다 해결된거나 마찬가지겠지요?

그럼 버텍스를 새롭게 정의 해 볼까요?
먼저 기존의 버텍스 이후부터 새롭게 생성해 주시면 됩니다.
왜 기존의 버텍스 이후부터 생성하는가는 이유가 있습니다.
나중에 속도 향상을 할수 있는 방법이 될수 있기 때문입니다.
( 이부분은 스스로 생각해 보세여 쉽게 찾을수 있을 겁니다. )

3. 버텍스 복사하기

먼저 추가 할때는 UV가 두개 이상일때만 하시면 됩니다.
지금 버텍스가 0, 1, 2, 3, 4 이렇게 정의 되어 있으니깐
5번째부터 추가 하시면 됩니다. 만약 0번째 버텍스가 5개의
UV를 가진다면 버텍스를 4개만 더 만들면 되겠지요?

즉.. 5, 6, 7, 8 이렇게 버텍스가 생기구 각각의 x,y,z를 0번째
버텍스값을 복사하면 됩니다. 그리고 나서 0번째 버텍스 이후의
버텍스들을 검색해서 두개 이상의 UV가 있으면 이런 식으로 계속
추가해 주시면 됩니다.

*MESH_VERTEX_LIST {
*MESH_VERTEX 0 -22.7053 20.2651 1.4493
*MESH_VERTEX 1 25.6039 20.2651 1.4493
*MESH_VERTEX 2 -22.7053 20.2651 57.4879
*MESH_VERTEX 3 25.6039 20.2651 57.4879
*MESH_VERTEX 4 -22.7053 -24.1794 1.4493

('' 기존의 버텍스 (.. 새로 생성하는 버텍스

*MESH_VERTEX 5 -22.7053 20.2651 1.4493
( 0번째 버텍스가 UV를 두개를 가지므로
0번째 버텍스를 복사해서 추가한다. )
*MESH_VERTEX 6 25.6039 20.2651 1.4493
( 1번째 버텍스가 UV를 두개를 가지므로 1번째 버텍스를
복사해서 추가한다. )
*MESH_VERTEX 7 -22.7053 -24.1794 1.4493
( 4번째 버텍스 UV 두개이므로 4번째 버텍스 복사해서 추가 )

자 이렇게 해서 기존의 버텍스는 5개 였는데 3개가 더 추가
되었습니다.
이렇게 해서 버텍스 수와 UV 수가 동일하게 되었습니다.


4. 페이스 수정하기

먼저 우리는 위해서 버텍스를 새롭게 생성했습니다.
그럼 아래와 같이 정의 할수 있겠지요?

< 하나의 점은 하나의 UV를 가진다. >
0번째 점은 0 번째 UV를 가집니다.
1번째 점은 3 번째 UV를 가집니다.
2번째 점은 6 번째 UV를 가집니다.
3번째 점은 4 번째 UV를 가집니다.
4번째 점은 2 번째 UV를 가집니다.
5번째 점은 2 번째 UV를 가집니다. ( 0번째 점의 복사한 점 )
6번째 점은 5 번째 UV를 가집니다. ( 1번째 점의 복사한 점 )
7번째 점은 1 번째 UV를 가집니다. ( 4번째 점의 복사한 점 )
이렇게 되었습니다..

그럼 그 다음에는 버텍스페이스 정보를 수정해 볼까요?

*MESH_FACE_LIST {
*MESH_FACE 0: A: 0 B: 1 C: 2
*MESH_FACE 1: A: 2 B: 1 C: 3
*MESH_FACE 2: A: 0 B: 2 C: 4
*MESH_FACE 3: A: 3 B: 2 C: 1
*MESH_FACE 4: A: 0 B: 1 C: 4
위와 같이 페이스가 구성 되어 있습니다.

여기서 우리는 U,V 페이스를 참조해서 수정을 해야 합니다.
*MESH_TFACELIST {
*MESH_TFACE 0 0 3 6
*MESH_TFACE 1 6 3 4
*MESH_TFACE 2 2 6 2
*MESH_TFACE 3 4 6 5
*MESH_TFACE 4 2 3 1

0번째 점이 사용된 페이스는 0번의 첫번째 점, 2번의 첫번째 점,
4번의 첫번째 점 입니다.
여기서 UV페이스가 0 2 2라는 것을 알겠지요?

그럼 이렇게 수정 되어야 겠지여..
0번째 UV는 0번째 점이고 2번째 UV는 5번째점이
가지면 되겠지여..

이런식으로 다 수정을 하면.. 이렇게 됩니다.
*MESH_FACE_LIST {
*MESH_FACE 0: A: 0 B: 1 C: 2
*MESH_FACE 1: A: 2 B: 1 C: 3
*MESH_FACE 2: A: (5) B: 2 C: 4
*MESH_FACE 3: A: 3 B: 2 C: (6)
*MESH_FACE 4: A: (5) B: 1 C: (7)

이렇게 수정하면 되겠지요?
이렇게 해서 위의 페이스를 인덱스 버퍼에 넣으면 끝입니다.



그런데 이래도 안된다.
MAX부터 새로해야겠다.
내일 다시 새로하자.


'Graphics > 3D MAX' 카테고리의 다른 글

3D 무료 모델 사이트  (0) 2014.06.09
ASE 파일 (ASCII Scene Export)  (0) 2014.06.09
Posted by 긍정왕오킹