프로그래밍 84

Function Pointer 사용하기

Function Pointer 사용하기. C++에서 포인터는 주소를 가르킨다. 흔히 우리가 보는 형태는 다음과 같았을 것이다. int * p = new int; *p = 10; 이는 변수의 주소를 가르키는 포인터다. 함수의 주소를 가르키는 포인터를 함수 포인터 즉, Function Pointer라고 한다. 함수 포인터는 일반 변수를 포인터와 약간 다르게 선언하는데 아래와 같이 선언한다. 반환형 (* 포인터변수이름) (함수의 매개 변수들); 다음과 같이 선언한다. #include using namespace std; int MyFunc() { return 1; } int main() { int(*p)(void); p = MyFunc; cout > cmd; if (cmd > bUseFunc3; if(bUse..

프로그래밍/C++ 2018.01.29

C++ Template이란

template 예로부터 많은사람들에게 C++의 Template 릿이라고 하면 뭔가 복잡하고 읽기 힘들다는 이미지가 있다.필자 또한 메타 템플릿 프로그래밍이 유행하던 시절 템플릿을 마개조해서 사용하느라 읽기 힘들고 유지보수하기도 어렵다느 소리를 들어왔기에템플릿에 대한 부정적인 이미지를 가지고 있었지만, 템플릿이란 존재를 언제까지 외면할 수 없을 뿐더러 꼭 사용해야하는 기능들도 있기에 템플릿에 대해 알아보기로 하였다. 오버로딩 코드를 짜면서 제곱 수를 반환하는 Square라는 함수를 만들었다. int Square(int n){ return n*n;} int main(){ Square(1); return 0;} 그런데, Square의 argument가 double형이길 바란다면? 어떻게 해야 할까?쉽게 생각..

프로그래밍/C++ 2018.01.14

시야 변환

시야 변환 View Matrix를 구하는 과정을 알아보자. View Transform(뷰 변환)은 월드를 카메라 좌표계로 만드는 변환이다. World 를 기준으로한 Local Space의 원점과 x, y, z 축을 나타내는 동차 좌표들이 다음과 같이 있다고하자. Qw = (qx,qy,qz,1) Uw = (ux,uy,uz,0) Vw = (vx,vy,vz, 0) Ww = (wx,wy,wz,0) 위의 정보를 근거로 View->World 좌표계 변환 행렬을 만들면 다음과 같다. | ux, uy, uz, 0 | W = | vx, vy, vz, 0 | | wx, wy, wz, 0 | | Qx, Qy, Qz, 1 | 그런데 우리가 원하는것은 World -> View 변환 행렬을 원하므로 이것의 역행렬을 구하면 된다...

1. Direct3D11 초기화

Direct3D 초기화 4X Multi Sampling을 지원하는 응용프로그램의 초기화 과정 예 1. D3D11CreateDevice 함수를 호출해서 Device와 DeviceContext를 생성 2. CheckMultiSamplingLevel을 호출해 지원하는 MSAA(MultiSampling Anti Aliasing)의 품질 수준 지원 정보 획득 3. SwapChain 관계를 정의하는 DXGI_SWAP_CHAIN_DESC 구조체를 채움 4. Device를 생성했던 IDXGIFactory Interface를 Query해서 SwapChain Instance를 생성 5. Back Buffer의 RenderTarget View를 생성 6. Depth,Stencil Buffer 생성 7. Render Targ..

0.DirectX 11 기본 지식

기본 지식 Direct3D의 개요 Direct3D는 응용 프로그램이 3차원 가속 기능을 이용하여 3차원 세계를 렌더링 할수 있게 하는 API 이다. Direct3D는 그래픽 하드웨어를 제어 할 수 있기 때문에, 화면을 깨끗히 지우라는 명령을 하드웨어에게 ID3D11DeviceContect::ClearRenderTargetView 함수를 통해서 전달 할 수 있다. 기존 널리 쓰이는 버전을 DirectX 9을 사용하였는데, 9의 경우 특화 기능을 사용하려면, 현재 하드웨어(그래픽 카드)가 해당 기능을 지원하는지 일일히 체크해야했다면, 11은 그럴 필요가 없다. 그래픽 장치가 DX11을 지원한다고 얘기하려면 DX11 의 모든 기능을 지원해야 한다는 엄격한 조건이 붙기 때문이다. COM Component Obj..

Windows 에러 핸들링, GetLastError

Windows 에러 핸들링 대부분의 Windows 함수가 사용하고 있는 반환 자료형은 아래의 표와 같다. 자료형 실패 했을 때의 값 VOID 이 함수는 절대 실패하지 않는다. 소수의 윈도우 함수만이 VOID 반환 자료형을 가짐 BOOL 함수가 실패하면 0을 반환, 성공시에는 0이 아닌 값을 반환한다. 즉, 비교시 TRUE와 비교하는 것보단, FALSE와 비교하는것이 나음 HANDLE 실패시 대개 NULL을 반환. 성공시 유효한 오브젝트 핸들을 반환한다. 몇몇 함수들은 -1로 정의된 INVALID HANDLE VALUE도 있기 때문에 주의 요망. SDK 문서에 명확하게 기술되어 있음 PVOID 함수가 실패하면 NULL을 반환, 성공시 PVOID가 데이터를 저장하고 있는 메모리 주소를 가르킴 LONG/DWO..

프로그래밍 2017.12.28

X86 Disassembly/Data Structures

stack overflow에 관련된 자료를 찾아보던 중, 어셈블리를 공부하지 않았던 저같은 초보자에게도 좋은 자료가 있어 한국어 페이지를 만들었습니다. X86 Disassembly/Data StructuresContents 1자료 구조2배열2.1스택에서 배열 참조2.2메모리에 있는 배열 참조3Structures4구조체 심화5구조체와 배열 구분하기6Linked Lists 와 Binary Trees자료 구조어떤 프로그램들은 단순한 메모리 구조상에서 동작합니다. 그러나 많은 수의 프로그램들은 복잡한 데이터 타입과 객체를 사용합니다. 이 페이지에서는 어떻게 컴파일러가 복잡한 객체가 사용된 코드들을 어셈블리로 만드는지에 대해, 또 어떻게 리버스 엔지니어링 하는 사람들이 어셈블리화된 코드를 읽을 수 있는지에 대해 ..

프로그래밍 2017.11.26

Malmo 플랫폼 튜토리얼

Malmo 플랫폼 튜토리얼1. 시작하기Malmo 배포판의 루트부터 시작한다.Minecraft 실행 방법:cd Minecraft launchClient.bat (on Windows) ./launchClient.sh (on Linux or MacOSX) Windows 유저라면 launchClient.bat을 더블 클릭해서 실행해도 된다.참고: 만약 메인 메뉴가 잘 보인다면 커맨드창에서 "Building 95%"라고해서 기다리지 말고 무시해도 된다.Python_Examples 폴더를 coomand나 prompt창에서 연다.2. 필드에 서있기tutorial_1.py를 실행해보자. 이 튜토리얼은 가장 기본이되는 뼈대 mission이다.agent는 아무것도 하지않고 필드 위에서 서있을 뿐이다.튜토리얼을 실행시키면 ..

프로그래밍/AI 2017.07.15

Malmo 플랫폼 설치

1. Downloadhttps://github.com/Microsoft/malmo/releases이 링크에 가서 운영체제에 맞는 파일을 다운로드 받는다.필자의 경우 Malmo-0.21.0-Windows-64bit.zip 파일을 받았다.2. install dependencies디펜던시란, 프로그램을 빌드하는데 필요한 외부 종속된 라이브러리 같은 것들을 분리해 놓은 것이다.우리는 windows 10 에 내장되어있는 power shell을 사용해서 디펜던시들을 설치할것이다.명령창을 열고 다음의 명령어들을 입력한다.powershell Set-ExecutionPolicy -Scope CurrentUser Unrestricted 다음은 설치된 경로로들어가는 것이다. ($env:HOMEPATH\Malmo-0.21.0..

프로그래밍/AI 2017.07.15

Minecraft로 AI 만들기 Malmo

인공지능에 대한 관심이 늘어나는 이 때, AI를 그래픽스 프로그래밍으로 가시화하는 것도 꽤나 큰 코스트가 들어갑니다. Microsoft에서 제공하는 Malmo라는 AI Research Platform은 서버 코드만 작성하면 Mod Client에서 Agent를 제어할 수 있도록 해 줍니다. 설치하는데 어렵지도 않고, Minecraft와 AI를 연동해보고 싶다면 추천해드리고 싶습니다. tutorial도 단계별로 친절하게 제공되고, 집짓기 Competition도 열린다고 합니다. C#, Python, C++, Java, lua 언어를 지원합니다. 단 예제는 Python이 많습니다. 아래 영상은 Reinforcement Learning(Q-Learning)으로 길 찾기를 학습한 Agent의 영상입니다. 소스 코..

프로그래밍/AI 2017.07.15