Upload
mingeun-park
View
1.573
Download
4
Embed Size (px)
Citation preview
3D RENDERING OPTIMIZING #2- 박 민 근 ( 민군 )- DEVROOKIE(CAFÉ.NAVER.COM/DEVROOKIE)
:: 가장 빠르게 그리는 방법은 안그리는 것이다 .
1DevRookie 박민근 ( 민군 )
목 차1.CULLING 이란 ?
2.BACKFACE CULLING
3.VIEW FRUSTUM CULLING
4.HARDWARE OCCLUSION CULLING
5. 공간 분할 CULLING
6.BSP
7.PVS, PORTAL
8.QUADTREE
9.OCTREE
10.참고 자료
2DevRookie 박민근 ( 민군 )
1. Culling 이란 ?컬링이란 최종 씬에 보이지 않는 불필요한
폴리곤을 잘라내어(Culling) 렌더링하지 않는
기법이다.
3DevRookie 박민근 ( 민군 )
1.1 Culling 의 종류
1. BackFace Culling : 후면 폴리곤 제거2. ViewFrustum Culling : 시야밖 의 폴리곤 제거3. Occlusion Culling : 차페된 폴리곤 제거
4DevRookie 박민근 ( 민군 )
2. BackFace Culling
뒷면을 없애라 ! 백페이스 컬링 !카메라에서 보이지 않는 뒷면의 폴리곤을 제거하는 기법
CPU 에서 계산하는 소프트웨어적 처리 방법과 GPU 에서 계산하는 하드웨어적 처리방법이 있다 .
GPU 가 발전한 지금은 걍 하드웨어에 맡기면 된다 .
최종적으로 레스터라이즈된 삼각형의 정점이 시계 반대방향 (CCW) 순서면 컬링된다 .
시계방향으로 컬링하여 앞면 컬링을 할 수도 있다 .
5DevRookie 박민근 ( 민군 )
2. BackFace Culling
// 백페이스 컬링pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
// 프론트페이스 컬링pd3dDevice->SetRenderState (D3DRS_CULLMODE, D3DCULL_CW);
// 컬링 없음pd3dDevice->SetRenderState (D3DRS_CULLMODE, D3DCULL_NONE);
• 렌더 스테이트 설정으로 간단히 설정 가능
• 하드웨어 컬링은 파이프라인을 다 통과한 후 레스터라이즈 된 후 컬링된다 .
• CPU 에서 소프트웨어적으로 처리도 가능하다 . 지금날의 GPU 에서는 하드웨어에 맡기는 것으로도 충분하다 .
6DevRookie 박민근 ( 민군 )
3. View Frustum Culling내 눈앞에 없는것은 존재하지 않는 것이다 ! 뷰프러스텀 컬링 !
카메라에서 보이지 않는 , 시야 절두체 (View Frusutm) 에서 벗어난 폴리곤을 그리지 않는 기법
최종적으로 하드웨어에서 컬링되긴 하지만 , CPU 에서 미리 계산해서 파이프라인에 보내지 않는 것이 더욱 유효하다 .
폴리곤 단위 계산은 계산양이 너무 많기 때문에 일반적으로 바운딩 스피어를 통해서 계산한다 .
렌더링뿐만 아니라 , 업데이트등의 계산에도 활용된다 .
DevRookie 박민근 ( 민군 ) 7
3.1 Bounding Volume
DevRookie 박민근 ( 민군 ) 8
3. View Frustum Culling
DevRookie 박민근 ( 민군 ) 9
• View Frustum : 카메라를 기준으로 6 개의 평면으로 구성
• 프러스텀에 걸치거나 포함된 것만 렌더링하고 , 그외의 것은 컬링한다 .
3. View Frustum Culling
DevRookie 박민근 ( 민군 ) 10
기본 뷰프러스텀 컬링 구현 : 평면의 방정식 사용
ax + by + cz + d = 0
a,b,c : 평면의 법선 x,y,zd : 평면과의 거리
프러스텀을 구성하는 6 개의 평면의 방정식에 계산할 정점을 대입하여 거리를 계산한다 .
이때 거리가 + 면 평면의 위쪽 ( 프러스텀의 바깥쪽 ) 에 있는 것이고 , - 면 평면의 아래 ( 프러스텀의 안쪽 ) 에 위치한 것이다 .
바운딩 스피어를 이용하여 계산할때는 스피어의 중심점을 대입하여 계산하고 거리 d 가 + 일때 거리가 스피어의 반지름보다 작은 경우 평면에 걸쳐져 있는 것이다 .
각 6 개의 평면과 모두 계산하여 프러스텀에 포함되는 지를 판단한다 .
3. View Frustum Culling
DevRookie 박민근 ( 민군 ) 11
프러스텀 컬링 최적화 : 프러스텀의 바운딩 스피어 사용
프러스텀의 바운딩 스피어를 구한 후 , 오브젝트의 바운딩 스피어와의 거리를 계산하면 한번의 간단한 연산으로 끝난다 .
6 개의 평면에 대해서 전부 계산할 필요가 없다 . ( 연산량 최적화 )
스피어& 스피어 거리 계산 LENGTH(CENTER(A) , CENTER(B)) < RADIUS(A) + RADIUS(B)
다만 프러스텀에 포함되지 않는데도 포함된다고 판단하는 경우가 있다 . ( 느슨한 계산 )
4. Occlusion Culling
뒤에 가려진 오브젝트는 눈에 보이지 않는다 ! 오클류젼 컬링 !
프러스텀안에 들어오지만 , 다른 오브젝트에 가려진 객체를 컬링하는 기법 . 백페에스 , 뷰프러스텀 컬링에서도 컬링되지 않는다 .
씬에 오브젝트가 많이질수록 깊이 복잡도는 점점 증가한다 .
DX9 부터 하드웨어서 지원이 된다 . (Occlusion Query)
Z-Buffer Test 와 다른점 : Z-Buffer Test 는 레스터라이즈된후에 픽셀단위로 수행되지만 , 오클류젼은 파이프라인 이전에 객체 단위로 수행할 수 있다 .
DevRookie 박민근 ( 민군 ) 12
4. Occlusion Culling
DevRookie 박민근 ( 민군 ) 13
• 같은 픽셀에 그려지는 폴리곤에 의한 깊이 복잡도
4. Occlusion Culling
DevRookie 박민근 ( 민군 ) 14
1. DX 9의 Occlusion Query 객체 생성
2. Z버퍼만 존재하는 RenderToSurface 생성
3. 프러스텀 컬링후 화면상의 모든 바운딩 메시를 2번에 렌더링
4. 쿼리를 키고 각각의 바운딩 매쉬를 2번에 렌더링
5. 쿼리를 끄고, 몇 개의 픽셀이나 화면에 그려지는 지의 정보를 받아옴
6. 1개 이상하면 렌더링 플래그를 On
7. 모든 바운딩 메쉬에 4~6번을 반복 작업
8. 렌더링 플래그가 On된것만 백버퍼에 렌더링
4. Occlusion Culling
DevRookie 박민근 ( 민군 ) 15
※ 주의점 Querty Time > Rendering Time : 이런 상황이면 의미가 없다 .
• 렌더링뿐 아니라 객체의 업데이트의 컬링에도 사용 가능
1. DX, Nvidia 샘플 시연
2. 코드 설명
5. 공간 분할 Culling
DevRookie 박민근 ( 민군 ) 16
옆방에서 무슨일이 벌어지는지 난 모른다 ! 공간 분할 컬링 !
게임상의 월드를 특정 기준으로 공간적으로 분할하여 , 보이지 않는 공간을 컬링한다 .
보이지 않는 공간은 렌더링 / 업데이트 할 필요가 없다 .
분할된 공간은 트리로 구성되어 , 상위 트리가 컬링되면 하위 트리도 자동으로 컬링된다 .
공간 분할에는 균등 분할과 비균등 분할이 있다 .
BSP, QuadTree, OcTree, PVS, Portal 등
6. BSP
DevRookie 박민근 ( 민군 ) 17
Binary Space Partitioning
하나의 공간을 2 개의 공간으로 재귀적으로 분할하는 기법
FPS 와 같은 인도어 게임에서 유용하다 .
상위 트리가 컬링되면 하위 트리는 무조건 컬링된다 .
실시간 보다는 미리 만들어 두는 경우가 많다 .
6. PVS / Portal
DevRookie 박민근 ( 민군 ) 18
Potentially Visible Set ( 보일 가능성이 있는 것들의 세트 )
어떤 위치가 주어 졌을때 그 위치에서 보일 가능성이 있는 공간및 오브젝트들의 집합
오프라인 상에서 , 공간별로 보일 가능성이 있는 것들을 미리 선별하여 구별한다 .
BSP 트리의 단점을 보완하는 형태로 BSP 와 같이 쓰이는 경우가 많다 .
문이나 창문등을 기준으로 Visible Set 을 결정하는 것을 Portal Rendering 이라고 한다 .
실내 공간의 구별과 컬링에 상당히 유용하게 사용된다 .
6. PVS / Portal
DevRookie 박민근 ( 민군 ) 19
6. PVS / Portal
DevRookie 박민근 ( 민군 ) 20
6. PVS / Portal
DevRookie 박민근 ( 민군 ) 21
7. QuadTree
DevRookie 박민근 ( 민군 ) 22
하나의 공간을 4 개씩 재귀분할여 트리를 만드는 기법
4 개의 하위 트리는 상위 트리에 포함되기 때문에 상위 트리가 컬링되면 하위 트리는 무조건 컬링된다 .
지형과 같은 2D 공간에서 주로 사용된다 .
4 개의 공간은 균등 분할된다 .
Height Map 을 이용한 아웃도어에서 주로 사용된다 .
충돌 체크및 업데이트등에도 이용된다 .
카메라가 있는 공간과 프러스텀을 기준으로 동적으로 재귀적으로 생성된다 .
8. OcTree
DevRookie 박민근 ( 민군 ) 23
하나의 공간을 8 개씩 재귀분할여 트리를 만드는 기법
쿼드트리를 3D 공간으로 확장한 것 . (Y축 확장 )
비행 시뮬레이션과 같은 3D 공간 게임에서 사용된다 .
구현 및 내용은 쿼드트리와 거의 동일
감사합니다 .Q & A
24DevRookie 박민근 ( 민군 )
10. 참고 자료
1.Real Time Rendering 2 판
2.마이크로소프트 2002 년 4 월호 - 폴리곤
수를 줄이는 가시면 결정 기법
3.Nvidia SDK
4.Occlusion Culling Using DirectX 9
5.BSP Tree 논문 번역
25DevRookie 박민근 ( 민군 )
다음주 예고1. 간단한 시야거리 제한으로 퍼포먼스 올리기2. 같은 객체를 한번에 모아서그리자 ! 인스턴싱 !
3. 멀리 있는 객체는 자세히 그릴필요 없지 . 임포스터 !
4. 렌더링 파이프라인 최적화 전략
26DevRookie 박민근 ( 민군 )