본문 바로가기
반응형

Programming/Game5

Z Buffer vs. W Buffer 게임을 제작하다보면, 폴리곤 겹침에 의해서 겹쳐진 폴리곤이 카메라 이동에 따라서 심하게 떨리는 것을 경험해본 경험들이 있을겁니다. 이런 현상을 깊이싸움(Depth fighting)이라고 하는데, 이것은 카메라로부터 거리를 측정해서 기록하는 Z-Buffer가 표현할 수 있는 해상도 때문입니다. 폴리곤 사이를 충분하게 띄어주었고, Z-Buffer의 해상도를 24비트 정도를 썼다면 이런 현상은 대부분 벌어지지 않습니다. 최신 그래픽 카드는 W-Buffer를 지원하고 있는데, Z-Buffer와 비교해서 어떤 좋은 점이 있을까요? 이것을 이해하기 위해서는 카메라 투영변환(Projection transform)에 대해서 이해할 필요가 있습니다. 3D 그래픽에서 사용하는 카메라는 바늘구멍사진기(pin hole cam.. 2011. 9. 22.
Culling vs. Clipping 실시간 3D 그래픽을 하는데 있어서 가장 중요한 것 중에 하나가 바로 어떻게 하면 그래픽 속도를 높이는가가 아닐까 합니다. 그래픽 속도를 높이는데 있어서, 두가지 부분은 상당히 중요하다고 볼 수 있습니다. 대부분의 게임을 작성할 때, 하나의 모델은 여러개의 오브젝트로 나누어지게 됩니다. 오브젝트 안에는 vertex 정보, texture coordinate 정보, normal 정보 (이 정보는 없는 경우도 있습니다.) 가 기본적으로 있고요. 거기에 추가되는 정보가 material, texture 정보가 있습니다. culling을 위해서는 오브젝트 안에 기본적인 정보 이외에 bound 정보를 추가하게 됩니다. bound는 어떻게 구성하느냐에 따라서 성능의 차이가 생깁니다. 예를 들어서 box 형태라고 한다면.. 2011. 9. 21.
알파 오브젝트 정렬 며칠전에 알파 블렌딩 때 오류가 난나는 분의 문의 메일을 받았는데, 이유는 그것이 아니었지만, 알파 블렌딩에서 필요한 요소 기술들을 많이 모르고 있어서 여기에 소개하고자 합니다. 알파 블렌딩을 할 때, 제일 먼저 신경 써주어야 하는 것은 그리는 순서입니다. 불투명 오브젝트는 Z-Buffer(또는 뎁스버퍼)의 도움으로 그리는 순서에 상관없이 카메라로부터 가까운 거리의 오브젝트는 먼 거리의 오브젝트를 가리게 됩니다. 그러나 투명 오브젝트는 Z-Buffer의 도움을 받을 수가 없죠. 그리는 순서에 따라서 결과값이 달라지게 됩니다. 예를 들어서 노란색에 50% 투명도를 가지고 있는 오브젝트 A와 파란색에 50% 투명도를 가지고 있는 오브젝트 B가 있다고 하죠. A 오브젝트가 B 오브젝트에 비해서 카메라로부터 거.. 2011. 9. 19.
이벤트 핸들링에서의 case 문장 이벤트 핸들링 방식으로 프로그램을 짠다면, 유용하게 사용할만한 방법입니다. Visual C/C++ 기준입니다. #if defined(_DEBUG) #define CASE(X) case X: OutputDebugString("[" #X "]\n") #else #define CASE(X) case X: #endif void proc(int event, unsigned short wParam, unsigned long lParam) { switch(event) { CASE(EVENT_START); { ... break; } .... } } 이런 식으로 프로그램을 짜면, 디버그 모드일때는 이벤트 값을 디버그 창에 계속 뿌려주게 됩니다. 릴리즈 모드일때에는 불필요한 코드를 없애줄 수 있습니다. 프로그램을 짤 때 .. 2011. 9. 16.
조건문의 최적화 방법 if 문장 안에 쓴 조건문의 표현 방식에 따라서 속도차이가 발생한다는 것입니다. 요즘 진보된 프로세서에서는 이것마저도.. 아주 훌륭하게 잘 처리되고 있지만.. (실제.. 조건문을 두세단계정도는 미리 계산하는 것이 요즘프로세서던가?? 테스트해보질 않아서.. 하하.. 나중에 기회가 되면 한번 속도 테스트해보아야지.. :) 예를 들어서 조건문 A의 확률이 80%, 조건문 B의 확률이 20%였다면, 다음의 두 조건문은 같은 기능을 하지만 속도에서는 약간 차이가 발생합니다. if(A || B) return; if(B || A) return; 이경우.. 첫번째 조건문은 80%확률로 A 조건을 검사하고, 20% 확률로 A 조건과 B 조건을 검사합니다. 두번째 조건문은 20% 확률로 B 조건을 검사하고 80% 확률로 .. 2011. 9. 16.
728x90