3D 모델 구축(로컬) -> 가상공간 배치(월드) -> 정점단위 음영계산 -> 정점증감(프리미티브) ->카메라공간으로 전개(뷰좌표)->컬링->조명->클리핑->투영->뷰포트전개-> 폴리곤 셋업과 레스터라이즈->픽셀쉐이더->텍스처 적용->랜더백엔드->출력
[고정 기능 파이프 라인( Fixed Pipeline )] - D3D에 미리 정해진 연산을 수행할 수 있도록 제공되는 기능이 고정기능 파이프라인이다. - 정해진 연산만 수행하므로 프로그래머가 GPU 연산에 관여할 수 없다.
[프로그래머블 파이프라인 ( Programmable Pipeline )] - 고정 기능 파이프 라인에서 제공하는 것 이외의 효과를 내기 위해서 생겨난 프로그래머블 파이프 라인이다. - 프로그래머가 GPU의 연산에 직접 관여할 수 있다. - 고정적으로 제공하던 셰이더( Shader )를 프로그래머가 다양한 효과를 낼 수 있게끔 제공하게 되었다.
[그래픽스 파이프라인 과정]
[랜더링 파이프라인 과정]
[고정 기능 파이프라인과 프로그래머블 파이프라인의 차이점]
- 프로그래머가 GPU 연산에 관여할 수 있냐? 없냐? 차이
< 정확하게 말하면, Fixed -> Programmable로 대체된 것이다. >
-> 프로그래머블 파이프라인의 버텍스 쉐이더가 고정기능 파이프라인 과정 중 모델과 뷰스페이스 변환, 조명, 투영변환의 역할을 수행한다.
[ 그래픽스 파이프라인 과정 설명 ]
1. 3D 모델 구축
- 3D 모델을 만들어서 '로컬 좌표계'에 띄우는 단계를 말한다. ( CPU 담당 ) - 랜더링 파이프라인 과정 중 '로컬 스페이스' 과정이다.
2. 가상 공간의 배치
- 구축한 3D 오브젝트( 모델 )을/를 ‘ 월드 좌표계’로 옮겨 하나의 장면을 구성하는 단계 ( CPU 담당한다. )
- 랜더링 파이프라인 과정 중 '월드 스페이스' 과정이다.
3. 정점 단위 음영 계산
- 정점의 정보값( 좌표, 색상, 텍스처의 좌표., 조명 정보 ) 등을 변화시켜서
물체를 특별한 위치로 옮기거나 텍스처의 좌표를 바꾸거나, 색상을 바꾸는 일등 한다. ( GPU 담당 )
4. 정점의 증감
- 버텍스 쉐이더에서 정점, 도형의 정보( primitive )를 받아서 그 정보를 가지고 버텍스를 증감시켜 새로운 도형정보를 만드는 것을 말한다.
※프리미티브 ( Primitive )
- 그래픽스 프로그램에 의해 개별적인 실체로 그려지고 저장, 조작될 수 있는 선·원 ·곡선 ·다각형과 같은 그래픽 디자인을 창작하는 데필요한 요소. 기하학적 프리미티브라고도 한다. - 예로들어털, 그림자, 파티클, 모션블러, 테셀레이션, 물등 효과에 사용
5. 카메라 공간으로의 전개
- 월드 좌표계로 변환된 좌표계를 카메라 기준으로 한 카메라 좌표계로 변환한다. - 랜더링 파이프라인 과정 중 '뷰스페이스' 과정이다.
6. 컬링( Culling ) - 최종 씬에 보이지 않는 불필요한 폴리곤을 잘라내어 렌더링 및 연산에서 제외하는 기법이다. - 렌더링 파이프라인 과정 중 후면추려내기 과정이다.
7. 조명 ( Lighting ) - 광선으로 밝게 비춤 또는 그 광선을 나타낸다. - 3D 공간에는 빛이 없지만 현실 세계의 빛을 3요소로 만들어 흉내냄 - 조명의 요소에는 정반사광( Specular ), 난반사광( Diffuse ), 환경광( Ambient ) 등이 있다. - 랜더링 파이프라인에 '조명' 과정에 해당한다.
8. 클리핑( Clipping ) - 화면에서 보이지 않는 부분은 그리지 않겠다는 의미 - 랜더링 파이프라인 과정 중 '클리핑' 과정에 해당한다.
9. 투영( Projection ) - 3D 물체를 2D 평면에 표현하기 위하여 3D 모델 좌표를 2D 평면좌표로 변환하는 것을 의미한다. - 렌더링 파이프라인 과정 중 '투영' 과정에 해당한다.
10. 뷰포트 전개 - 프로젝트 윈도우의 뷰포트라 불리는 화면의 직사각형으로 변환하는 과정을 말한다. - 윈도우와 상대적이며, 윈도우 좌표를 이용한다. - 랜더링 파이프라인 과정 중 '뷰포트' 과정에 해당한다.
11. 폴리곤 셋업과 레스터 라이즈
> 폴리곤 셋업( Polygon Set up )
- 정점 파이프라인에서 정점 단위로 출력된 결과를 픽셀단위로 분해하여 픽셀 파이프라인으로 보내주는 작업이다. - 랜더링 파이프라인의 레스터라이즈에 해당한다.
> 레스터 라이즈( Rasterize ) - 스크린 좌표로 버텍스들을 변환하면 폴리곤 정보를 가지게 되는데 레스터라이즈는 각각의 폴리곤을 출력하는데 필요한픽셀컬러를 계산하는 과정이다. 단순하게 얘기하면 폴리곤을 픽셀로서 변경하는 과정이다. ( 그래픽 하드웨어 담당 )
12. 픽셀 파이프라인 - 정점 연산을 거쳐서 생성된 폴리곤의 픽셀들에 대해서만 연산을 한다.
13. 텍스처 적용 - 폴리곤과 광원,조명의 조합만으로는 실감나는 3D오브젝트를 표현하는데 한계가 있고, 광원, 조명효과는 많은 계산량을필요로 하기 때문에 부하가 높아지는 문제가 생긴다. 이러한 문제점을 해결하기 위한 대안으로 나온 기술이다.
14. 랜더백엔드 - 픽셀셰이더 이후 넘어온 값을 써넣어도 좋을 것인가를 검증한 후 써넣을 방법을 정하는 것이다
> 써넣어도 좋은 것 인가의 검증 - 시저 테스트( Scissor Test ) = 사용자가 원하는 부분만 출력하는 방법 - 알파테스트( Alpha Test ) = α성분을 비교하여 그에 따른 출력을 결정 - 스텐실 테스트( Stencil Test ) = 사용자가 원하는 부분은 출력에서 제외 ( ex. 거울효과, 그림자 효과 에서 사용 ) - 깊이 테스트( Depth Test ) = 렌더링 순위가 정해져 있지 않을 때만 깊이 값으로 정렬, 후면 버퍼의 깊이 버퍼와 비교하는 테스트
> 어떻게 써넣을까 - 알파 블렌딩( Alpha Blending ) = 두 픽셀을 가중치에 따라 섞는 방법 - 안개( Fog ) - 안티앨리어싱( Anti Aliasing ) = 앨리어싱을 잡아줌 - 비등반 필터링( Anisotropic Filtering ) - 이중선형 필터링( Bilinear Filtering ) - 알파 소팅( Alpha Sorting ) = 불투명을 먼저 그리고 , 반투명을 나중에 그리는 기법
해시함수(hash function)란 데이터의 효율적 관리를 목적으로 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수입니다.
매핑 전 원래 데이터의 값을 키(key), 매핑 후 데이터의 값을 해시값(hash value), 매핑하는 과정 자체를 해싱(hashing)라고 합니다.
헤쉬테이블
해쉬테이블은 key값에 해쉬 함수를 적용시켜 얻은 값을 얻어, 해쉬 티이블에 분산하여 저장하는 자료 구조
저장 할때 key값을 해시 함수에 대입하여 버킷번호가 나오면 그 버킷의 빈슬롯에 자료를 저장한다.
헤시 테이블 장점
적은 리소스로 많은 데이터를 효율적으로 관리하기 위해서입니다.
해시함수로 무한에 가까운 데이터(키)들을 유한한 개수의 해시값으로 매핑함으로써 작은 크기의 캐쉬 메모리로도 프로세스를 관리할 수 있게 됩니다.
클러스터
일부 지역의 주소들을 집중적으로 반환 하는 결과로 데이터들이 한 곳에 모이는 문제
충돌
서로 다른 입력 값에 대해 동일한 해시값, 헤시 테이블 내에 동일한 주소를 반환하는 것
Chaining(체이닝)
충돌이 발생하면 각 데이터를 해당 주소에 있는 링크드 리스트에 삽입하여 문제를 해결하는 방법
개방해싱 알고리즘이다
Chaining(개방주소법)
충돌이 발생하면 해시 테이블 내의 새로운 주소를 탐사하여 충돌된 데이터를 입력하는 방식
Map,Set과의 차이점
Map,Set : 정렬된 상태로 자료를 저장하고, 싶을 때 (범위 검색에 유용)
hash_map, hash_set : 정렬이 필요 없고, 오직 빠른 검색을 원할 때 (단일 검색에 유용)
hash_map 사용시기
해시테이블은 많은 자료를 저장하고 있어도 검색이 빠르다.
그러나 저장한 자료가 적을 때는 메모리 낭비와 검색시 오버헤드가 생긴다.
컨테이너 추가나 삭제 하는 것은 list,vector,deque 보다 빠르다
수천의 자료를 저장하여 검색을 하는 경우 hash_map을 사용 하는 것이 좋다
hash_map 삽입 ( key타입, value 타입)
m_hashmap.inset(hash_map<int,float>::Value_type(10,45.6f)); //key 10, value 45.6f 추가
m_hashmap.inset(m_hashmap.begin() ,hash_map<int,float>::Value_type(10,45.6f)); //첫번쨰 위치에 추가
m_hashmap.inset(m_hashmap.1.begin(),hashmap2end()); //hashmap1의 모든 요소를 hashmap2에 추가
hash_map 삭제 (erase)
hashmap1.erase(hashmap1.begin()); // 첫번쨰 위치의 요소 삭제
hashmap1.erase(hashmap1.begin(),hashmap1.end()) //begin()부터 end()까지 요소 삭제
hashmap1.(11) // key가 11인 요소 삭제, 지정한 키와 같은 요소 삭제
Set처럼 중복된 key를 중복해서 저장 할수가 없다, 할라면 mutilMap를 사용해야 한다.
[]연산자를 통해서, 추가 또는 갱신이 가능하다
* map <키,값> m; 은 * m[키] = 값;
연관컨테이너 에서 찾기 관련 멤버 함수는 key룰 찾을 때 == 를 사용하지 않음
컨테이너의 정렬 기준 조건자를 이용해 찾기 연산을 수행한다.
insert()
set처럼 저장위치(iter)와 삽입성공여부(bool)을 반환한다.
std::map<int,float> myHouse;
auto result = myHouse.insert(std::make_pair(3,3.3f)); //TRUE
myitor = myHouse.insert(std::make_pair(2,2.2f)); //TRUE
result = myHouse.insert(std::make_pair(1,1.1f)); //TRUE
result = myHouse.insert(std::make_pair(3,5.5f)); //FALSE 이미 있는 값으로 안들어간다.
MutilSET : 연관 컨테이너, 노드 컨테이너
Map과 달리 중복된 값(key)이 삽입된다. 키는 상관 없음
중복 저장될 수 있기 떄문에, set같이 bool값을 반환하는 pair객체가 아닌, 저장된 위치만을 가리키는 반복자를 반환한다.