순수가상함수

  • 함수의 몸체가 정의되지 않은 함수

가상소멸자

  • virtual로 선언된 소멸자

가상함수의 동작원리와 가상함수 테이블

  • 가상함수를 포함하는 클래스는 컴파일러가 '가상함수 테이블' 을 만든다.
  • 실제 호출되어야 할 함수의 위치정보를 담고 있는 테이블
  • 오버라이딩 된 가상함수의 주소정보는 유도클래스의 가상함수테이블에 포함 안됨
  • 따라서 오버라이딩 된 가상함수를 호출하면, 무조건 가장 마지막에 오버라이딩을 한 유도클래스의 멤버함수가 호출된다

'프로그래밍 > C++' 카테고리의 다른 글

페이지 폴트 + 가상메모리 시스템  (0) 2019.05.01
CAST 종류 + RTTI  (0) 2019.04.30
람다식  (0) 2019.04.29
함수 객체  (0) 2019.04.29
이동 시멘틱  (0) 2019.04.29

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 )                 =   불투명을 먼저 그리고 , 반투명을 나중에 그리는 기법

15. 출력

hash_map 특징

  • 트리를 통해 원소들을 정렬하지 않는다
  • hash라는 자료구조를 통해 map,set 보다 빠른 검색속도를 가진다.

헤시함수

  • 해시함수(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인 요소 삭제, 지정한 키와 같은 요소 삭제

hash_map 검색

  • 검색은 key을 사용하여 같은 key을 가지고 있는 요소를 찾는다.
  • key와 같은 요소를 찾으면, 그 요소의 반복자를 리턴한다.
  • 못 찾은 경우 end()을 가리키는 반복자를 리턴한다.

'프로그래밍 > STL' 카테고리의 다른 글

Map / MuitlMap  (0) 2019.04.30
Set / MutilSet  (0) 2019.04.30
LIST  (0) 2019.04.30
DEQUE  (0) 2019.04.30
VECTOR  (0) 2019.04.30

MAP : 연관 컨테이너, 노드 컨테이너

  • Set에 key와 더불러 value의 쌍으로 저장한다. (key,value)
  • 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객체가 아닌, 저장된 위치만을 가리키는 반복자를 반환한다.
  • [] 연산자를 제공하지 않는다.

순회 샘플

    std::multimap<int, int> mm;
    std::multimap<int, int>::iterator mmitor;
    mm.insert(std::pair<int, int>(60, 6));
    mm.insert(std::pair<int, int>(30, 3));
    mm.insert(std::pair<int, int>(70, 7));
    mm.insert(std::pair<int, int>(90, 9));
    mm.insert(std::pair<int, int>(40, 4));
    mm.insert(std::pair<int, int>(20, 2));
    mm.insert(std::pair<int, int>(50, 5));
    mm.insert(std::pair<int, int>(80, 8));

    for (mmitor = mm.begin(); mmitor != mm.end(); mmitor++)
    {
        cout << mmitor->first <<", " << mmitor->second << endl; //키  20부터 ~80 , 값 2~8
    }

lower_bound(), upper_bound(), equal_range()

  • 중복 키를 검색 할수 있는 함수
  • 연관컨테이너는 모두 사용 가능
  • equal_range() 앞 lower_bound(), 뒤는 upper_bound()

샘플

    std::multimap<int, int> mm;
    std::multimap<int, int>::iterator mmitor;

    mm.insert(std::pair<int, int>(60, 6));
    mm.insert(std::pair<int, int>(30, 3));
    mm.insert(std::pair<int, int>(70, 7));
    mm.insert(std::pair<int, int>(90, 9));
    mm.insert(std::pair<int, int>(40, 4));
    mm.insert(std::pair<int, int>(30, 2));
    mm.insert(std::pair<int, int>(50, 5));
    mm.insert(std::pair<int, int>(80, 8));

  auto itorequal = mm.equal_range(30);                                        //30,3  40,4 로 들어감
  auto  low =mm.lower_bound(30);  // low bound는 30,3
    auto  upp =mm.upper_bound(30); // upper_bound 는 40,4

    for (mmitor = itorequal.first; mmitor != itorequal.second; mmitor++)  //위 범위를 순위해서 출력하는 것
    {
        cout << mmitor->first << ", " << mmitor->second << endl;          // (30,3) , (30,2) 출력
    }

'프로그래밍 > STL' 카테고리의 다른 글

HashMap  (0) 2019.04.30
Set / MutilSet  (0) 2019.04.30
LIST  (0) 2019.04.30
DEQUE  (0) 2019.04.30
VECTOR  (0) 2019.04.30

SET : 연관 컨테이너, 노드 컨테이너

  • 균형이진트리로 구현되고, 균형이진 트리의 모든 특징을 가진다
  • 양방향접근자 제공
  • 키를 저장하는 유일한 함수 insert 제공
  • 중복된 값(key)는 삽입되지 않는다
  • 삽입되면 기본적으로 오름차순 정렬이 된다.
  • 연관컨테이너 핵심은 빠른 원소 찾기이다

insert() 반환값 샘플
set에서 반환값은 1. 저장위치와 2.삽입 성공여부 2개가 리턴 된다.

  std::set<int> myHouse;
    std::pair<std::set<int>::iterator, bool> pairList;

    pairList = myHouse.insert(3);   //TRUE
    pairList = myHouse.insert(2);   //TRUE
    pairList = myHouse.insert(1);   //TRUE
    pairList = myHouse.insert(3);   //FALSE 이미 있는 값으로 안들어간다.

find()

  • 연관컨테이너 에서 찾기 관련 멤버 함수는 key룰 찾을 때 == 를 사용하지 않음
  • 컨테이너의 정렬 기준 조건자를 이용해 찾기 연산을 수행한다.

MutilSET : 연관 컨테이너, 노드 컨테이너

  • Set과 달리 중복된 값(key)이 삽입된다
  • 중복 저장될 수 있기 떄문에, set같이 bool값을 반환하는 pair객체가 아닌, 저장된 위치만을 가리키는 반복자를 반환한다.

insert() 반환

set과는 달리 저장위치만 반환 받는다.(itor)

'프로그래밍 > STL' 카테고리의 다른 글

HashMap  (0) 2019.04.30
Map / MuitlMap  (0) 2019.04.30
LIST  (0) 2019.04.30
DEQUE  (0) 2019.04.30
VECTOR  (0) 2019.04.30

+ Recent posts