반응형

3D 그래픽 프로그래밍 12

[서평] DirectX 12를 이용한 3D 게임 프로그래밍 입문

최신 DirectX 12에 대한 입문서입니다. 워낙 유명한 저자의 책이기도 하고 역자 류광님도 유명하신 분이라 선택한 책입니다. 우선 인상 깊은 것은 책의 저자의 DirectX 11에 대한 입문서 책과 예제가 거의 비슷합니다. 내용도 상당 부분 동일합니다. 대부분의 예제가 DirectX 11 예제를 DirectX 12로 포팅하고 수정한 듯 보입니다. 물론 예제의 품질은 좀 더 좋아졌습니다. 이 분의 DirectX 11에 대한 책을 본 뒤에 읽는다면 많은 부분의 내용과 예제가 비슷하여 좀 더 쉽고 빠르게 이해할 수 있습니다. 이런 부분에서 DirectX 11입문서가 DirectX 라이브러리가 플랫폼 라이브러리로 된 후의 DX라이브러리를 사용하지 않고 쓰여진 개정판이 나왔었다면 좀 더 좋았을텐데라는 아쉬움도..

[서평] DirectX 11을 이용한 3D 게임 프로그래밍 입문

계속 연구하던 DirectX 9를 마치고 최신 DirectX 12를 공부하려는 중입니다. DirectX 12를 공부하려고 여기저기 공부 법을 찾아보는데 국내에서 자체 엔진 개발하시는 분도 그렇고 외국 사이트의 개발자도 그렇고 라이브러리의 연속성 때문에 DirectX 11을 먼저 공부하는 것이 좋다고 해서 보게된 책입니다. 이 책의 저자가 DirectX 9시점 유명 책이었던 용책의 저자로 DirectX 관련 서적에서는 유명한 저자라서 보게된 책입니다. 하지만 이 책을 추천하기는 좀 어려울거 같습니다. 우선 번역이 그리 매끄러운거 같지 않습니다. 읽다가 번역 문제로 뭔가 잘 이해가 안간다는 느낌이 가끔 듭니다. 다음으로 DirectX 11은 윈도우 업데이트를 통하여 외부 SDK에서 OS쪽 기본 포함 SDK로..

[서평] 이득우의 언리얼 C++ 게임 개발의 정석

언리얼(Unreal) 5 엔진이 나온지 조금 지났습니다. 하도 유명하기도 하고 최신 3D 엔진의 구조가 궁금하기도 해서 최근에 언리얼 엔진 5를 조금 공부하고 있습니다. 기본적으로는 툴 사용법과 블루 프린트를 공부하였습니다. 적당히 툴과 블루프린트를 이해했을 때 본격적으로 C++ 이용한 사용법을 연구해 보려고 하였습니다. 하지만 블루프린트나 툴사용법과는 다르게 유튜브나 인터넷에서는 적당한 엔리얼 엔진 C++ 튜토리얼을 찾기가 힘들었습니다. 그래서 보기 시작한 책입니다. 또한 언리얼 C++ 관련 한글 책은 찾은게 이 책이 유일하여 본 책이기도 합니다. 이 책은 언리얼 4를 기반으로 작성되어 있는 책입니다. 하지만 언리얼 5가 언리얼 4의 확장인 관계로 이 책에 있는 내용에 API 변화만을 적용한다면 언리얼..

평면과 두 점 사이에 만나 점 구하기

평면의 방정식은 아래와 같습니다. ax + by + cz + d = 0 면의 방정식과 두 점을 아는 상태에서 평면과 만나는 두 점 사이의 점을 구하여 보겠습니다. 비율 r을 P – P0 / P1 – P0으로 정의하겠습니다. 비율 r을 구하기 위하여 분모 및 분자에 평면에 수직한 법선 벡터 n을 내적하면 비율 r은 아래와 같습니다. 참고로 벡터 n은 평면을 방정식을 응용하면 (a, b, c)가 됩니다. r = P·벡터 n – P0 ·벡터 n / P1 ·벡터 n – P0 ·벡터 n 여기서 P는 평면과 교차함으로 평면내에 포함되어 있어 P·벡터 n은 평면의 방정식에 의하여 –d가 됩니다. r과 관련된 수식에서 P의 값 만을 알 수 없었으므로 P·벡터 n을 –d값으로 치환하여 r을 구합니다. P는 P0 + r ..

세 점을 포함하는 평면의 방정식 구하기

평면의 방정식은 아래와 같습니다. ax + by + cz + d = 0 평면이 세 점 P0, P1, P2를 그림과 같이 포함한다고 하겠습니다. 해당 세 점을 바탕으로 벡터 V1 = P1 – P0과 벡터 V2 = P2 – P0을 정의할 수 있습니다. 그리고 벡터 V1과 벡터 V2의 외적를 구한 후 정규화하여 벡터 V를 구할 수 있습니다. 이 때 벡터 V의 x, y, z은 평면의 방정식의 a, b, c가 됩니다. 구한 벡터 V에 P0을 내적하면 평면의 방정식에 의하여 0이 되어야 함으로 이를 바탕으로 아래와 같이 d를 구할 수 있습니다. 벡터 V·P0 + d = 0 d = - (벡터V·P0) 마지막으로 위에서 구한 a, b, c, d를 대입하여 평면을 방정식을 구하면 됩니다.

DirectX 관련 참고할 만한 역사

운영하던 3D 관련 블로그 폐쇄하면서 가져온 글인데 아직도 유용한 것 같아 들리시는 분들 읽으라고 공개로 남겨놓습니다. 이틀간 각종 3D API와 H/W에 대하여 아무 생각없이 아래와 같이 wikipedia에서 찾아보았다. 이런저런 잡지식인데 참이나 재미있었다. DirectX DirectX에 대한 역사로 윈도우95부터 시작하여 DOS개발자를 끌어들이기 위한 한 방법으로 시작되었다는 사실이 흥미롭다. 또한 처음에는 WinG와 같이 사장될 것을 두려워해 개발자들이 배우기를 꺼려했다는 사실은 ATL, ASP, MFC, OLE 등등 사장되었거나 사장되어가는 MS기술을 지켜본 나에게 많은 공감을 준다. DirectDraw DirectDraw에 대한 이야기로 7부터 비추되어서 8에서 부터는 제거되었다. Direct..

빌보드(Billboard) 구현하기

빌보드는 항상 카메라를 바라보는 평면이라고 정의할 수 있다. 응용의 한 예를 살펴본다면 3D에서 멀리 있는 객체와 같은 경우 메쉬가 아닌 카메라를 바라보는 평면에 텍스처로 구현 할 수 있다. 이렇게 하면 직접 메쉬를 그리는 것에 비하여 그래픽 처리량이 줄어든다. IT EXPERT 3D 게임프로그래밍 같은 경우 Y축 행렬 부분만 역변환하여 구현하는 빌보드가 나와 있다. 위의 예제는 개인적으로 작성하는 프로그램에서 응용하기에는 적합하지 않아 아래와 같은 방법으로 구현하였다. 카메라와 객체 간의 각도를 구한다. (두 점 사이의 각도를 구하는 방법) 둘 사이의 각도를 역으로 객체에 회전시켜 객체가 카메라를 보이게 하였다. 객체를 역으로 회전시키는 이유를 간단히 설명하면 아래와 같다.

두 점 사이의 각도 구하기: atan2

두 점 사이의 라디언 각도는 아크탄젠트라는 수학 함수를 통하여 구할 수 있다. 프로그래밍 함수로는 atan2(y의 차이, x의 차이)로 구할 수 있다. 아크탄젠트는 개념적으로 아래와 같이 라디언 각도를 구한다. 라디언 각도 Θ = atan(Ry / Rx) 프로그램밍 적으로는 atan2(y2-y1, x2-x1)으로 구할 수 있다. 인자를 보면 점2 – 점1으로 Rx와 Ry를 구하는 것을 알 수 있다.

Direct3D Mesh

Direct3D 함수 중 D3DXCreateSphere(..)와 같이 메쉬를 만드는 함수는 Mesh를 만들지만 Mesh에 텍스처 정보가 없어서 텍스처를 입힐 수 없습니다. 이럴경우 메쉬를 복사한 후에 복사된 메쉬가 가지고 있는 버텍스 정보를 수정하여 텍스처를 입히면 됩니다. 여기서 난점은 텍스처를 수작업으로 입혀주어야 한다는 점입니다. 즉, 수학적으로 계산하여 입혀주어야 합니다. 아래사이트에 D3DXCreateSphere로 만든 구에 텍스처를 입히는 방법이 예제로 나와 있습니다. 참고로 이 텍스처 맵핑은 구를 바탕으로 한것이라 다른 메쉬와 같은 경우, 특이나 정육면체와 같은 경우에는 아래에 나와있는 수학적 공식이 아닌 다른 계산으로 입혀야 합니다. http://www.mvps.org/directx/art..

DirectInput Mouse 마우스 문제해결

IDirectInputDevice8::Acquire()에서 E_ACCESSDENIED가 리턴될 때... 개인적으로 윈도우가 생성되서 화면에 보이기 전에 호출할 경우 E_ACCESSDENIED에러가 리턴되었다. 이 문제를 해결하여 위하여 초기화 코드 중 Acquire()부분을 ShowWindow( hWnd, SW_SHOWDEFAULT ); UpdateWindow( hWnd ); //이제 윈도우 생성되어서 보임, 이 코드 이 후에 Acquire() 코드를 위치 시킴.. 뒤에 위치시켜서 해결하였다.

반응형