11월, 2020의 게시물 표시

게임 엔진 - FBX 렌더링

이미지
 Step1 스킨드 메시 관련 클래스 정의 MeshMaterial클래스    MeshPart는 MeshMaterial하나와 대응된다. Step2 FBX 모델 파싱 전체적인 모델 파싱 소스 ProcessBoneHierarchy : 본의 전체적인 구조 읽음 ProcessAnimations : 전체 애니메이션 데이터 읽음 ProcessGeometry : 전체 기하 구조 데이터 읽음 O모양은 Root이고 밑에 Child들이 있다. 애니메이션 계산시 정점들은 모델링 공간에 정의되어있다. 따라서 정점들을 global matrix의 역행렬을 곱한후 계산해야한다.

게임 엔진 - Axis Gizmo

이미지
Step1 Axis 화살표 마다 Collider를 씌운다. Step2 현재 마우스가 가리키는 축을 받는다. ex) x축을 가리키면 mActivateAxis = Physics::ColliderAxis_x가 된다. Step3 카메라 거리에 따른 비율로 Transform 연산을 수행한다.   마우스 방향에 따라 움직여야 하므로 두 벡터를 내적한다. 카메라 거리(facotr)에 따른 계산을한다. Step4 Collider 그리기는 벡터 덧셈 뺄셈을 이용해 8개 점을구해 그린다. 3D 공간은 Z축을 추가하여 계산하면 된다. Collider 8개점 위치 계산 코드

게임 엔진 - FBX 관련 클래스

이미지
1. 구조도  2. 애니메이션 프레임 3. 하나의 애니메이션 - 전체 키 프레임을 담음 4. 하나의 본 - 전체 애니메이션을 담음 5. 최종적인 FBX 모델 클래스 

그래픽스 - 렌더링 파이프라인

이미지
  렌더링 파이프라인 개요 렌더링 파이프라인은 현재 가상 카메라에 비친 3차원 장면의 모습에 근거해서 2차원 이미지를 생성하는데 필요한 단계들 전체를 뜻한다. 입력 조립기 단계 메모리에서 기하 자료(정점과 인덱스)를 읽어서 기하학적 기본도형(삼각형, 직선 등)을 조립한다. 정점(Vertex)은 두 변이 만나는 점이다. 그러나 Direct3D에서 정점은 이보다 훨씬 일반적이다. 점의 공간 위치 뿐만 아니라 노말 벡터, 텍스쳐 좌표, 법선 벡터 등의 정보를 담을 수 있다. 정점을 나타내는 구조체 정점 정점들은 정점 버퍼라고 하는 특별한 Direct3D 자료구조안에 담겨서 렌더링 파이프라인에 묶인다. 이 정점들은 3개씩 묶여 삼각형이 될 수 있고, 2개씩 묶여 선분이 될 수 있다. 이런 기본도형을 형성하는 방식을 기본도형 위상구조(primitive topology)이다.  그림1 그림2 그림 3 그림2에서 CreateInputLayout함수를 호출하여 버텍스 레이아웃 생성 그림3에서 IASetPrimitiveTopology함수를 호출하여 삼각형 구조를 적용  색인 하나의 3차원 물체를 형성하는 삼각형들은 다수의 정점을 공유한다. 왼쪽 그림에서 V0와 V2가 공유된다. 정점이 중복되면 메모리 요구량과 그래픽 연산이 증가 되게 될 것이다. 따라서 색인(index)를 사용하는 것이다. 정점 목록을 만들어 두고, 정점들을 어떤 순서로 사용해서 삼각형을 형성하는지를 색인들로 나열함으로써 지정하면된다. 정육면체 색인 예시 정점 셰이더 입력 조립기 단계에서 기본도형들을 조립한 후에는 정점들이 정점 셰이더 단계로 입력된다. 정점 셰이더는, 정점 하나당 한번 호출되는 함수로 보면된다. 정점셰이더의 함수는 각 정점에 대해 GPU에서 실행되기 때문에 아주 빠르다. 모델 공간과 월드 공간 3D 물체를 만들 때 기하구조를 월드 공간 좌표계를 기준으로 구축하는 것이 아니라 물체 자신의 모델 공간 기준으로 구축한다. 전자를 world space, 후자를 local s...

Opencv - 이산 푸리에 변환

이미지
 목표 1. 푸리에 변환 무엇이며 왜 사용하는가 2. Opencv에서 푸리에 변환 사용법 3. copyMakeBorder(), merge(), dft(), getOptimalDFTSize(), log(), normalize() 함수의 사용법 푸리에 변환 푸리에 변환은 이미지를 sin, cos 구성요소로 분해한다. 즉, 이미지를 공간 영역에서 주파수 영역으로 변환한다. 아이디어는 모든 함수가 sin, cos의 합으로 근사 될 수 있다는 것이다. 푸리에 변환 공식

Opencv - 감마 보정을 이용한 이미지의 대비 및 밝기 변경

이미지
  목표 1. 픽셀 값에 접근 방법 2. saturate_cast 기능과 사용 이유 3. 이미지를 개선하는 실제 예 이미지 처리 1. 일반적인 이미지 처리 연산은 하나 이상의 입력 이미지를 가져와 하나의 이미지를 출력하는 기능이다. 2. 이미지 변환은 포인트 연산과, 이웃 연산(지역 기반)이 있다. 포인트 연산 처리 alpha와 beta는 이미지 밝기와 대비를 조절한다. 소스 코드 이미지 픽셀 값에 접근 하기 image.at<Vec3b>(y, x)[c] y는 행, x는 열, c는 RGB이다. saturate_cast<uchar>(input) input의 값을 0에서 255의 값으로 Clamp 시켜준다 실행 모습, 왼쪽 : 원래 이미지, 오른쪽 : 대비 0.5, 밝기 100 이미지  감마를 이용한 이미지의 밝기와 대비 조정 히스토그램은 각 색상 레벨에 대해 픽셀 수를 나타낸다. 어두운 이미지는 낮은 색상 값을  가진 픽셀이 많고, 일정한 바이어스를 더하면 히스토그램이 오른쪽으로 이동하여 이미지 톤이 밝아진다 alpha 매개 변수는 수준이 퍼지는 레벨을 수정한다. 1보다 작으면 전체적인 색상이 압축되고 대비가 적은 이미지가 된다. 밝기가 향상되었지만 채도로 인해 구름이 클리핑되었다. 선형 변환을 하면 클리핑 연산에 의해 색상이 버려질 수 있다. 감마 보정을 이용해 입력 값과 맵핑된 출력 값 사이에 비선형 변환을 사용하여 이미지의 밝기를 보정한다. 감마 보정 공식 감마 값에 따른 그래프 감마 보정 소스 코드 감마 보정된 이미지 - 선형변환시 사라진 구름이 많이 개선되었다

Opencv - 이미지 블렌딩

이미지
목표 1. 2개의 이미지를 가중치를 이용해 합성(블렌딩)하는 방법 공식 소스 코드 블렌딩 전 이미지 블렌딩 후 이미지 직접 짠 소스 코드