기초 수학
1. 사칙연산에서의 아이디어
단순 수치 증가/감소 혹은 배율, 가중치, 분배 등
- 응용 : 딜 메커니즘(((스텟+장비스텟) 배율 (1 - 방어율)) * (1 - 회피율)) 등등)
2. 평균과 백분율에서의 아이디어
1) 평균 : 평준화 ex) 몬스터레벨 평준화 - 레벨에 따라서 저렙은 어렵게, 고렙은 쉽게
2) 백분율 : 업적 달성도, 컨텐츠 진행도 등
3. 넓이, 부피 등
게임 오브젝트 충돌 구현
응용수학
1. 피타고라스 정리
거리 측정에 활용
- 아이디어 : 적이 특정 위치에 있을 때 내 공격이 닿을지 말지?
2. 삼각함수
각도의 표현을 구현 (단순 좌표 대신 각도 사용 -> 최적화)
x 좌표 : cos X / y 좌표 : sin X
- 아이디어 : 스킬을 어떤 방향으로 발사하는지 어떤 위치에 발동하는지 등을 구현
3. 백터
- 물체의 움직임, 힘을 주는 방식에 관한 아이디어
- 단위 벡터로 정규화 - 대각선 이동 시 비정상적인 속도 증가를 방지하는 아이디어
- 스칼라 : 벡터의 크기만을 가지는 개념 - 속도 조절 등의 아이디어
심화학습 - 내적과 외적
- 내적 : 벡터 A, 벡터 B 의 스칼라곱 - 값이 스칼라로 나옴 -> 응용 - 두 벡터의 사이각을 구하는데 사용
- 아이디어 : 적이 내가 보는 뱡향(벡터)보다 앞에 있는지, 뒤에 있는지 등을 계산?
- 유사도 : 두 데이터가 얼마나 비슷한지를 나타내는 척도, 두 데이터 사이의 거리(코사인값이 작을수록 가까움)
- 외적 : 벡터 A와 벡터 B 와 동시에 수직인 방향의 벡터(법선 벡터)
- 아이디어 : 컴퓨터 그래픽에서 조명 계산 및 그림자 처리에 활용
컴퓨터 그래픽
랜더링 파이프라인
요약하자면
1. CPU 요청 -> 3D입체를 삼각형 그물(폴리곤 메쉬)로 표현
2. 입체를 적절한 위치에 배치하고 2차원으로 변환
3. 기본 도형을 2D상의 픽셀로 변환, 보간
4. 투명도, 조명과 그림자, 텍스쳐 등 색상을 입힘
5. 알파값(투명도), 깊이값 반영하여 최종적으로 화면에 픽셀 출력
상세 버전
- 입력조립(Input Assembly)
- CPU 요청 -> 커맨드 큐 (드로우 콜 수행)
- 3D 오브젝트 정보 확인 후 정점 버퍼(Vertex Buffer) 형태로 GPU 전달, 삼각형 그물 모양으로 조립
- 정점셰이더(Vertex Shading)
- 변환 행렬 - Model, View, Projection (M, V, P)
1) Model Matrix (오브젝트 공간->월드 공간)
2) View Matrix (월드 공간->카메라 공간)
3) Projection Matrix (카메라 공간-> 클립공간)
* 클리핑(Clipping) : 절두체(카메라가 볼 수 있는 공간 부피) 밖의 도형을 제거
* 컬링(Culling) : 그릴 필요가 없는 영역(카메라가 볼 수 없는 면)을 제거
- 레스터라이저(Rasterization)
- 기본 도형을 2D 상의 픽셀로 변환, 보간이 진행됨
1) 뷰포트 변환 : 3차원 정점 정보 -> 2D 스크린 좌표로 변환
2) 스캔 변환 : 기본 도형(프리미티브)을 통해 프래그먼트(파편)를 생성, 프래그먼트를 채우는 각 픽셀마다 정점 데이터(위치, 색상, 노멀, UV)를 보간하여 할당
- 픽셀 셰이더(Pixel Shading)
- 픽셀에 투명도, 조명과 그림자, 텍스쳐에 색상을 입힘. 각 픽셀들의 색상과 깊이 값을 출력으로 전달
* 텍스쳐 - 질감 이미지, UV좌표
* 노말맵 - 표면의 법선 표현, 조명 및 그림자 표현
* 라이트 - 광원, 입사각 벡터 & 기본 도형 법선 벡터와 연산하여 반사각 벡터를 구하고, 반사각 벡터와 카메라 위치 벡터 사이의 내적을 통해 구함.
- 출력 병합(Output Merge)
- 알파 값(투명도)과 깊이 값 등 반영하여 최종적으로 화면에 그려질 픽셀을 출력
Q. 랜더링 파이프라인이란 무엇인가요?
A. 랜더링 파이프라인이란 3차원 상의 물체를 2차원의 컴퓨터 화면에 실제적으로 표현하기 위한 과정을 말합니다.
크게 Input Assembler -> Vertex Shader -> Rasterization -> Pixel Shader -> Output Merge의 과정을 거치게 됩니다.
Input Assembler 에서는 CPU가 물체의 정점 정보를 정점 버퍼로 변환하여 GPU로 넘겨줍니다. GPU는 받은 정점 버퍼를 정점 데이터로 조립하여, 삼각형과 같은 기본 도형으로 만들어 준 뒤 Vertext Shader로 넘겨주게 됩니다.
Vertex Shader에서는 정점 데이터를 토대로 공간 좌표계를 변환시키는데, Local Space에서 World Space, View Space, 최종적으로 투영 공간인 Clip Space로 변환시킨 정점 데이터를 출력하여 넘겨줍니다.
다음으로 Rasterization 단계에서는 3D상의 표현된 물체를 2D상의 좌표인 Screen Space로 변환하고, 물체를 픽셀로 분해해주는 과정입니다.
이후에 Pixel Shader에서는 랜더링 될 각각의 픽셀에 입힐 색상들을 계산하여 최종적으로 Output Merge 단계에서 화면에 그려질 픽셀을 정해 색상을 입혀 화면에 출력하게 됩니다.
참고 영상
https://www.youtube.com/watch?v=BMT0xCxP6w8
https://www.youtube.com/watch?v=ZdITviTD3VM
참고 글
https://steadycodist.tistory.com/entry/%EB%A9%B4%EC%A0%91-%EC%A4%80%EB%B9%84Graphics-%EB%A0%8C%EB%8D%94%EB%A7%81-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8Rendering-Pipeline