글 작성자가 공부하고 배운것을 간략하게 정리하는 페이지 입니다.
필요한 정보가 있으시면 확인하시고 만약 잘못된 내용이 있거나 이런 내용이 추가됬으면 좋겠다라면 댓글 부탁드립니다.
감사합니다.
좌표계
x,y,z 축이 있는 좌표계를 사용,
왼손좌표계 :
-D3D(DirectX3D)에서 사용되는 좌표계
-MS사에서 제작한 API, 윈도우 최적화
-윈도우 개발환경(빌드) 인경우 개발시에 많이 사용됨
오른손 좌표계:
-OpenGL(Open Graphics Library)에서 사용되는 좌표계
-멀티 OS 환경에서 사용(멀티플랫폼) -> 범용성은 좋으나, 최적화는 떨어짐
Z축의 방향이 중요한 이유 : 어떤 방향으로 그릴지의 기준이 되기 떄문!!
Vertex(정점)
말그대로 꼭지점, 물체의 기본을 이루는 원소와 유사함
Polygon(폴리곤)을 이루는 삼각형의 꼭지점
Vertex는 다양한 정보를 가지게 할 수있으며 , 그 정보를 토대로 그래픽스 작업을 한다.
ex) Vertex에 담겨있는 데이터들
-좌표계의 좌표 -> x,y,z,w
w=1 이동변환의 영향O
w=0 이동변환의 영향 X, 노멀값(노멀벡터)과 같은 방향 벡터일 경우
(w는 위치좌표 -> 3차원은 4x4 행렬을 취함)
-회전 각도 -> x,y,z,r (축을 중심으로 회전,각도 )
-UV좌표계 -> u,v ( 범위가 0,0 ~ 1,1인 좌표계, u = x , v= y)
-색깔(color) -> r,g,b,a(RGB값 알파블렌드(투명도))
... API에서 제공하는 Vertex가 있을수도 있고 개발자가 만들어 원하는 값으로 쓸 수도 있다.
Polygon(폴리곤)
3D 컴퓨터 그래픽에서 면의 조합으로 물체를 표현할 때의 각 요소
각 요소는 삼각형을 취하고 있음, 원자(Vertex)들이 모여져 만든 분자와 유사함
즉, 삼각형 하나가 폴리곤이라고 생각하면 편하다.
p.s 왜 Polygon의 각 요소는 삼각형을 취하고 있는가??
▶삼각형은 곡면(구체)를 만들기에 최적화가 되어있기 떄문이다.
Mesh(메시)
다면체의 형태를 구성하는 폴리곤의 집합 (실제로 사용자들이 눈으로 보는 물체)
Modeling(모델링)
컴퓨터가 이해할 수 있는 형태로 Mesh등의 정보를 저장한 데이터
프로그래머들이 사용하는 요소, 아트 계열 프로그래머들을 모델러 라고 부르는 이유이다.
Vertex를 이용하여 삼각형을 그릴때 필요한 개념
Vertex의 인자값(좌표값)을 입력순서에 따라 폴리곤 그리는 방향이 정해진다
왼손 좌표계(D3D) : 시계방향, 시계방향으로 그려진 면이 앞면
오른손 좌표계(OpenGL) : 시계반대 방향, 시계반대 방향이 앞면
이 방향으로 인하여 왼손 좌표계 <> 오른손 좌표계 전환에 활용 할 수 있다.
즉,D3D에서 빌드하던것을 가져와서 설정값(vertex순서 및 좌표 등등)을 변경 후 OpenGL환경에서 사용할 수 있는것이다.
Polygon의 앞면,뒷면 선정이 중요한 이유
유저들이 보는 면은 앞면일 확률이 높다. 그러므로 앞면에 이미지를 그리는것이 일반적이다.
그럼 뒷면에도 그림을 그려야 하는가? 아니다.
개발시에 그림을 그리는 작업의 처리비용이 매우 높기 때문이다.
그런 이유로 앞면을 정해서 앞면만 그리고 뒷면은 그리지않아 처리비용을 줄이려고 하는것이다.
(일반적으로 그런거지, 뒷면도 그리게 할수 있음)
일반적으로 게임에서 벽 텍스처를 뚫고 지나가면 뒷면에 아무것도 없는 경험이 보통 이런경우이다.
Rendering(렌더링)
월드 상에 모델링을 이용하여 만들어진 장면(Scene)을 컴퓨터가 조명의 배체와 면의 특성, 기타 다른 설정들을 바탕으로 계산하여 그림을 생성
렌더러는 2D의 이미지를 1장의 사진(그림)을 찍는는 개념이다.
이 이미지들을 이제 연속으로 찍어 보여주는것이 애니메이션이다.
레이아웃 : 물체(Object)를 작업 공간에 배치
애니메이션 : 배치된 물체의 움직임을 설정
Texture(텍스처)
3차원 물체의 표면에 2차원 이미지를 입혀서 적은 폴리곤으로도 높은 디테일을 표현 할 수 있게 해주는 렌더링 관련 요소, 텍스처의 좌표축은 UV좌표계를 사용한다.
UV좌표계 : 0,0 ~ 1,1의 크기를 가지고있는 좌표계,
이유 : 텍스처 이미지를 로드할때 비율,사이즈 등 각각 다르기때문에 UV 좌표계 기준으로 변환한것이다.
Suface(서피스)
이미지 데이터를 저장하는데 사용되는 버퍼, 화면에 출력되는 면
즉 2D이미지 버퍼 ( 텍스처파일은 원래 2D이고 3차원 물체이 입히는 형식)
서피스는 WINAIP의 backDC와 유사하다
(backDC 개념은 더블버퍼링에서 나온 것, 더블버퍼링도 화면에 출력 할 이미지를 저장 후 사용하는 용도이다.)서피스는 보통 폴리곤의 앞면,뒷면의 서피스를 각각 갖고있다.
2023.06.05
수정: 컴퓨터 그래픽스에서 말하는 Surface는 버퍼이다.
(버퍼 : 메모리(data)를 저정하는 공간)
취소선의 내용은 내가 똑같은 Surface라고 정리를 했는데,
폴리곤의 surface는 그대로 '표면'이란 뜻으로 사용된거다.
폴리곤 앞면(front surface),뒷면(back surface)
즉, 여기서 설명한건 버퍼의 역할이기 때문에 잘못 설명한것이 된다.
Culing(컬링)
렌더링 작업 중 렌더링 할 필요가 없는 요소들을 선별하여 제외하는 기법
가시성 선별(Visibility Culing)기법이라고도 불린다.
cut에서 가져온 단어 -> 이미지의 필요없는 부분을 자른다는 뜻
ex) surface는 앞면,뒷면을 다 가지고 있지만 뒷면은 그릴 필요가 없기에 제외할때 사용됨
Anti-Aliasing(안티 앨리어싱)
이미지의 픽셀이 계단처럼 출력되는것을 앨리어싱이라 하며, 이 계단현상을 없애기 위해 생겨난 기법
기법으로는 슈퍼샘플링,멀티샘플링 등이 있다.(여러 종류가 있음)
슈퍼 샘플링 : 처리비용이 높음, 효율이 좋음
멀티 샘플링 : 처리비용이 낮, 효율이 낮음
Projection(투영)
간략히 말하면 n차원을 n-1차원으로 바꾸는 것,
투영 개념은 투영행렬 및 선형대수가 필요한 개념이기에 따로 정리가 필요하다.
Frustum(절두체)를 설명하려면 필요한 개념이기에 간략히 적어놓았음
Frustum(절두체)
투영행렬(Projection Matrix)을 계산할 때 범위의 모양이 사각뿔의 머리를 잘라 둔 것처럼 생겨서 절두체라고 한다.
카메라의 크기와 범위 모양
절두체 = 카메라 영역 = 렌더링 영역
: 카메라 앵글(유저의 시점)밖에 있는건 찍지 않고 카메라에 담긴 영역(렌더링하는 영역)을 그려야되기 떄문에 영역(절두체)를 알아야 한다.
그래픽스파이프라인의 Projectino Transforn(투영변환)을 공부할때 더욱 자세하 알수 있을것이다.
Z-buffer(깊이 버퍼), Stencil Buffer(스텐실 버퍼)
Z-buufer : 화면에 그려진 각 픽셀의 Z(깊이) 값을 저장,
절두체에서 픽셀의 깊이 값을 기록하는데 사용(원근감)
각각 다른 Z값(깊이)를 가지고 있는 물체들이 존재 할때 카메라시점으로 보면 A,B의 겹치는 영역이 존재한다.
Frusturn(절두체)에서 기록한 Z값을 이용하여 A,B의 겹치는 영역중 가까운 영역부터 그려서 원근감을 부여한다.
Stencil Buffer : 특정 영역이 렌더링 되는것을 막기위해 사용되는 버퍼
위에 사진처럼 렌더링 하기전 Stencil buffer의 데이터를 이용하여 렌더링에서 제외하는것이다.
예시로는 저격총의 에임, 거울에 비춘 물체 시점(거울 안에서만 비춰야되고 거울 밖은 비추면 안되는상황)
스파이/잡임 게임에서 플레이어의 시점으로만 조명이 비추고 나머지는 어둡게하는 상황을 표현할때도 사용됨
이 두 버퍼는 렌더링 되기전에 사용되는 버퍼이며 이 두 버퍼는 개발시에 보통 한번에 만들어서 한번에 작업처리를 한다.
Shader(셰이더)
3D컴퓨터 그래픽에서 최종적으로 화면에 출력하는 픽셀의 색을 정해주는 함수
색의 농담,색조,명암 효과를 주는 주체
그래픽스파이프라인에서 VertexShader,PixerShader에 대해 배울때 자세히 알수있기때문에 간략히 적어놓았다.
회전(rotation)
▶Euler Angle(오일러 각)
3차원 공간의 절대적 좌표를 기준으로 물체의 회전을 측정하는 방법
X,Y,Z 축을 기준으로 회전하기 때문에 직관적이고 조작이 용이하다.
180도가 넘는 회전의 표현이 가능하다.
3번에 나누어 계산하기 때문에 비용이 크며 Gimbal Lock(짐벌 락)이 발생할 수 있다.
간단히 말하면 X축 회전 계산, Y축을 회전, 계산 Z축을 회전 계산 계산이 많이 들수 밖에 없다.
▶Quaternion(쿼터니언)
방향과 회전을 표현한다.
4개의 성분(x,y,z,w)로 이루어져 있으며 각 성분은 축이나 각도가 아니다.
벡터(x,y,z : 방향)와 스칼라(w:roll,회전)를 의미한다.
180도가 넘는 회전을 표현하지 못한다. (대처가능 : 210도 회전 = 179도 회전 + 31도 추가회전)
각 축을 한번에 계산하여 비용이 적고 Gimbal Lock(짐벌 락)이 발생하지 않는다.
Gimbal Lock(짐벌 락): 두개의 회전 축이 서로 겹쳐지는 현상, 축이 3개가 되고 나서 발생한 문제
축이 겹쳐지면서 하나의 축이 제 역할을 못하게 되는 현상
Euler (gimbal lock) Explained 이 영상 한번 보면 이해가 쉽게 됩니다.
회전은 자세히 들어가면 사원수라는 수학 개념이 들어가기 때문에
나중에 수학을 다뤄볼때 자세하 적어보겠다.
D3D에서는 축 회전을 표현하는 용어가 따로 있다.
X축 : pich(피치)
Y축 : yaw(요)
Z축 : roll(롤)
D3D에서 D3DQuaternionRotaionYawPitchRoll()를 이용하여 쿼터니언 회전이 가능
Material(재질)
조명을 비추어서 빛이 물체에 닿았을 때 물체의 표면으로부터 반사되는 색상
빛이 월드 공간에 적용 됐을 때 물체가 반사하려는 색상을 결정
빛(조명)이 적용될때 반드시 Material(재질)이 필요하다.(중요)
위 이미지에서 나온내용은 빛(조명)에 관련된 내용이기 때문에 설명을 따로 하지 않겠다.
OverDraw(오버드로우)
렌더링의 단일 프레임에서 시스템이 화면에 한 픽셀을 여러 번 그리는 것 즉, 겹쳐서 그려진다는 뜻
처리비용이 높아지는 이유 중 하나 (문제점)
이미지는 Z-Buffer를 설명하는 이미지이긴 하지만, 오버드로우를 표현하기에는 적절한 이미지여서 포함했다.
현재 이미지를 보면 한 픽셀에 S2 -> S1->S3 순서로 전부 한번씩 그려진후에 최종적으로 S3가 그려진다.
이 부분들은 S3만 그리게 되면 한번만 그리면 되는데 이런식으로 그리게 되면 총 3번의 작업이 되며 처리비용이 높아진다.
*오버드로우를 대처 및 수정하는 방법
1.레이아웃에서 불필요한 배경삭제
의미없는 배경들을 최대한 삭제로 오버드로우를 줄일수 있다.
2.뷰 계층 구조의 평면화
레이아웃들이 겹치면 안보이는데 그려야되는 경우가 생길수 있다.
그럼으로 이런 점을 고려하여 그리면 줄일 수 있다.
3.투명도 감소
화면에 투명 픽셀을 렌더링하는 것(알파렌더링)오버드로우의 주요 원인,
기존 픽셀에 먼저 그리고 투명 픽셀을 혼합하여 원하는 시각효과를 뽑아냄으로 오버드로우가 발생한다.
즉, 투명객체의 수를 줄이면 오버드로우를 어느정도 대처 할 수 있다.
ex)회색 텍스트를 출력하려 할때 , 검정색 텍스트 + 투명 픽셀(투명도 조절) 이게 아닌 회색으로 텍스트를 출력하면 더욱 성능개선이 된다는 뜻
Quad OverDraw(쿼드 오버드로우) [위에서 설명한 오버드로우랑은 다른 개념]
폴리곤을 그릴때 4개의 픽셀을 하나의 단위로 그
리는데, 이때 낭비되는 영역이 쿼드 오버드로우다.
4개의 픽셀을 기준으로 그리는 이유는 텍스쳐 샘플링 떄문이다.
이 텍스처 샘플링이 부하가 큰 작업이다. 그래서 픽셀 수에 딱 맞는 해상도의 텍스처를 미리 여러개 준비해놓고 픽셀 수에 맞는 준비된 레벨의 텍스쳐만을 사용해서 렌더링을 하게된다.
이 작업을 텍스쳐의 mip level(밉 레벨) 이라고 한다.
즉, mip level은 동일한 그림을 다양한 해상도의 사이즈로 텍스쳐를 준비하는 작업이다.
밉 레벨 계산은 4픽셀 씩 그리면서 ddx,ddy 미분을 해서 정확한 텍스쳐의 밉레벨 계산을 한다.
폴리곤의 크기(화면상의 크기)가 작을수록 쿼드 오버드로우가 심하게 발생된다.
이미지의 빨간색이 쿼드오버드로우가 발생하고 있다는 뜻이며
점점 멀어지게 되면 폴리곤은 한픽셀보다도 작아질수 있다.
픽셀보다 작은데 그 하나의 폴리곤을 나타내기 위해 4개의 픽셀을 사용하는것이다.
쿼드오버드로우를 줄이기 위하여 삼각형의 크기를 한 픽셀보다 더 작아지지 않게 하기 위한 기능이 바로 LOD 기법이다. (오버드로우 때문이 아님)
쿼드오버드로우는 https://bbs.ruliweb.com/hobby/board/600001/read/1678 이 게시글을 참고하여 작성하였습니다.
'컴퓨터 그래픽스' 카테고리의 다른 글
[DirectX11] 절두체 컬링(Frustum Culing) (0) | 2023.06.21 |
---|---|
[DirectX11] D3D - Sprite2D ( 투영(Projection) 간단한 내용) (0) | 2023.06.17 |
[DirectX11] 계층구조(Hierarchy) - D3D 태양계 만들기 (0) | 2023.06.13 |
그래픽스 파이프라인 간단 내용 정리 (0) | 2023.06.08 |