Graphics/DirectX 55

Direct 3D - 조명모델

조명모델 3D 그래픽의 표현 방법 중 가장 중요한 것이 조명 모델이다. 광원으로부터 점들의 조도를 계산하는 방법을 조명모델이라 한다. 이 방법에는 여러가지가 있는데, 경험모델과 물리모델로 나뉜다. 경험모델은 관찰된 현상을 근사값으로 표현하기위해 간단하게 수식화 한 것으로, 물리학적 근거가 없는 '해보니까 괜츈하네?'라는 식의 모델이다.... 물리모델은 빛과 물질간의 상호작용을 실제 물리적 성질에 기반하여 모델링한 것이다. 과학적 근거가 있는 모델. 한 점의 색은 여러개의 광원으로 부터 출발한 빛이 여러단계를 거쳐 표면에서 어떻게 반사될 것인지에 의해 결정된다. 이 광원에 대해서 알아보자. 주변광원(Ambient) 주변광원이란 동일한 밝기의 빛이 장면 안의 모든 표면에서 일정하게 반사되는것을 말한다. 실제..

Graphics/DirectX 2014.07.12

Direct 3D - 사원수 (Quaternion)

사원수(quaternion)를 그래픽에서 사용하게 된 이유는 행렬로 회전을 나타낼 때와 비교하여 아래와 같은 차이가 있기 때문이다 행렬 사원수 데이터량 float 16개 float 4개 연산속도 float 16 * float 16 float 4 * float 4 결과의 질 Gimbal Lock등 오류발생 최단호 보간 행렬에 비해 연산속도도 빠르고 메모리 용량도 작으면 사원수를 쓰는게 당연하겠죠? 결정적으로 행렬은 오류도 발생할 수 있는데, 사원수는 행렬에 비해 좀 덜합니다. 사원수의 정의 사원수 사원수는 4차원 복소수 공간벡터로 다음과 같이 나타낸다 q = = xi + yj + zk + w 혹은 q = s + v (단, s = w, v =) 이때, i, j, k는 다음과 같은 성질이 있..

Graphics/DirectX 2014.07.08

Direct 3D - 렌더링 파이프라인

파이프라인 이미 알고있는 내용이지만, 월드 -> 카메라 -> 투영행렬을 거쳐 3차원의 정점이 2차원의 점으로 변환되는 과정을 마치 정점이 수도파이프를 통과하는 과정처럼 묘사한거다. 사실, 투영이 끝난 다음에는 클리핑과 뷰포트변환과징이 있지만, 이 그림에서는 안그렸다 여기서는 각 좌표계의 행렬 유도 과정을 살펴본다 월드변환행렬 월드변환행렬은 로컬좌표계를 3차원 절대 좌표계인 월드좌표계로 변환하는 행렬이다. - 이동, 회전, 크기변환행렬등이 대표적인 예다. 로컬좌표계 : 메시를 모델링할 당시의 좌표계 이 로컬좌표계에 월드변환행렬을 적용하면 위와같은 좌표가 된다 모든 메시마다 각자의 고유한 로컬 좌표계가 있기 때문에, 이를 월드좌표계로 변환하려면 메시마다 변환행렬이 있어야한다, 이 변환행렬값은 일반적으로 3D..

Graphics/DirectX 2014.06.19

Direct 3D - 행렬

행렬을 D3D에서 사용하는 가장 큰 이유는 각종 변환을 행렬이라는 도구를 사용하여 간략하게 할 수 있기 때문이다. 이동, 회전, 크기등의 모든 변환이 행렬을 곱하는 동작만으로 간단하게 이루어진다. 그리고, 수학의 결합법칙(AB)C = A(BC)이 성립하기 때문에 사용한다. 왜 결합법칙이 중요할까, 보자 만약 1만개의 폴리곤으로 이루어진 메시가 있다고 가정해보자. 1만개의 폴리곤이라면 하나의 폴리곤이 3개의 정점으로 이루어지니까, 대략 3만개의 정점 연산이 필요하다는 얘기가 된다. 이 물체를 Y축으로 90도 회전시킨 다음 (10, 10, 10)의 위치로 이동시킨다고 생각해보자. 그럼 이런 연산이 필요해 1. 3만개의 정점 X 회전행렬(4x4) = 3만개의 회전된 정점 2. 3만개의 회전된 정점 X 이동행렬..

Graphics/DirectX 2014.06.19

Direct 3D - 행렬기초

대문자는 큰거, 소문자와 숫자는 작은거 (이걸 표현할 방법이 없네요.. 감은 오시죠?) 선형 방정식 B = A1X1 + A2X2 + .... + AnXn .... [식1] 일반적인 경우, 상수 b를 만족하는 x1, x2, ... , xn의 값을 구하는 문제를 생각해 보자. n개의 미지수로 이루어진 m개의 선형방정식은 다음과 같이 간단하게 표기할 수 있다. A11X1+A12X2+....+A1nXn = B1 A21X2+A22X2+....+A2nXn = B2 .......................................... Am1X1+Am2X2+....+AmnXn = Bn .... [식2] 그러므로, i번째 방정식은 Ai1X1+Ai2X2+....+AinXn = Bi 이제 [식2]를 풀기 위해 행렬이..

Graphics/DirectX 2014.06.19

Direct 3D - 벡터

벡터의 길이와 단위벡터 벡터에는 크기와 방향이 있다. 크기가 1인 벡터를 단위벡터라고한다. 임의의 벡터를 크기가 1인 단위벡터로 만드는 것을 정규화 한다고 한다. 임의의 벡터를 단위벡터로 정규화 하는 수식은 다음과 같다. 원점 o(0,0,0)에서 점 p(x,y,z)로 향하는 벡터 op혹은 P(x,y,z)에 대해 길이 L = |op| = 루트(x^2 + y^2 + z^2)로 정의하고 단위벡터 v=(x/L, y/L, z/L)로 표시한다 두 점으로 정의한 벡터 점Q에서 점P로의 벡터 v는 q-p로 표시한다. 그림을보자 이거는 3차원에서도 똑같이 적용됩니다. 자주나오죠? 벡터연산 2개의 벡터 p(Xp, Yp, Zp), q(Xq, Yq, Zq)와 상수 c가 있다고 할 때 다음과 같은 연산을 정의할 수 있다. 1...

Graphics/DirectX 2014.06.19

Direct 3D - 프레임워크

2011.4.1 작성된 글입니다. Direct3D를 사용한 프레임워크를 DirectX 마법사를 사용하여 만들어보자. 프레임워크 : 기본뼈대,, 앞으로 이걸 통해서 더 발전시켜나갈 여지가 있는 것이다. 프레임워크는 DX SDK 9.x를 설치하면 VS에 자동으로 DX응용프로그램 마법사가 설치된다. - 9.0c를 넘어가면서부터 프레임워크가 사라졌다고 한다. 이전에는 마법사형태로 지원되었지만 이제 스스로 코드로 짜야한다 인터넷 망망대해를 헤메다가 결국 찾아냈다 음 상하좌우키를 통해서 저 주전자를 돌려볼 수 있고 F2를 눌러서 자잘한 옵션을 설정할 수 있다. 그리고 내 그래픽카드가 보이네 HD4600ㅇㅋ 적어도 윈도우 창을 만드는것과 키입력같은 자잘한 것 정도는 얻어낸 셈이다. 일단 헤더는 넣어두고 클래스들을 좀..

Graphics/DirectX 2014.06.19

Direct 3D - *인덱스 버퍼

처음 기본세팅부터 이번 인덱스 버퍼까지 남김없이 이해해야한다. 인덱스버퍼란? 인덱스버퍼는 정점을 저장하기 위한 정점버퍼와 마찬가지로 정점의 인덱스를 보관하기 위한 전용 버퍼를 말한다. 인덱스 버퍼를 사용하는 이유는 여러가지지만, 그 중 하나는 정점을 여러번 나열하는 것 보다 메모리 소모량이 적다는 것, 또 하나는 자주사용되는 정점을 캐시에 저장해서 더 높은 효율을 낼 수 있다는 것이다. #include #include LPDIRECT3D9 g_pD3D = NULL; /// D3D 디바이스를 생성할 D3D 객체 변수 LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; /// 렌더링에 사용될 D3D 디바이스 LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; /// 정점을 ..

Graphics/DirectX 2014.06.19

Direct 3D - *메시

3D파일 포맷 X파일은 파일의 확장자가 .x로 끝나는 파일로, DirectX에서 지원하는 기본적인 3차원 메시파일 포맷이다 지금까지 좌표를 이용해서 삼각형 원통을 그렸지만, 실제 필드에서는 3D 그래픽 디자이너들이 만들어낸 메시를 가지고 출력을 해야한다 디자이너들은 3DMAX, MAYA같은 툴로 만들어낸다, 내가 만들어볼수도있는거겠지요? 3DMAX나 MAYA의 파일을 이용하려면 각각의 SDK를 추가적으로 설치해야한다 #include #include #include LPDIRECT3D9 g_pD3D = NULL; LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; LPD3DXMESH g_pMesh = NULL; /// 메시 객체 D3DMATERIAL9* g_pMeshMaterials = ..

Graphics/DirectX 2014.06.19

Direct 3D - *텍스쳐

텍스쳐 텍스쳐는 쉽게말해 단조로운 폴리곤에 옷을 입히는것 우리 아니지 내가 여태까지 재미없게 무지개색 삼각형이나 검은색 원통을 띄운게 다지만, 이젠 아닙니다 텍스쳐 좌표계 텍스쳐에는 텍스쳐를 제어하기위해서 텍스쳐만의 전용 좌표계가 존재한다 그게 2차원 u,v 좌표계다(s,t좌표계도 있는데, 그건 OpenGL에서 쓰는것이다) u, v 좌표계는 C#으로 3D할 때 했었다, 텍스쳐 부분을 참고하세요 모든 텍스쳐 좌표계는 기본적으로 0.0 ~ 1.0 사이의 실수값을 갖게되고, 이 값의 범위를 넘어서는 경우에 대해서 특별한 처리를 해 줄 수있다. 텍스쳐를 사용하기 위한 준비 1. IDirect3DTexture9 인터페이스 선언 2. 텍스쳐 좌표를 갖는 정점 선언 3. 텍스쳐 생성(일반적으로 파일을 로드하여 생성하..

Graphics/DirectX 2014.06.19