컴퓨터 그래픽스란?
컴퓨터를 이용하여 영상을 생성하는 작업을 컴퓨터 그래픽스라 한다.
이 작업의 입력이 3차원 데이터로 주어지는 경우 3차원 그래픽스라고 부른다.
그래픽스의 발전은 나날이 눈에 띄게 발전되오고있다.
지난 30년간 영화 특수효과 뿐만 아니라 3차원 게임 내에서도 굉장한 발전을 이뤄오고있다.
이는 단순한 PC, 콘솔 게임 뿐만 아니라 모바일 영역에서도 고성능의 그래픽스를 찾아볼 수 있다.
실시간 그래픽스란?
그래픽스는 실시간 그래픽스와 비실시간 그래픽스로 나눌 수 있는데
실시간 그래픽스의 기준은 각 이미지를 1/30초 이내로 렌더링해야한다는 것이 기준이다.
( = Real-time graphics systems must render each image in less than 1/30th of a second.)
그렇지 않으면 비실시간 그래픽스라고 할 수 있다.
게임에서 사용하는 것은 실시간 그래픽스이다.
실시간 그래픽스 API는 다양한 종류가 있다.
이러한 실시간 그래픽스를 도와주는 API는 대표적으로
OpenGL, DX, Vulkan 이 있다.
그래픽 디자이너가 오프라인 상태에서 모델링, 리깅, 애니메이션 작업을 수행한 후
런타임에서 애니메이션 렌더링, 후처리는 응용 프로그램에 의해 실행된다.
대체로 게임 프로그램은 게임 엔진을 이용하여 제작된다.
게임 엔진은 애니메이션,렌더링,후처리에 필수 불가결한 요소를 망하라하는 개발 툴인데,
게임을 제작할 때는, 그래픽스 API를 사용하여 엔진을 제작한다.
대표적인 상용 엔진으로는 언리얼과 유니티가 있다.
언리얼은 DX를 사용하며,
유니티는 그래픽스 API지원은 특정 플랫폼의 유효성에 따라,
DX, Metal, OpenGL, Vulkan 그래픽스 API를 지원한다.
그래픽스 API는 그래픽스 응용에 필수적인 함수들을 제공한다.
이러한 함수들은 대부분 그래픽스 전용 프로세서인 GPU 내에서 하드웨어로 구현되어 있다.
따라서 그래픽스 API는 GPU에 대한 소프트웨어 인터페이스라고 할 수 있다.
즉, 그래픽스API는 그래픽스 응용 프로그램 혹은 게임 엔진에서 호출하는 함수를
GPU에서 실행 가능한 명령들로 바꿔주는 역할을 한다.
그래픽스 제작 단계 5단계 추상화
컴퓨터 그래픽스 제작 단계는 추상화하여 5개의 단계로 추릴 수 있다.
모델링 리깅 애니메이션은 그래픽 디자이너가 오프라인으로 수행하고
런타임에 프레임 별로 애니메이션이 재싱되고 렌더링과 후처리가 수행된다.
가상의 그래픽스 환경을 구성하는 각각의 물체를
컴퓨터가 처리할 수 있는 방식으로 표현한 것을 모델이라고 한다.
모델링 단계에서는 바로 이러한 모델들을 만들어 낸다.
이러한 모델들은 폴리곤(polygon : 다각형)들로 구성된다.
이렇게 폴리곤으루 구성된 물체는 폴리곤 메시라고 부른다.
모델링의 범위는 3차원 물체에 국한되지 않으며,
3차원 물체에 입혀져서
시작적 사실성을 높여주는 텍스처의 제작 또한 매우 중요한 모델링 작업이다.
이러한 폴리곤 메시에 골격을 삽입한 뒤 이를 움직여 애니메이션을 생성한다.
이 골격은 3차원 물체같지만 대개 행렬로 표현되는 수학적인 개체들이다.
이런 골격을 구성한 후에 각각의 뼈의 움직임이
폴리곤 메시에 어떻게 반영될 것인가를 정의해야한다.
예를 들어 팔의 뼈가 움직일 때
그 주변의 폴리곤이 따라서 움직이도록 설정되어야 한다.
이러한 과정을 리깅이라고 부른다.
폴리곤 메시에 삽입된 골격이 폴리곤 메시를 움직이는 것은
애니메이터들이 캐릭터 골격을 움직여 캐릭터의 애니메이션을 정의하면
이는 런타임에 프레임 별로 재생된다.
해당 애니메이션을 3차원 장면에서 2차원 영상으로 그려내는 것을 렌더링이라고 한다.
즉 프레임으로 만드는 작업을 렌더링이라고 한다.
렌더링은 매우 복잡한 연산을 요하는 단계로,
텍스처를 물체 표면에 입히는 텍스처링, 그리고 빛과 물체의 상호작용을 하는 라이팅이 그 핵심을 이룬다.
빠른 속도로 진행되는 애니메이션의 경우,
한 프레임에 그 이전 프레임의 잔영을 남기면 시각적 사실성을 높일 수 있다.
이를 모션 블러라고 한다.
또한, 일반 사진과 같이 초점이 맞춰지는 영역 바깥 부분을 흐릿하게 처리하면,
사실감을 높일 수 있다. 이를 초점 심도라고 한다.
이와 같은 작업은 모두 컴퓨터 그래픽스 제작의 마지막 단계인
후처리를 통해 이루어진다.
만약 시간이 허락하지 않으면 후처리는 생략가능하다.
OpenGL과 State machine
State machine이란?
State machined은 컴퓨터 프로그램과 전자 논리 회로를 설계하는 데 쓰이는 수학적 모델이다.
쉽게말하면,
여러개의 제한된 상태가 존재하고, 그 존재들이 특정 조건에 물려 서로 연결되어있는 형태를 의미한다.
각각의 state를 어떤 조건에 맞게 연결해놓은 것으로
이는 유/무한한 개수의 상태를 가질 수 있는 추상 기계라고 할 수있다.
이러한 기계는 한 번에 오로지 하나의 상태만을 가지게 되며,
이러한 기계는 어떠한 사건에 의해 한 상태에서 다른 상태로 변화할 수 있으며,
이를 전이라고 한다.
유한한 행동을 하도록 만들어진 특정한 기계는 현재 상태로부터 가능한 전이 상태와
이러한 전이를 유발하는 조건들의 집합으로 정의된다.
OpenGL은 그 자체로 거대한 state machine이다.
미리 정의되어 있는 유한개의 state들을 가지고 있으므로 FSM의 일종으로 보는 것이다.
이러한 OpenGL특징은 그래픽스 API를 아울러 비슷하다.
랜더링은 앞서 말했듯이 복잡한 연산을 요하며 이는 하드웨어에 많은 비용을 요구하게된다.
이러한 고비용은 컴퓨터에 부담을 주게된다.
고성능의 리얼타임렌더링도 중요하지만 이에 대한 비용을 줄이는 최적화 또한 중요하다.
앞서 말한바와 같이 State machine을 이용하여
실시간 3D 그래픽을 위한 렌더링 상태 변경 비용을 감소하는 방법이 있다.
실시간 3D 그래픽의 렌더링 상태 변화 비용의 패턴을 분석하여
분석된 패턴을 기반으로
렌더링 상태 변화 비용이 큰 것에 대하여 우선적으로 정렬하는 알고리즘을 제시한 후
제안 우수성은 상태비용을 정렬하지 않은 알고리즘에 비해 2.5배~4배 정도의 비용이 감소된다.
이 기법은 특정 렌더링 상태의 변화 비용이 크게 증가할수록 우수함을 보이는 알고리즘이다.
알고리즘 차원에서 렌더링 속도를 향상시키기 위한
다양한 가속화 알고리즘이 연구되었다.
공간 자료 구조를 기반으로 적용되는 다양한 컬링 기법은
화면에 렌더링하는 폴리곤 중 카메라에 보이지 않는 것을 빠르게 찾아내어
렌더링을 하지 않음으로써 렌더링을 가속화 하는 알고리즘이다.
LOD와 같은 기법은 실시간에 카메라에 멀리 떨어져 작게 보이는 것은
폴리곤의 수를 줄임으로써 렌더링 속도를 향상시키는 방법이다.
또 다른 3D 그래픽 가속화 기법은 렌더링 파이프라인 최적화가 있다.
3D 그래픽 파이프라인은 어플리케이션에서 제공한 3차원 장면 데이터를
단계적으로 처리하여 최종적으로 이차원 모니터 다.
어플리케이션은 그래픽 파이프라인에 3차원 장면 데이터를 넘겨주게 된다.
파이프라인 최적화는 어플리케이션이 제공한 3차원 영상 데이터의 순서를
파이프라인이 최대한 효율적으로 렌더 링 가능하도록 변환하는 최적화 기법이다.
화면에 표시되는 영상을 만들어내는 작업이다.
이처럼 다양한 알고리즘으로 렌더링에 대한 부담을 덜 수 있다.
이미지와 그래픽
오늘날 사용하는 대부분의 디스플레이는 레스터 그래픽스를 사용한다.
레스터 그래픽스는 디스플레이가 2차원 격자형태의 픽셀을 갖고 있음을 뜻한다.
레스터 방식의 파일 포멧으른 BMP, GIF, JPEG, PNG가 있고
벡터 방식의 파일 포멧은 AI,SVG가 있다.
픽셀은 색상 뿐만 아니라 다양한 빛을 나타낼 수 있다.
픽셀이란 Picture Element의 줄임말로 그림을 이루는 가장 기본이 되는 요소를 말한다.
아날로그 그림을 컴퓨터 내부로 가저오기 위해서 디지털 데이터로 변경해야 한다.
디지털화 작업은 크게 2가지로 나눌 수 있다.
1. 샘플링
샘플링은 아날로그 데이터를 일정한 간격으로 샘플을 추출하는 것을 의미한다.
카메라가 어떤 영상을 촬영한다는 작업은
카메라에 들어온 영상을 특정 픽셀수로 샘플링한다는 것을 의미한다.
이때 사용하는 픽셀의 숫자가 많을수록 더욱 정교한 사진이 되는 것은 당연하다.
동일한 그림을 다양한 픽셀수로 샘플링하면,
당연히 픽셀수가 많은 이미지가 고해상도를 가지게된다.
2. 양자화
양자화는 샘플링된 지점의 아날로그 데이터 값을 이산적인 값으로 변환하는 작업을 의미한다.
디지털 표현에서 픽셀당 더 많은 비트를 사용해서 표현하면 더욱 정교한 색상을 표현할 수 있다.
몇 비트를 사용하는가에 따라 색상의 정밀도가 좌우된다.
한 픽셀에 한 비트만을 할당하면 흑, 백 2가지 색상만으로 이미지를 표현해야한다.
8비트를 사용하면 256개의 색상을 포현할 수 있다.
즉, 사용하는 비트수가 많아질 수록 더욱 정확한 색상을 표현할 수 있다는 의미이다.
색상 모델
색상 모델이란 색상을 사용하기 위한 가장 기본되는 색상의 표현 방법을 말한다.
RGB, CMYK, HSI, YUV, YIQ 등 다양한 색상 모델이 있다.
이들을 사용하는 하드웨어에 따라 또는 소프트웨어에 따라 서로 변환하면서 사용하기도 한다.
RGB
가산 혼합 모델로 Red, Green, Blue 3색을 혼합함으로써 색깔을 표현하는 방식이다.
빛을 기반으로 한 색상 표현 모델로써 빛이 하나도 없을 때는 검은색,
모든 색상의 빛이 모였을 때는 흰색으로 표현되는 원리에 기반한다.
이는 우리가 일반저긍로 가장 많이 사용하는 모델로써
CRT 모니터 등 비층로 색상을 표현하는 곳에서 많이 사용되고 있다.
CMYK
감산 혼합 모델로 빛에 기초한 색상 표현법인 RGB와 다르게
프린트되는 잉크에 기초한 표현 방법이다.
프린트 등에서 많이 사용되는 색상 모델로,
청록색Cyan 심홍색Magenta 노란색Yellow 검은색Black 네 가지 색상을 기본으로 한다.
HSI
RGB 색상 모델은 인간이 느끼는 색상과는 다르게 하드웨어로 구성하기에 적합한 모델이다.
이와 달리 HSI(Hue, Saturation, Intensity(value)) 색상, 채도, 명도는
인간의 색감과 유사하게 표현할 수 있는 장점이 있다.
색상은 빛의 파장에 의해서 나타내는 물체의 고유한 색을,
채도는 색상의 강도 또는 농도를,
명도는 색상의 상대적인 밝기를 나타낸다.
해당 게시글은
OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문을 주 교재로 삼고,
부 교재로는
Game Programming in c++과
PHYSICALLY BASED RENDERING Third Edition 서적 등을 기반으로 하며,
https://docs.unity3d.com/kr/2021.3/Manual/GraphicsAPIs.html
https://docs.unrealengine.com/5.1/ko/graphics-programming-overview-for-unreal-engine/
https://www.kais99.org/jkais/journal/v10n8/09/42pt/42pt.pdf
및 각종 사이트 및 논문을 참고하여 작성되었습니다.
'그래픽스 > OpenGL' 카테고리의 다른 글
인공지능 - 길찾기 BFS (1) | 2024.10.30 |
---|---|
인공지능 - 상태 기계 설계 해시맵 이용하기 (2) | 2024.10.27 |
2D 운석 피하기 게임 속 수학 (2) | 2024.10.20 |
게임 객체와 컴포넌트의 관계 (0) | 2024.03.26 |
선형보간 및 폴리곤 메시 (0) | 2023.11.01 |