분류 전체보기 290

Direct 3D - 라이트 맵핑

사각형의 벽면을 그럴듯한 텍스쳐를 사용해 실제 벽면인것처럼 보이게 하고싶다 그런데, 모든 벽면이 동일한 밝기로 되어있으면 현실감이 떨어진다 그래서 광원이 있는곳은 밝고 광원이 없는곳은 어둡게 보이도록 하면 훨씬 실감나는 벽면이 될것이라는 가정하에 진행한다 그런데 여기서 포인트는 실제 광원을 생성해서 비추는게 아니라, 광원이 빛을 비추는 모양의 텍스쳐를 생성해서 텍스쳐와 함께 합성해주는 기법이 라이트 맵핑 기법의 원리 요고 두개를 합칠 것이다.. 왼쪽은 좀 작죠? 이걸 D3DTOP_MODULATE연산을 사용해서 합성했다 최근에는 GPU의 성능향상으로 라이트맵핑보다는 실시간 광원을 사용하는게 보편적이니.. 그냥 보고넘어가자 #include #include /**--------------------------..

Graphics/DirectX 2014.07.23

Direct 3D - 텍스쳐

이번에는,, 텍스쳐를 사용하는데 있어서 필요한 전반적인 지식을 알려드릴겁니다. 텍스쳐를 잘 활용하는 능력은 화려한 3D 그래픽을 표현하는데 있어 가장 중요합니다. 최근에는 절차적 텍스쳐(procedural texture)를 사용하는 새로운 추세가 생겼습니다.. 텍스쳐 좌표계 텍스쳐는 1, 2, 3, 4차원 좌표계를 가질 수 있는데, 일반적으로는 2차원 텍스쳐를 사용하게 된다. 3차원 환경 맵핑도 사실은 3차원 좌표계가 아니라 2차원 좌표계를 사용한다. Direct 3D의 텍스쳐 좌표계 2차원 텍스쳐 이미지를 3차원 공간의 폴리곤에 입히기 위해 변환하는데 기준이 되는 좌표계, 그냥 uv좌표라고 불리운다. uv좌표계가 0.0부터 1.0사이의 값을 갖는 텍스쳐 좌표계라면 실제로 이미지의 크기에 따른 좌표계는 ..

Graphics/DirectX 2014.07.21

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