2015. 9. 10. 15:46


The Inventor Mentor.pdf


2015. 9. 10. 15:26



itkgdcmMSFF-4.8.lib(gdcmUIDGenerator.obj) : 

error LNK2019: __imp_UuidCreate 외부 기호

(참조 위치: "protected: static bool __cdecl gdcm::UIDGenerator::GenerateUUID(unsigned char *)" 

(?GenerateUUID@UIDGenerator@gdcm@@KA_NPEAE@Z) 함수)에서 

확인하지 못했습니다


다음과 같은 에러가 나왔을 때


rpcrt4.lib


라이브러리를 추가해주면 된다


#pragma comment( lib, "rpcrt4.lib" )


왜 그런지는 모르겠다...

2015. 9. 3. 17:30

CWnd 클래스

- 모든 MFC 클래스의 부모라 불리는 CObject 클래스와 CCmdTarget 클래스를 상속받은 클래스

- 윈도우 자체를 객체화한 클래스

- 객체를 선언하여 초기화하고 생성하면 화면에 윈도우가 하나 만들어진다


CCmdTarget 클래스

- MFC의 메시지 맵과 관련된 코드가 구현된 클래스

- 메시지 맵은 윈도우 프로시저 함수의 switch case 문을 대체하고자 도입된 MFC의 구조


* 초기화 관련 메서드

- Create( )/CreateEx( ) : 윈도우 생성 함수

- PreCreateWindow( ) : 윈도우를 생성하기 직전에 호출되는 가상함수

                           재정의하여 생성되는 윈도우의 속성을 변경하는 

                           코드를 추가

- GetStyle( )/GetExStyle( ) : 윈도우의 기본 스타일과 확장 스타일을 

                                반환하는 함수

- PreSubclassWindow() : 서브 클래싱 직전에 호출되는 가상함수

- GetSafeHwnd( ) : 생성된 윈도우의 핸들을 반환하는 함수



2015. 9. 3. 12:47

GetMessage(&msg, NULL, 0, 0);


- 메시지 큐에서 메시지를 가져옴 ( 메시지가 없으면 대기 : 동기식)


PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);


- 메시지 큐에서 메시지를 가져옴 ( 메시지 큐에 메시지가 없어도 동작)

- 비동기

- PM_REMOVE : 메시지를 읽은 후 메시지 큐에서 제거


DispatchMessage(&msg);


- 윈도우 프로시저(콜백, 처리함수)에게 메시지를 전달


TranslateMessage(&msg)


- 키보드 입력 메시지를 가공하여 프로그램에서 쉽게 쓸 수 있도록 해 줌

윈도우즈는 키보드의 어떤 키가 눌러졌다거나 떨어졌을 때

키보드 메시지를 발생시키는데

이 함수는 키보드의 눌림(WM_KEYDOWN)과 떨어짐(WM_KEYUP)이

연속적으로 발생할 때

문자가 입력되었다는 메시지(WM_CHAR)를 만드는 역할을 한다.

예를 들어 A키를 누른 후 다시 A키를 떼면

A 문자가 입력되었다는 메시지를 만들어 낸다.

2015. 9. 3. 08:50

//#ifdef _DEBUG

    //createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;

//#endif


이 부분을 삭제하면 된다



2015. 8. 11. 14:33

"rtsp://127.0.0.1:8554/testStream"


* Innosetup command


D:\publish\${JOB_NAME}\${GIT_BRANCH}\${BUILD_NUMBER}-${GIT_COMMIT}\x86


copy latest\CameraViewer\Release\*.exe latest\SetupFile

copy latest\live555Sample\win32\ProxyServer\Release\*.exe latest\SetupFile

copy latest\live555Sample\win32\ProxyServer\Release\*.dll latest\SetupFile

del /f /s /q Output

"C:\Program Files (x86)\Inno Setup 5\ISCC.exe" ojt_md.iss /dMyBuildNumber="%BUILD_NUMBER%"


* DirectDraw 순서


1. LPDIRECTDRAW 객체를 선언하고 DirectDrawCreate( )를 호출한다.

2. 윈도우 모드를 위해 협력 수준을 정한다. SetCooperativeLevel( )

3. 디스플레이 모드를 정한다. SetDisplayMode( )

4. 주요 평면을 생성한다. CreateSurface( )

5. 배경 평면을 생성한다. GetAttachedSurface( )



* 리눅스 순서


1. CentOS 설치

2. 이더넷 설치

3. SSH 설치

4. Samba 설치

5. g++ 설치

6. Hello world 출력


* WebRTC 책 이름


Getting Started with WebRTC

WebRTC Blueprints

Browser Networking

WebRTC Integrator's Guide

WebRTC Cookbook

Real-time communication with WebRTC

WebRTC: APIs and WebRTC Protocols


* 리눅스 주소


http://kldp.org

http://man.kldp.org/wiki

http://debianusers.org/

http://www.gnome.or.kr

http://www.suse.or.kr

http://www.ubuntu.or.k


* 리눅스 명령어


yum install net-tools

service network restart

g++ -c : no entire program - just object

g++ -o : 실행 파일의 경로와 이름을 알려주는 용도

이 옵션을 생략하면 컴파일러는 a.out 파일 생성


jQuery 명령어들의 리스트

getElementByID('myUser')

<head>

<meta charset="UTF-8"/>

<script src="greeting.js"></script>

jQuery : 1. jQuery의 로직을 쓰기 위해 

jQuery의 자바스크립트 파일을 

자신의 웹페이지로 가져와야 함

jQuery의 자바스크립트 코드 다운 받아 읽어옴

2. API documentation


2015. 8. 11. 11:47
1. 다음 사이트로 들어가서 MongoDB를 다운받아 설치한다

 

2. 커맨드 창을 띄우고 MongoDB가 설치된 폴더로 이동한다

  • 일반적으로 C:\Program Files\MongoDB\Server\3.0\bin 에 있다(mongo.exe가 있는 디렉토리)

3. 데이터를 저장할 폴더를 생성하고 경로를 설정한다

  • 여기서 테스트로 C:\data\book 폴더를 설정하고 경로를 다음과 같이 입력한다
  • mongod --dbpath c:/data/book




  • 경로를 설정하면 waiting for connections 라는 문구가 마지막에 나오고 대기 상태로 있다


  • 잘 생성이 되었으면 c:/data/book 경로에 다음과 같은 파일이 생성된다

4. 새로운 커맨드 창을 띄우고 mongo.exe 가 있는 디렉토리로 이동한 후 mongo 명령어를 입력하여 Mongo 쉘로 들어간다


  • connecting to: test 라고 뜨는데 디폴트로 test db가 생성되고 아무 명령어도 안 치면 여기에 데이터가 저장됨

5. book DB 를 사용하기 위해 use book 명령어 입력

  • db book 으로 변경되었다고 나온다

6. book DB 로 변경 후 member와 page에 데이터를 4개씩 8개 생성

> db.member.insert({name:"Kim hayoung", age:29, skill:["Java", "Oracle"]});

> db.member.insert({name:"Park sumin", age:27, skill:["Node.js", "Express"]});

> db.member.insert({name:"Lee naeun", age:31, skill:["MongoDB", "Elastic"]});

> db.member.insert({name:"Hong jinho", age:33, skill:["Linux", "Phthon"]});

> db.page.insert({number:"243", year:2011});

> db.page.insert({number:"216", year:2013});

> db.page.insert({number:"142", year:2015});

> db.page.insert({number:"72", year:2014});

  • 위의 그림은 page 입력 후 insert를 입력하지 않아 에러가 난 것이다

7. 잘 생성되었는지 확인해본다

> db.member.find()

> db.page.find()

> show collections

8. book 폴더에 local db와 book db가 생성된 것을 확인


위와 같은 결과가 나오면 일단 MongoDB 생성은 성공이다



2015. 8. 7. 17:22

cbuffer cbPerOjbect

{

float4x4 gWorldViewProj;

};


cbuffer 형식의 객체 cbPerObject를 정의한다. 상수 버퍼(constant buffer)는 셰이더가 접근할 수 있는 다양한 자료를 저장하는 유연한 자료 블록이다.

지금 예의 상수 버퍼는 gWorldViewProj라는 4 x 4 행렬 하나만 저장한다.

이 행렬은 한 점을 국소 공간에서 동차 절단 공간으로 변환하는 데 쓰이는, 세계, 시야, 투영 행렬을 하나로 결합한 것이다

HLSL은 4 x 4 행렬을 위한 내장 형식 float4x4를 제공한다. 그 외에도 여러 행렬 형식이 있는데, 예를 들어 3 x 4 행렬이나 2 x 2 행렬을 선언하려면 float3x4 형식이나 float2x2 형식을 사용하면 된다.


상수 버퍼의 자료는 정점마다 바뀌는 것이 아니다. 그러나 C++ 응용 프로그램은 효과 프레임워크를 통해서 상수 버퍼의 내용을 실행시점에서 변경할 수 있다. 예를 들어 세계 행렬은 물체마다 다르므로 세계, 시야, 투영 행렬이 결합된 행렬도 물체마다 달라야 한다. 따라서 앞에 나온 정점 셰이더로 여러 개의 물체를 그리는 경우 각 물체를 그리기 전에 gWorldViewProj 변수를 적절히 갱신해 주어야 한다

- 내용을 얼마나 자주 갱신할 것인지

- 상수 버퍼를 나누어 만들라는 것인지

에 근거해서 상수 버퍼를 나누어 만들라는 것이다

2015. 8. 7. 16:52

다음은 간단한 정점 셰이더의 구현 코드이다


cbuffer cbPerObject

{

float4x4 gWorldViewProj;

};


void VS(float3 iPosL : POSITION,

  float4 iColor : COLOR,

  out float4 oPosH : SV_POSITION,

  out float4 oColor : COLOR)

{

// 동차 절단 공간으로 변환한다

oPosH = mul(float4(iPosL, 1.0f), gWorldViewProj);


// 정점 색상을 그대로 픽셀 셰이더에 전달한다

oColor = iColor;

}


하나의 정점 셰이더는 본질적으로 하나의 함수이다.

지금 예의 정점 셰이더는 매개변수가 4개인데, 처음 둘은 입력 매개변수이고 나머지 둘은 out 키워드가 붙어있으므로 출력 매개변수이다.

HLSL에는 참조나 포인터가 없으므로, 함수가 여러 개의 값들을 돌려주려면 구조체를 사용하거나 이처럼 out이 지정된 출력 매개변수를 사용해야 한다.

정점 셰이더의 처음 두 입력 매개변수는 정점 셰이더의 입력 서명을 형성하며, 커스텀 정점 구조체의 자료 멤버들에 대응된다. 매개변수 의미소: POSITION과 :COLOR는 정점 구조체의 멤버들을 정점 셰이더 입력 매개변수들에 대응시키는 역할을 한다.

출력 매개변수에도 의미소가 부여되어 있다. 이들은 정점 셰이더의 출력을 파이프라인의 다음단계(기하 셰이더, 픽셀 셰이더)의 해당 입력에 대응시키는 역할을 한다. SV_POSITION 의미소는 특별한 의미소임을 주목할 것. SV는 이것이 system value(시스템 값) 의미소입을 뜻한다.


행렬 변수 gWorldViewProj는 상수 버퍼에 있는 것인데, 상수 버퍼에 대해서는 다음 절에서 이야기하겠다.

mul은 HLSL의 내장함수로, 벡터, 행렬의 곱셈을 수행한다. 


다음은 이 정점 셰이더와 정확히 같은 일을 하는 정점 셰이더로, 다른 점은 반환 형식과 입력 서명에 구조체들을 사용한다는 것


cbuffer cbPerObject

{

float4x4 gWorldViewProj;

};


struct VertexIn

{

float3 PosL : POSITION;

float4 Color : COLOR;

};


struct VertexOut

{

float4 PosH : SV_POSITION;

float4 Color : COLOR;

};


VertexOut VS(VertexIn vin)

{

VertexOut vout;


// 동차 절단 공간으로 변환

vout.PosH = mul(float(vin.PosL, 1.0f), gWorldViewProj);


// 정점 색상을 그대로 픽셀 셰이더에 전달

vout.Color = vin.Color;


return vout;

}


* 참고

- 기하 셰이더를 사용하지 않는다면 정점 셰이더에서 투영 변환을 반드시 수행해야 한다. 기하 셰이더가 쓰이지 않는 경우 하드웨어는 정점 셰이더를 떠난 정점이 동차 절단 공간에 있다고 가정하기 때문이다. 기하 셰이더를 사용하는 경우에는 투영 변환을 기하 셰이더에게 미룰 수 있다.


* 참고

- 정점 셰이더(또는 기하 셰이더)가 원근 나누기까지 수행하지는 말아야 한다. 투영 행렬을 곱하는 부분만 책임지면 된다. 원근 나누기는 나중에 하드웨어가 수행한다.







2015. 8. 7. 16:23

GPU가 정점 배열에 접근할 수 있으려면 배열의 정점들을 버퍼라고 부르는 특별한 자원에 담아 두어야 한다. Direct3D 코드에서 버퍼는 ID3D11Buffer 인터페이스로 대표된다.


정점들을 담는 버퍼를 정점 버퍼라고 부른다. Direct3D의 버퍼들은 자료를 담을 뿐만 아니라, CPU나 GPU가 자료에 어떻게 접근할 수 있고 버퍼가 파이프라인의 어디에 묶이는지에 대한 정보도 가진다.

정점 버퍼를 생성하려면 다음과 같은 과정을 거쳐야 한다.

1. 생성할 버퍼를 서술하는 D3D11_BUFFER_DESC 구조체를 채운다.

2. 버퍼의 초기화에 사용할 자료를 서술하는 D3D11_SUBRESOURCE_DATA 구조체를 채운다

3. ID3D11Device::CreateBuffer를 호출해서 버퍼를 생성한다.


2015. 8. 7. 16:14

렌더링 파이프 라인 구성,

정점 셰이더, 픽셀 셰이더를 정의

3차원 모형을 그리기 위해 기하구조를 렌더링 파이프라인에 제출하는데

필요한 Direct3D API의 여러 인터페이스와 메서드를 중점적으로 살펴본다

다양한 기하 도형을 색을 입혀서, 또는 와이어프레임 형태로 그릴 수 있다


이 글의 목표

1. 기하 자료의 정의와 저장, 그리기(drawing)를 위한 Direct3D 인터페이스와 메서드를 파악한다

2. 기본적인 정점, 픽셀 셰이더를 작성하는 방법을 배운다

3. 렌더 상태로 렌더링 파이프라인을 구성하는 방법을 파악한다

4. Direct3D 효과 프레임워크를 이용해서 논리적으로 연관된 셰이더들과

렌더 상태들을 하나의 렌더링 기법으로 묶는 방법과 효과 프레임워크를

일종의 '셰이더 생성기'로 사용하는 방법을 배운다.


* 정점과 입력 배치


- 정점은 공간적 위치 이외에 추가적인 자료를 가질 수 있다

- 원하는 자료를 가진 커스텀 정적 형식을 만들려면 우선 그러한 자료를 담을 구조체를 정의해야 한다

- 예를 들어 다음은 서로 다른 두 종류의 정점 형식을 보여준다

- 하나는 위치와 색상

- 하나는 위치, 법선, 텍스처 좌표로 구성


struct Vertex1

{

XMFLOAT3 Pos;

XMFLOAT4 Color;

};


struct Vertex2

{

    XMFLOAT3 Pos;

    XMFLOAT3 Normal;

    XMFLOAT2 Tex0;

    XMFLOAT2 Tex1;

};


정점 구조체를 정의했다면, 그 정점 구조체의 각 성분이 어떤 용도인지를 Direct3D에게 알려주어야 한다. 이 정보를 알려주는 수단이 바로 ID3D11InputLayout 형식의 입력 배치(input layout) 객체이다.

이 입력 배치 객체는 D3D11_INPUT_ELEMENT_DESC 구조체들로 이루어진 배열을 통해서 구축한다. 이 D3D11_INPUT_ELEMENT_DESC 배열의 각 원소는 정점 구조체의 각 성분을 서술하는 역할을 한다. 예를 들어 정점 구조체의 성분이 두 개라고 하면 D3D11_INPUT_ELEMENT_DESC 배열의 원소도 두 개이어야 한다. 


struct D3D11_INPUT_ELEMENT_DESC{

LPCSTR SementicName;

UINT SemanticIndex;

DXGI_FORMAT Format;

UINT InputSlot;

UINT AlignedByteOffset;

D3D11_INPUT_CLASSIFICATION InputSlotClass;

UINT InstanceDataStepRate;

};


- 정점 구조체의 각 성분을 D3D11_INPUT_ELEMENT_DESC 배열의 각 원소를 통해서 서술한다.


1. SemanticName : 성분에 부여된 문자열 이름

2. SemanticIndex : 의미소에 부여된 색인

3. Format : DXGI_FORMAT 열거형의 한 멤버

4. InputSlot : 이 성분의 자료가 공급될 정점 버퍼의 슬롯 색인

5. AlignedByteOffset : 입력 슬롯을 하나만 사용하는 경우 이 필드는 C++ 정점 구조체의 시작 위치와 이 정점 성분의 시작 위치 사이의 오프셋이다.

6. InputSlotClass : D3D11_INPUT_PER_VERTEX_DATA를 지정

7. InstanceDataStepRate : 지금은 0으로 지정


- 입력 배치 서술 배열을 완성했으며 입력 배치를 위한 ID3D11InputLayout 인터페이스를 얻었다면, 이제 ID3D11Device::CreateInputLayout 메서드를 호출해 입력배치를 생성한다


HRESULT ID3D11Device::CreateInputLayout(

const D3D11_INPUT_ELEMENT_DESC* pInputElementDescs,

UINT NumElements,

const void* pShaderBytecodeWith InputSignature,

SIZE_T BytecodeLength,

ID3D11InputLayout** ppInputLayout);


1. pInputElementDescs : 정점 구조체를 서술하는 D3D11_INPUT_ELEMENT_DESCE들의 

2. NumElements : 그 D3D11_INPUT_ELEMENT_DESC 배열의 원소 개수

3. pShaderBytecodeWithInputSignature : 정점 셰이더를 포함한 컴파일해서 얻은 바이트 코드를 가리키는 포인터.

4. BytecodeLength : 그 바이트 코드의 크기(바이트 단위)

5. ppInputLayout : 생성된 입력 배치를 이 포인터를 통해서 돌려준다


* 입력 서명(input signature) : 정점 셰이더는 일단의 정점 성분들을 입력 매개변수들로서 받는데, 그 입력 매개 변수들의 형식과 개수를 통칭

- 커스텀 정점 구조체의 성분들은 반드시 정점 셰이더의 적절한 입력 매개변수에 대응되어야 한다















2015. 8. 6. 16:44
https://docs.unrealengine.com/latest/KOR/index.html


2015. 8. 6. 11:35

조명 효과 사용하기


glEnable(GL_LIGHTING);


* 조명 모델의 설정

- 조명 모델은 모두 3가지

- glLightModel( ) 함수를 통해 설정

- 첫 번째 조명 인자 : GL_LIGHT_MODEL_AMBIENT



* 재질 속성의 설정

- 빛을 반사하는 정도를 설정

- 재질 속성 설정 방법은 2가지

-- 1. 각 폴리곤이나 폴리곤 셋에 대하여 glMaterial( ) 함수 호출



- 대부분의 경우 주변광과 분산광에 대한 반사도는 같게 설정된다.

- 빛이 나거나 번쩍하는 효과가 필요하지 않는 한 반사광은 설정할 필요가 없다.


-- 2. 색상 트래킹 

- 이 방식을 사용하면 재질에 대해 glColor만 호출해주면 된다. 

- 물론 그 전에 색상 트래킹을 사용 가능하도록 다음과 같이 설정해 주어야 한다.

- glEnable(GL_COLOR_MATERIAL);


- 다음은 glColorMaterial( ) 함수를 통해 glColor에서 설정한 값이 적용될 재질 인자를 지정한다.

- 예를 들어 주변광과 분산광을 폴리곤의 앞면에 적용하고자 한다면 다음과 같이 호출하면 된다.

- glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);


- 그 뒤로는 재질 속성을 설정하는 코드가 필요하다.


* 광원의 설정 











2015. 8. 5. 18:05

이 장에서 배울 것


* 그래픽스 파이프라인이 무엇이고 OpenGL과 연동하는 방법

* OpenGL의 기원과 오늘날의 OpenGL

* 책을 통해 세울 수 있는 기본 컨셉


이 책은 OpenGL에 관한 것이다. OpenGL은 너의 응용프로그램이 실행되는 장치의 그래픽스 서브시스템을 접근하고 제어하는 것을 사용할 수 있는 인터페이스이다. 전체적인 응용프로그램의 성능에서 실행하기를 윈하는 플랫폼을 구체화하는데 걱정하는 것보다 서브시스템에 대해 인터페이스를 표준화하는 것은 확률을 증가시키고 소프트웨어 개발자가 삼품의 품질을 생산하고, 흥미있는 컨텐츠를 생산하는데 집중할 수 있다. 이 표준 인터페이스는 Application Programming Interface(API)라고 불리고, 이것들 중에 OpenGL은 하나다. 이 장에서는 OpenGL을 소개하고 그것이 그래픽스 서브시스템에 어떻게 연동되는지 묘사하고, OpenGL의 기원과 진화에 대해 약간의 역사를 제공한다

2015. 8. 3. 14:48

- 당신은 여자친구의 몸무게를 맞추기

- 키와 몸무게가 어느 정도 비례할 것이라는 가정

- 우선 당신의 친구들로부터 키와 몸무게의 정보를 다음과 같이 수집



 

 친구1

친구2 

친구3 

친구4 

친구5 

 키

160 

165 

160 

170 

170 

 몸무게

50 

55 

60 

45 

50 


 


여자친구의 키가 162라는 것을 감안했을 때는 위의 정보를 토대로 50kg 쯤 될 것이라고 예상할 수 있다. 하지만 당신은 추측에 만족하지 못한다. 위의 정보를 토대로 가장 근접한 여자친구의 몸무게를 예측하기 위해 다음과 같이 수학적인 모델을 이용하기로 했다.


* 직관적 설명

- 예외상황이 별로 없는 데이터의 경우 분류를 잘하며 자질의 갯수만큼의 곱셈, 그리고 덧셈만 하면 되기 때문에 여타 알고리즘보다 runtime도 빠르다

- 직관적으로는 현재 주어진 traning set에 대해 평균적으로 설명할 수 있는 선이 모델이 된다 즉, 모델을 배운다는 것은 선의 기울기, 그리고 y절편을 구한다는 것을 의미한다 


자질(w)을 키, 그리고 추측해야 하는 값(y)을 몸무게로 두었으며 이를 평균적으로 설명하는 선을 모델로 지정하였다. 여기에서 평균적이라는 말의 의미는 선을 그었을 때 각 instance에서 선까지의 평균 거리의 제곱의 합을 최소화한다는 것을 의미한다.