26
3D RENDERING OPTIMIZING #2 - 박 박 박 ( 박박 ) - DEVROOKIE(CAFÉ.NAVER.COM/DEVROOKIE) :: 가가 가가가 가가가 가가가 가가가가 가가가 . 1 DevRookie 가가가 ( 가가 )

[박민근] 3 d렌더링 옵티마이징_2

Embed Size (px)

Citation preview

Page 1: [박민근] 3 d렌더링 옵티마이징_2

3D RENDERING OPTIMIZING #2- 박 민 근 ( 민군 )- DEVROOKIE(CAFÉ.NAVER.COM/DEVROOKIE)

:: 가장 빠르게 그리는 방법은 안그리는 것이다 .

1DevRookie 박민근 ( 민군 )

Page 2: [박민근] 3 d렌더링 옵티마이징_2

목 차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 박민근 ( 민군 )

Page 3: [박민근] 3 d렌더링 옵티마이징_2

1. Culling 이란 ?컬링이란 최종 씬에 보이지 않는 불필요한

폴리곤을 잘라내어(Culling) 렌더링하지 않는

기법이다.

3DevRookie 박민근 ( 민군 )

Page 4: [박민근] 3 d렌더링 옵티마이징_2

1.1 Culling 의 종류

1. BackFace Culling : 후면 폴리곤 제거2. ViewFrustum Culling : 시야밖 의 폴리곤 제거3. Occlusion Culling : 차페된 폴리곤 제거

4DevRookie 박민근 ( 민군 )

Page 5: [박민근] 3 d렌더링 옵티마이징_2

2. BackFace Culling

뒷면을 없애라 ! 백페이스 컬링 !카메라에서 보이지 않는 뒷면의 폴리곤을 제거하는 기법

CPU 에서 계산하는 소프트웨어적 처리 방법과 GPU 에서 계산하는 하드웨어적 처리방법이 있다 .

GPU 가 발전한 지금은 걍 하드웨어에 맡기면 된다 .

최종적으로 레스터라이즈된 삼각형의 정점이 시계 반대방향 (CCW) 순서면 컬링된다 .

시계방향으로 컬링하여 앞면 컬링을 할 수도 있다 .

5DevRookie 박민근 ( 민군 )

Page 6: [박민근] 3 d렌더링 옵티마이징_2

2. BackFace Culling

// 백페이스 컬링pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);

// 프론트페이스 컬링pd3dDevice->SetRenderState (D3DRS_CULLMODE, D3DCULL_CW);

// 컬링 없음pd3dDevice->SetRenderState (D3DRS_CULLMODE, D3DCULL_NONE);

• 렌더 스테이트 설정으로 간단히 설정 가능

• 하드웨어 컬링은 파이프라인을 다 통과한 후 레스터라이즈 된 후 컬링된다 .

• CPU 에서 소프트웨어적으로 처리도 가능하다 . 지금날의 GPU 에서는 하드웨어에 맡기는 것으로도 충분하다 .

6DevRookie 박민근 ( 민군 )

Page 7: [박민근] 3 d렌더링 옵티마이징_2

3. View Frustum Culling내 눈앞에 없는것은 존재하지 않는 것이다 ! 뷰프러스텀 컬링 !

카메라에서 보이지 않는 , 시야 절두체 (View Frusutm) 에서 벗어난 폴리곤을 그리지 않는 기법

최종적으로 하드웨어에서 컬링되긴 하지만 , CPU 에서 미리 계산해서 파이프라인에 보내지 않는 것이 더욱 유효하다 .

폴리곤 단위 계산은 계산양이 너무 많기 때문에 일반적으로 바운딩 스피어를 통해서 계산한다 .

렌더링뿐만 아니라 , 업데이트등의 계산에도 활용된다 .

DevRookie 박민근 ( 민군 ) 7

Page 8: [박민근] 3 d렌더링 옵티마이징_2

3.1 Bounding Volume

DevRookie 박민근 ( 민군 ) 8

Page 9: [박민근] 3 d렌더링 옵티마이징_2

3. View Frustum Culling

DevRookie 박민근 ( 민군 ) 9

• View Frustum : 카메라를 기준으로 6 개의 평면으로 구성

• 프러스텀에 걸치거나 포함된 것만 렌더링하고 , 그외의 것은 컬링한다 .

Page 10: [박민근] 3 d렌더링 옵티마이징_2

3. View Frustum Culling

DevRookie 박민근 ( 민군 ) 10

기본 뷰프러스텀 컬링 구현 : 평면의 방정식 사용

ax + by + cz + d = 0

a,b,c : 평면의 법선 x,y,zd : 평면과의 거리

프러스텀을 구성하는 6 개의 평면의 방정식에 계산할 정점을 대입하여 거리를 계산한다 .

이때 거리가 + 면 평면의 위쪽 ( 프러스텀의 바깥쪽 ) 에 있는 것이고 , - 면 평면의 아래 ( 프러스텀의 안쪽 ) 에 위치한 것이다 .

바운딩 스피어를 이용하여 계산할때는 스피어의 중심점을 대입하여 계산하고 거리 d 가 + 일때 거리가 스피어의 반지름보다 작은 경우 평면에 걸쳐져 있는 것이다 .

각 6 개의 평면과 모두 계산하여 프러스텀에 포함되는 지를 판단한다 .

Page 11: [박민근] 3 d렌더링 옵티마이징_2

3. View Frustum Culling

DevRookie 박민근 ( 민군 ) 11

프러스텀 컬링 최적화 : 프러스텀의 바운딩 스피어 사용

프러스텀의 바운딩 스피어를 구한 후 , 오브젝트의 바운딩 스피어와의 거리를 계산하면 한번의 간단한 연산으로 끝난다 .

6 개의 평면에 대해서 전부 계산할 필요가 없다 . ( 연산량 최적화 )

스피어& 스피어 거리 계산 LENGTH(CENTER(A) , CENTER(B)) < RADIUS(A) + RADIUS(B)

다만 프러스텀에 포함되지 않는데도 포함된다고 판단하는 경우가 있다 . ( 느슨한 계산 )

Page 12: [박민근] 3 d렌더링 옵티마이징_2

4. Occlusion Culling

뒤에 가려진 오브젝트는 눈에 보이지 않는다 ! 오클류젼 컬링 !

프러스텀안에 들어오지만 , 다른 오브젝트에 가려진 객체를 컬링하는 기법 . 백페에스 , 뷰프러스텀 컬링에서도 컬링되지 않는다 .

씬에 오브젝트가 많이질수록 깊이 복잡도는 점점 증가한다 .

DX9 부터 하드웨어서 지원이 된다 . (Occlusion Query)

Z-Buffer Test 와 다른점 : Z-Buffer Test 는 레스터라이즈된후에 픽셀단위로 수행되지만 , 오클류젼은 파이프라인 이전에 객체 단위로 수행할 수 있다 .

DevRookie 박민근 ( 민군 ) 12

Page 13: [박민근] 3 d렌더링 옵티마이징_2

4. Occlusion Culling

DevRookie 박민근 ( 민군 ) 13

• 같은 픽셀에 그려지는 폴리곤에 의한 깊이 복잡도

Page 14: [박민근] 3 d렌더링 옵티마이징_2

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된것만 백버퍼에 렌더링

Page 15: [박민근] 3 d렌더링 옵티마이징_2

4. Occlusion Culling

DevRookie 박민근 ( 민군 ) 15

※ 주의점 Querty Time > Rendering Time : 이런 상황이면 의미가 없다 .

• 렌더링뿐 아니라 객체의 업데이트의 컬링에도 사용 가능

1. DX, Nvidia 샘플 시연

2. 코드 설명

Page 16: [박민근] 3 d렌더링 옵티마이징_2

5. 공간 분할 Culling

DevRookie 박민근 ( 민군 ) 16

옆방에서 무슨일이 벌어지는지 난 모른다 ! 공간 분할 컬링 !

게임상의 월드를 특정 기준으로 공간적으로 분할하여 , 보이지 않는 공간을 컬링한다 .

보이지 않는 공간은 렌더링 / 업데이트 할 필요가 없다 .

분할된 공간은 트리로 구성되어 , 상위 트리가 컬링되면 하위 트리도 자동으로 컬링된다 .

공간 분할에는 균등 분할과 비균등 분할이 있다 .

BSP, QuadTree, OcTree, PVS, Portal 등

Page 17: [박민근] 3 d렌더링 옵티마이징_2

6. BSP

DevRookie 박민근 ( 민군 ) 17

Binary Space Partitioning

하나의 공간을 2 개의 공간으로 재귀적으로 분할하는 기법

FPS 와 같은 인도어 게임에서 유용하다 .

상위 트리가 컬링되면 하위 트리는 무조건 컬링된다 .

실시간 보다는 미리 만들어 두는 경우가 많다 .

 

Page 18: [박민근] 3 d렌더링 옵티마이징_2

6. PVS / Portal

DevRookie 박민근 ( 민군 ) 18

Potentially Visible Set ( 보일 가능성이 있는 것들의 세트 )

어떤 위치가 주어 졌을때 그 위치에서 보일 가능성이 있는 공간및 오브젝트들의 집합

오프라인 상에서 , 공간별로 보일 가능성이 있는 것들을 미리 선별하여 구별한다 .

BSP 트리의 단점을 보완하는 형태로 BSP 와 같이 쓰이는 경우가 많다 .

문이나 창문등을 기준으로 Visible Set 을 결정하는 것을 Portal Rendering 이라고 한다 .

실내 공간의 구별과 컬링에 상당히 유용하게 사용된다 .

 

Page 20: [박민근] 3 d렌더링 옵티마이징_2

6. PVS / Portal

DevRookie 박민근 ( 민군 ) 20

Page 21: [박민근] 3 d렌더링 옵티마이징_2

6. PVS / Portal

DevRookie 박민근 ( 민군 ) 21

Page 22: [박민근] 3 d렌더링 옵티마이징_2

7. QuadTree

DevRookie 박민근 ( 민군 ) 22

하나의 공간을 4 개씩 재귀분할여 트리를 만드는 기법

4 개의 하위 트리는 상위 트리에 포함되기 때문에 상위 트리가 컬링되면 하위 트리는 무조건 컬링된다 .

지형과 같은 2D 공간에서 주로 사용된다 .

4 개의 공간은 균등 분할된다 .

Height Map 을 이용한 아웃도어에서 주로 사용된다 .

충돌 체크및 업데이트등에도 이용된다 .

카메라가 있는 공간과 프러스텀을 기준으로 동적으로 재귀적으로 생성된다 .

Page 23: [박민근] 3 d렌더링 옵티마이징_2

8. OcTree

DevRookie 박민근 ( 민군 ) 23

하나의 공간을 8 개씩 재귀분할여 트리를 만드는 기법

쿼드트리를 3D 공간으로 확장한 것 . (Y축 확장 )

비행 시뮬레이션과 같은 3D 공간 게임에서 사용된다 .

구현 및 내용은 쿼드트리와 거의 동일

Page 24: [박민근] 3 d렌더링 옵티마이징_2

감사합니다 .Q & A

24DevRookie 박민근 ( 민군 )

Page 25: [박민근] 3 d렌더링 옵티마이징_2

10. 참고 자료

1.Real Time Rendering 2 판

2.마이크로소프트 2002 년 4 월호 - 폴리곤

수를 줄이는 가시면 결정 기법

3.Nvidia SDK

4.Occlusion Culling Using DirectX 9

5.BSP Tree 논문 번역

25DevRookie 박민근 ( 민군 )

Page 26: [박민근] 3 d렌더링 옵티마이징_2

다음주 예고1. 간단한 시야거리 제한으로 퍼포먼스 올리기2. 같은 객체를 한번에 모아서그리자 ! 인스턴싱 !

3. 멀리 있는 객체는 자세히 그릴필요 없지 . 임포스터 !

4. 렌더링 파이프라인 최적화 전략

26DevRookie 박민근 ( 민군 )