공부

리얼타임 렌더링_입문

imitme 2018. 1. 1. 22:51
반응형

2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)


https://www.slideshare.net/SukwooLee4/2017-12-09-85033171


[기본설명]


컴퓨터 그래픽스

CG

벡터 그래픽스

레스터 그래픽스

방식

기하학적인 방법

레스터라 불리는 2차원 그리드에 색 저장

해상도

해상도 무한

해상도 유한

확대시

그대로

퀄리티 떨어진다.

속도

느리다

-

지원

완벽하게 지원하는 장비 없다.

컴퓨터 하드웨어는 레스터 그래픽스를 지원한다.



[레스터 기반 리얼타임 렌더링]

CG에서 렌더링 이란? 

- 컴퓨터 상에서 이미지를 생성하는 것

리얼타임 붙는 이유는?

 

실시간

비실시간

정의?

실시간으로 이미지를 생성하고 화면에 보여주는 것

이미지를 생성하는 모든 작업을 먼저 완료 후, 완성된 이미지를 순서대로 화면에 보여준다.

퀄리티

-

높다

게임

애니메이션

플레이타임

무한

유한

콘티

유저의 input에 따라

존재

장면

확정되지 않음

확정


모든 장면을 미리 알고 개발 & 시간이 정해져 있어 = 비실시간 렌더링 가능!



[모델링]

1. 모델 = 폴리곤 메쉬(모델의 형상) + 텍스쳐(입힐 색상) + 골격(리깅:캐릭터에 움직임을 넣기 위해 필수)


2. LEVEL OF DETAIL (LOD) 조정: 게임의 퀄리티와 컴퓨터의 성능을 고려.


3. 저장 : 

컴퓨터가 읽을 수 있는 형태로! 버텍스(VERTEX : 모델을 구성하는 최소한의 단위: 위치, 노멀벡터, 텍스쳐 좌표)

단, 폴리곤 메쉬 인식 = 위치 정보(버텍스) + 선 정보

/*************************************************************************************

따라서, NON-INDEXED TRIANGLE LIST (Vertex Buffer에) 버텍스 담는 버퍼에 삼각형 연결 순(=좌하부터 돌고와 우상 순)으로 버텍스를 채워넣는다. 

그러나, 중복되는 데이터가 많아 비효율적. 이 중복 문제 해결을 위해


INDEXED TRIANGLE LIST// INDEXED BUFFER. 버텍스버퍼의 인텍스를 이용해 각 점을 이어준다. // 

(앞에 두개의 선만 연결시키면 마지막 연결할 선이 무엇인지 알기에 마지막 연결 정보는 인덱스 버처에 저장하지 않는다.

**************************************************************************************/

4. EXPORTING

모델링 프로그램과 그래픽 API 좌표계가 다르기 때문에 주의! (우)

RHS in 3DS MAX

RHS in OpenGL

LHS in Direct3D

^

<

>


예1 ) MAX > OpenGL : YZ축 대칭이동 ( Flip YZ....)

예2 ) MAX > Direct3D : YZ축 대칭이동 > ㅡZ > 

(컬링) > 뒷면제거 설정:D3DCULL_CW : 왼손좌표계로 시계방햐으로 감긴 삼각형을 정면으로 판별하기에...


5. 렌더링

렌더링은 CPU 아닌 GPU에서 수행된다.

CPU > 테이터 > VRAM > GPU > Rendering ! 


**테이터 > VRAM : 

CPU에서 모델 데이터를 로드 후 VRAM으로 보낸다.(데이터 이동 매우 느림) 

// CPU와 GPU가 메모리를 공유하지 않기 때문에


** GPU > Rendering !

GPU에서 렌더링을 수행한다.

//병렬작업이 월등히 유리하게 설계되었기 때문에 (CPU는 커다란 코어를 2-8개 넣지만, GPU는 작은 코어를 수백개씩 넣는다)

픽셀단위의 레스터 이미지는 퀄이 높아질수록 픽셀의 개수도 많아진다.

따라서, 픽셀 한번에 하나씩 채우기보단 한번에 여러 픽셀을 채우는 것이 가능한 GPU에서 수항하는 게 훨씬 빠르다.


//*************************************************

**  > Rendering

_1. 장면이 화면에 표시

백버퍼 초기화 > 데이터 설정(렌더링에 필요한) > 렌더링(장면의 객체들을) > 화면


****백버퍼 초기화 : 렌더링의 출력을 백버퍼라고 한다.

백버퍼는 레스터 이미지가 데이터화하며 저장된 형태

백버퍼의 데이터는 화면 표시 단계에서 이미지 형태로 변화하여 화면에 표시된다.


랜더링 작업에는 두가지 버퍼(더블 버퍼링)를 이용한다.

프론트 버퍼는 화면에 보여지는 것

백 버퍼는 렌더링 작업이 진행되고 있는 것

두 가지 버퍼를 사용하지 않으면, 테어링(이전장면과 현재장면이 섞이는 현상)이 일어남. 


****렌더링

: 랜더링 파이프라인(렌더링 구간의 과정을 단계별로 묶는 것)

버텍스* 처리 > 레스터화* > 프래그먼트 처리 > 출력 병합

(처리) 프로그래머가

(나머지) 하드웨어가


버텍스* 처리

: 모델의 공간을 변환. 버텍스 쉐이더에서 프로그래머가 처리!

: Object  -(transform : world)-> World -( : view)-> Camera -( =: projection)-> Clip space

: (AFFINE : 이동, 회전, 스케일) 변환

-(transform : world) : 객체공간에 있는 객체를 게임 월드 공간으로 배치하는 것_행렬

-(transform : view) : 게임 월드 공간에 있는 객체들을 뷰 공간으로 변환하는 것. 유저가 바라보는 시점으로 바뀐것(카메라 위치, 카메라 방향, 카메라 윗 방향벡터)

-(transform : projection) : 뷰 공간에서 원근법이 적용된 공간.

레스터화* 

: 공간변환된 버텍스는 삼각형으로 조림되고 레스터로 변형된다. 

: 점, 선, 면으로 이루어진 폴리곤 메쉬를 레스터로 변형시키는 단계

: 삼각형을 조립 > 모델 예외 폴리곤 제거 > 원근감 적용 > 시야범위 예외 폴리곤 제거2 > 스크린 공간으로 변환 > 레스터화한 프래그먼트 생성!

//...//




텍스쳐링 

: 프레그먼트(3차원 폴리곤 메쉬를 2차원 데이터로 변형한 형태)에 텍스쳐를 입히는 것이라 설명. 텍스쳐좌표를 이용해 텍스쳐를 입힌다.

**텍스쳐 좌쵸 : 텍셀은 2차원 배열상의 자신의 위치를 나타내는 인덱스를 가지고 있다. 텍셀 어드레스가 아닌 정규화된 텍스쳐 좌표(UV)를 사용한다. (텍셀 사용하면, 같은 해상도를 가진 텍스쳐만 매칭가능하기 떄문, 텍스쳐좌표는 해상도에 영향받지 않고 표현에 붙엉)

**Suarface Parameterization : 텍스쳐 좌표는 모델링 단계에서 생성되는데, 폴리곤 메쉬의 버텍스에 텍스쳐 좌표를 해당하는 작업을 표현 파라미터화라 한다.

//....//














반응형