메시 최적화 시키는 방법이 있나요?

프로그래밍 일반에 관한 포럼입니다.

Moderator: 류광

Locked
비회원

메시 최적화 시키는 방법이 있나요?

Post by 비회원 »

맥스에보면 메시를 Optimize명령을 주면 폴리곤수가 줄어들잖아요.

이런 작업을 맥스가 아닌 직접 툴같은 곳에서 해주고 싶은데
해주는 알고리즘이 이미 나와있는것이 있는지,
아니면 일일히 직접 계산을 통해 해주는지(노가다? 노가다방법이 아니라면 어떤식으로 해주는지), 궁금합니다.

힌트라도 부탁드립니다 :)
nikola2
Posts: 886
Joined: 2005-07-12 01:19
Location: (주) 신규 소프트

Post by nikola2 »

맥스쪽의 지식이 낮은 탓에..맥스의 옵티마이즈 기능은 잘 모르겠지만..

우선 생각나는건...View Independent Progressive Mesh라고 해서
( 시야 독립적인 점진 메시라고 대충 번역되는 ) ..... LOD같습니다...
( 구현능력 부족으로 , 실제코딩은 해보지 못했습니다.)

그중에서 DirectX의 DX유틸이 채택한 것이 가장 유명한듯하고..
Surface Simplification Using Quadric Error Metrics
Simplifying Surfaces with Color and Texture using Quadric Error Metrics

리얼타임렌더링 자체에는 소개위주로 .... 원문은....
리얼타임렌더링에서는 이 2개가 레퍼런스네요..(검색..)

노가다를 피하시려면, DXPMesh나 SimplifyMesh등의....
DX헬퍼함수를 임시적으로 쓰시면..... 비교적 쉽게 처리가 가능하다는...
집사람이 국력이다...
비회원

progressive mesh라는 키워드로 검색해 보세요

Post by 비회원 »

http://research.microsoft.com/~hoppe
에서 프로그래시브 메쉬 보시고요

DX에도 예제가 있는 걸로

저는 구현논문쓸때

쿼드 에지라는 메쉬구조로 만들어 놓은 것을 참고 해서
구현했는데

쿼드 에지라는 메쉬구조도 찾아보셔야 할거에요

현행
정점 인덱스 기반의 메쉬구조로는 못 만들고요
여러가지 추가 정보가 필요해서

에지 병합, 스플릿등이 가능한 메쉬구조로 작업하셔야 할듯

그럼.

그리고 어느 현상황에서 어느 에지를 병합했을때 이전 모델과 차이가 가장 적은가를 계산하위위해
모든 에지에 어떤 계산을 하고 후보값들중에서 가장 값이 적은 에지를 병합하는데
그때 그 차이를 평가하는 방법이 여러가지 있습니다.

그중에 간단한것이
Simplication Using Quardric Error Merics
입니다.

관련해서 구현논문을 쓴적이 있어서
그것도 벌써 4년전이라
기술이 얼마나 더 발전했는지는 모르겠네요
비회원

! 최근 테스팅 결과입니다.

Post by 비회원 »

안녕하세요 BurnHead3D입니다.

최근에 익스포트 제작겸 테스팅을 해보았습니다.

1. 추려내기 (수동 uv,노말값 중복검사)
2. Dynamic으로 OptimizeInplace 실행후, WriteOnly로 복사
(Optimize 옵션은 strip대신 vertexcashe로 설정햇습니다.)

위와같은 방법으로 64개의 랜더링 호출로 테스트했습니다. 노말값 평균은 내지 않았습니다.
컴퓨터 사양은 듀얼코어 시스템에 인텔 그래픽칩셋입니다.


1. 익스포트된 모델 그대로 출력 (추려내기X, 최적화X)
버택스개수 약 9천개, 렌더링의 평균지연시간 0.19

2. 추려내기 작업후 출력 (추려내기O, 최적화X)
버택스개수 약 4천개, 렌더링의 평균지연시간 0.09

3. 최적화 작업후 출력 (추려내기X,최적화O)
버택스개수, 지연시간 1번과 차이없음

4. 추려내기, 최적화 작업후 출력 (추려내기O,최적화O)
버택스개수 2번과 동일, 렌더링의 평균지연시간 0.08

예상밖으로 OptimizeInplace로 인한 성능향상이 거의 미미한 수준의 결과가 나왔습니다. 추측하건대,
예제에 있는 꽈배기 매쉬나 도너츠 모양등이 아닌경우에는 MAX에서 출력되는 버텍스나 인덱스의 순서가
거의 정렬되어서 나온것이 아닐까 생각합니다. 또 Dynamic옵션과 WriteOnly 옵션도 차이가 없었고
OptimizeInplace에서 compact옵션 - 정점 중복제거는 전혀 이루어지지 않았습니다. 다만 추려내기 이후에
Optimize는 약간의 속도향상은 있는것을 확인했습니다.

실험결과는 실험매쉬와 환경에 매우 다른 결과가 나올수 있으니 신뢰있는 테스팅결과는 아닙니다.
그러나 결국엔 수동으로 중복되는 정점을 추려내는것이 좋을듯 합니다.
시간날때 본체컴퓨터 6600gt로 다시 실험해보면 좋겠군요....


[/b]
zupet
Posts: 2764
Joined: 2003-05-13 03:34
Location: NCSOFT LE팀

Re: ! 최근 테스팅 결과입니다.

Post by zupet »

비회원 wrote: 예상밖으로 OptimizeInplace로 인한 성능향상이 거의 미미한 수준의 결과가 나왔습니다. 추측하건대,
예제에 있는 꽈배기 매쉬나 도너츠 모양등이 아닌경우에는 MAX에서 출력되는 버텍스나 인덱스의 순서가
거의 정렬되어서 나온것이 아닐까 생각합니다. 또 Dynamic옵션과 WriteOnly 옵션도 차이가 없었고
OptimizeInplace에서 compact옵션 - 정점 중복제거는 전혀 이루어지지 않았습니다. 다만 추려내기 이후에
Optimize는 약간의 속도향상은 있는것을 확인했습니다.
D3DX에 포함된 Optimized Mesh 가 효과를 발휘하는 경우는 전체 파이프라인에서 Vertex Shader/Triangle Setup(Vertex Assembly) 부분이 병목 지점이 되어 다른 부분들의 속도를 저하할때 입니다. nvPerfHud 를 통해서 전체 퍼포먼스를 보고 Vertex 관련해서 부하가 심한 예제를 테스트 해보셔야 합니다.

메쉬의 속성과 무관하게 Optimized Mesh 기능을 테스트 해보고 싶을때는 가능한 작은 범위(5*5 픽셀 정도? 3*3도 좋습니다)에 겹쳐서 찍는 방식으로 Pixel Shader 의 영향을 최저화 시키거나 또는 아예 Z 범위 밖에 메쉬를 찍어서 화면에서 짤려나가게 하는 방법이 있습니다.

그런데 추려내기란 Triangle * 3 만큼의 Vertex 중에 겹치는 것들을 제거한다는 뜻인가요? Triangle * 3 의 Vertex 를 사용하고 있다면 Optimized Mesh는 큰 도움을 주지 못합니다. 그리고 UV 맵핑과 Smoothing Group 에 따라 Optimized Mesh 의 효율성도 크게 변하게 되고 말이죠. 가능하면 해당 논문을 한번 읽어보고 Optimize 되지 좋은 Mesh를 만드는 방법도 연구해보는게 좋을 것 같습니다. (흠.. 저도 3D 디자이너랑 이런거 같이 해보고 싶은데 영 기회가 안오네요. T_T)
Locked