라인이 끊기는 문제는 z-fighting 때문입니다. 외곽선의 라인을 구성하는 픽셀과 안쪽 폴리곤의 픽셀이 각각 그려졌을때, 미세하게 각 픽셀의 z 좌표가 어떤 경우에는 라인이 앞쪽일때도 있고 뒤쪽일때도 생기면서 라인이 끊어지는 것이지요. 간단한 해결방법은 라인의 z 좌표들을 약간 화면 앞쪽으로 당겨서 찍어주는 것입니다. 하지만 근본적인 해결책은 안되고, 제대로 해결하기 위해서는 z-버퍼 검사 옵션과 쓰기 옵션을 조절해가면서 찍어야 합니다. Real-time Rendering 책에 보면 나와있는데 지금 기억이 잘 안나네요.

라인의 두께 조절 문제는 ID3DXLine 의 SetWidth 같은 것을 이용해보시면 어떨지요? 전 써본 적이 없습니다만.. 아니면 볼륨 뿔려서 단색으로 한번 더 찍기 방법으로 바꾸는 것을 검토해볼 필요가 있습니다.

그리고 프레임이 떨어지는 문제는, 아웃라인의 판별이 모두 cpu 에서 이루어지기 때문에 cpu 측에서 병목현상을 일으키는 것이 아닐까 추측됩니다. 소스를 보거나 프로파일 결과를 보기 이전엔 단정할 수는 없지만 말입니다. 속도를 빠르게 하기 위해서는 어느 부분에서 속도가 느려지는 것인지를 알아내는 것이 가장 중요합니다

1. CPU 때문에 느려지나? 2. AGP 버스때문에 느려지나? 3. 버텍스 쉐이더 때문에 느려지나? 4. 픽셀 쉐이더(fill-rate) 때문에 느려지나?

CPU 때문에 느려지는지 여부의 판단법 : CPU 속도에 따라 프로그램의 수행속도가 비례한다면 CPU 가 병목지점임 (바이오스에서 CPU 를 단계별로 언더클럭)

원인 : CPU 에서 계산을 너무 많이 한다, DrawPrimitive 를 너무 많이 호출한다 (폴리곤들을 충분히 모아서 찍지 않았음 - 메터리얼별 소트를 하지 않았거나, 버텍스 버퍼를 최대한 모으지 않았음), GPU 를 Stall 시키는 일이 있다 (현재 사용중인 그래픽 카드상의 자원에 대한 lock 을 시도했을 경우)

AGP 때문인가 ? : 바이오스에서 AGP 를 1x, 2x 로 바꿨을때 속도가 느려진다면 AGP 가 병목지점임
원인 : 버텍스 사이즈가 너무 큼. 버텍스의 크기가 32의 배수가 아닌 버텍스를 지나치게 랜덤억세스 했음

버텍스 쉐이더 때문인가 ? : 버텍스 쉐이더를 짧은것, 중간 것, 긴 것 3 가지로 적용했을때 속도가 비례한다면 버텍스 쉐이더가 병목지점임
원인 : 버텍스 쉐이더가 너무 복잡할 경우. 더 간단한 것으로 줄여야 함

픽셀 쉐이더 때문인가 ? 화면의 해상도를 변경했을때 그것에 비례해서 프로그램의 속도가 느려진다면 CPU 가 병목지점임
원인 : 너무 여러개의 텍스춰 어드레싱 연산을 하거나, 칼라 값 연산을 많이 했음 (GeForce3 FAQ 참조)

만약 원인이 CPU 였다면, 다른 방식의 카툰렌더링 구현을 시도해보는 것이 좋을 것 같습니다. 단색으로 확대해서 두번찍기 방식은 주로 CPU 이외의 부분으로 부하가 이동되는 효과가 있으니까요

imcgames 의 김학규입니다