관심사/그래픽스

게임 그래픽 렌더링 원리와 최적화 요소

콘파냐 2014. 5. 7. 17:02

3차원 화면을 그리는 과정에서 많이 사용되는 용어들

버텍스(vertex) : 3차원 공간에서 위치를 표시하는 점. x,y,z 좌표 이외에 색상 방향 텍스쳐 좌표의 정보를 가진다. 3차원 오브젝트(object)는 버텍스를 이용하여 만들고, 렌더링 시에도 버텍스 정보가 있어야 처리가 가능하다.

픽셀(Pixel) : 2차원 평면을 구성하는 점.

투영(Projection) : 물체의 그림자를 다른 물체 위에 비추는 일 또는 비친 그림자.(입체가 아닌 평면으로 나타남)

버퍼(Buffer) : 메모리 공간

시야 절두체(VF)(View Frustum) : 카메라 화면에 보이지 않는 영역으로 공간의 형상이 피라미드의 꼭지점을 잘라낸 형태




시야각(FOV)(Field Of View)



알파블렌딩(Alpha Blending)

앞쪽에 있는 물체가 투명도가 있을 경우 뒤의 물체들이 함께 보이도록 처리하는 기법


새로 만들어진 픽셀 값 : Src

이미 저장되어 있는 기존의 픽셀 값 : Dst

최종 픽셀의 값 = (Src x Src Alpha) + (Dst x Dst Alpha)


해결방법

알파블렌딩 처리를 해야 할 물체는 항상 제일 마지막에 그려야 한다.

알파블렌딩을 사용한 물체가 여러 개일 경우에는 멀리 있는 물체부터 그려야 한다.



깊이버퍼(z-버퍼)

버텍스 셰이더 단계에서 3차원 공간의 값을 2차원 평면 상의 값으로 바꿀 때 카메라와 해당 점의 거리 값을 저장해 놓는 버퍼

깊이버퍼를 구성하는 픽셀의 개수 = 화면을 구성하는 픽셀의 개수

화면의 모든 픽셀에대해서 깊이 정보를 저장하게 됨



스텐실 버퍼, 스텐실 테스트

깊이버퍼와 함께 만들어 지는 버퍼, 화면의 모든 픽셀에 대해 부가적인 정보 저장



2차원 화면이 그려지는 원리

2차원 데이터 = 이미지 데이터(복사하는 방식-2D게임의 경우 표현되는 모든 이미지는 미리 그려져 있어야 한다.)



3차원 화면이 그려지는 원리(공간압축)



유리를 통해서 보이는 공간을 압축하여 유리벽에 붙도록 만든다는 원리

더 공부할 분야->그래픽스



렌더링 파이프라인

공간을 구성하는 데이터 ->데이터를 "공간압축" 또는 "투영"->평면상의 값으로 변경 -> 화면 출력


세부과정

1. 공간을 구성하는 데이터 준비



2. 3차원 공간의 점을 공간 압축 이후의 유리 평면상의 위치 값으로 변환

행렬을 곱하는 방식



3. 픽셀 채우기

처리 데이타 양의 증가



4. 텍스처 적용하기

색상 데이터를 넣어줌

미리 특정 위치의 픽셀에 넣어줄 값을 이미지로 만들어 놓는다면 효과적(텍스처)



5. 픽셀 테스트




6. 버퍼에 출력



텍스처(화면에 그려질 픽셀의 색상 값을 미리 만들어 저장해 놓은 이미지 데이터)

텍스처를 구성하는 픽셀 = 텍셀 (Texel)

(u,v) 형식으로 특정 텍셀의 위치 표시

모든 픽셀에 대해 텍스처 좌표를 이용하여 텍셀값을 읽어옴

샘플러(sampler)라는 하드웨어 장치에 의해 빠르게 처리됨


텍스처는 그래픽 퀄리티를 높이기 위한 요소로서 매우 중요


텍스처 이미지를 만들 때는 여러장으로 나누어 만드는 것보다 한 장으로 합쳐서 만드는 것이 더 효율적

텍스처 파일을 bmp로 만드나 jpg로 만드나 차이가 없다.

압축된 형태로 사용하고 싶다면 dds확장자를 가진 이미지 파일을 사용



셰이더

그래픽 카드 내부에 이미 만들어진 동작방식에 대한 명령

셰이더의 구성 

파이프라인에서 특정 기능을 담당하는 부분

버텍스 셰이더 : 공간 데이터 정보를 평면 상태 정보로 만드는 기능(공간압축)

지오메트리 셰이더 : 삼각형의 세 점 내부의 픽셀을 추가하는 기능

픽셀 셰이더 : 픽셀에 텍스처를 입히는 기능


셰어더 언어

Cg, HLSL,GLSL



픽셀의 색 결정 요인

버텍스 컬러(Vertex Color)

- 3ds Max와 같은 그래픽 툴에서 데이터 제작할 때 버텍스 정보에 추가할 수 있는 요소

- 위치 값, 방향 벡터, 버텍스 컬러, 텍스처 좌표 등.

- 버텍스 컬러값을 넣어주지 않으면 기본 흰색 사용


라이트 컬러

- 공간에 설정해 준 빛의 색상과 방향에 따라 픽셀 색상에 영향

- 버텍스 컬러값과 라이트 컬러 값이 동시에 작용한다면 두 색상을 곱해 처리

- 라이트 컬러 적용할 때 명암 계산을 함께 진행(위치에 따라 라이트 색상이 어둡게 만들어 질 수 있음)


텍스처

- 텍스처에서 텍셀 값을 가져와 지정된 픽셀에 적용

- 라이트가 함께 적용된다면 라이트 색상과 텍셀의 컬러 값이 곱해짐


알파블렌딩과 안개효과

- 픽셀 셰이더 단계를 지나면 알파블렌딩 단계에서 이미 출력되어 있는 픽셀의 값과 새로 넘겨받은 픽셀의 값을 어떻게 혼합할 것인가 결정

- 안개효과 : 안개의 농도와 색상에 픽셀의 최종 색상이 곱해짐



참고:3ds Max에서 제작한 상태 그대로 결과물이 나오지 않는 이유는 그래픽 툴과 게임엔진이 최종 픽셀의 색상을 결정하는 방법이 다르기 때문. unreal engine의 결과물이 좋은 이유는 자체 엔진에서 편집을 할 수 있도록 편리한 툴을 제공하기 때문.

해결책 위 요소들에 대한 정교한 편집이 가능한 툴을 만들면 된다.





장면 처리 속도 향상을 위한 것들

렌더링 함수 호출(Draw Call)


필요한 계산, 리소스 준비

그리기 시작

렌더링 파이프라인 작동 시작(과정이 길고 복잡하고 상당한 시간이 소요, 한번 시작되면 마무리까지 다음 작업 진행을 못함)

입력된 데이터가 처리된 후 화면에 그려짐


해결책 : 렌더링 함수 호출 횟수를 줄인다.

방법 : 화면에 보이는 물체들만 그리도록 미리 검사를 해서 처리 , 시야 절두체 안에 들어있지만 다른 물체에 의해 완전히 가려지는 물체들은 그릴 필요가 없음(미리 확인하여 제거) ,  데이터 제작시 object들을 merge 기능으로 합침(필요에 따라서 분리 해야 할 경우도 있음)



리소스 병목현상(하드웨어 사양으로 해결)

출처-한국콘텐츠진흥원

반응형