블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2803)
Unity3D (859)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (234)
협업 (61)
3DS Max (3)
Game (12)
Utility (140)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (16)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

1. 여기에서 Boost installer 를 다운받습니다.

2. Boost installer 를 실행하면 license agreement 거치고 난 후, 어디에서 다운 받을 것인지 묻습니다.

boost installer

boost installer

3. 그럼 자신의 개발 환경과 어떤 구성을 설치할 것인지 묻습니다.

사용자 삽입 이미지

4. 그리고 나면 어느 디렉토리에 설치할 것인지 묻고(디폴트는 C:\Program Files\boost\boost_1_35_0 입니다)

사용자 삽입 이미지

5. 그리고 나면 설치를 시작합니다.

사용자 삽입 이미지

6. 설치가 끝나고 나면 Visual Studio 설정을 해줘야 합니다.
도구->옵션->프로젝트 및 솔루션->VC++ 디렉토리 를 선택하신 후에 포함 파일(Include directories) 및 라이브러리 파일(Library directories)을 각각 다음과 같이 설정하시면 됩니다.

C:\Program Files\boost\boost_1_35_0
C:\Program Files\boost\boost_1_35_0\lib

(당연히 C:\Program Files\boost\boost_1_35_0 를 4단계에서 여러분이 선택한 디렉토리로 바꿔주시면 됩니다)

7. Visual Studio 설정이 끝나면 한 번 제대로 설정이 됐는지 확인해 봐야겠지요. 먼저 boostex 라는 이름으로 Win32 콘솔 응용 프로그램 프로젝트를 생성합니다.

사용자 삽입 이미지

그리고 나서 다음 소스를 입력해 보세요(아래 예제는 Boost의 정규식 라이브러리를 사용하는 예제로 Boost의 정규식 라이브러리는TR1에 포함됐었고, 머지 않아 C++0x에도 포함될 예정입니다).

#include <boost/regex.hpp>
#include <iostream>
#include <string>

int main()
{
    std::string line;
    boost::regex pat( "^Subject: (Re: |Aw: )*(.*)" );

    while (std::cin)
    {
        std::getline(std::cin, line);
        boost::smatch matches;
        if (boost::regex_match(line, matches, pat))
            std::cout << matches[2] << std::endl;
    }
}


솔루션을 빌드한 후 아무런 에러 없이 빌드가 완료되면 제대로 설치하신 것입니다. 테스트삼아 실행하시려면 다음과 같은 텍스트 파일을 만드신 후 

(email.txt 파일 입력)
To: George Shmidlap
From: Rita Marlowe
Subject: Will Success Spoil Rock Hunter?
---
See subject.

다음과 같이 실행해 보시면 E-mail의 제목만 꺼내는 걸 확인할 수 있습니다.

D:\Documents and Settings\김윤수\My Documents\Visual Studio 2008\Projects\boostex\Debug>boostex.exe < email.txt
Will Success Spoil Rock Hunter?


그럼, Happy boosting 하세요~



출처 : http://yesarang.tistory.com/239

반응형

'Programming > boost' 카테고리의 다른 글

Boost 라이브러리 설치  (0) 2012.07.22
Posted by blueasa
, |

혹시 Boost 라이브러리라는 것을 아시나요만약 아직 모르고 있었다면 C++ 프로그래머로서 적지 않은 손해를 보고 있다고 생각합니다.^^

Boost 라이브러리는 C++ 프로그래머를 위한 유용한 오픈 소스 C++ 라이브러리 모음입니다. Boost 라이브러리 개발에 수 많은 C++ 고급 프로그래머들이(C++ 표준 위원회 멤버 등참여 하고 있습니다그래서 Boost 라이브러리는 실용적인 기능과 높은 안정성을 가지고 있습니다.

 

만약 아직까지 Boost 라이브러리를 한번도 사용해 본적이 없다면 바로 사용하기를 권합니다그리고 아직도 일부에서는Boost 라이브러리의 안정성에 대해서 의심하는 분들이 있는데 무의미한 의심은 그만두기를 바랍니다^^

  

C++11에 들어가는 새로운 표준 라이브러리에는 Boost 라이브러리에 있는 것들이 많이 들어갔습니다예를 들면 VS 2008 SP를 설치하면 사용할 수 있는 tr1 라이브러리에 있는 대부분이 Boost 라이브러리에 있는 것입니다새로운 표준에는 들어갔지만 아직 VC++에서 지원하지 않는 라이브러리도 Boost 라이브러리를 사용하면 미리 사용해볼 수 있습니다.

 

다음에 소개할 chrono Boost 라이브러리에 이미 있습니다그러니 Boost 라이브러리를 설치하면 chrono는 바로 사용해 볼 수 있습니다.

 

Boost 라이브러리의 설치와 사용 방법은 구글링을 하면 적지 않게 찾을 수 있습니다그 중 몇 개를 제가 찾아 놓았습니다^^

 

 

Boost 라이브러리 홈페이지

http://www.boost.org/

최신 버전은 1.47.0 입니다.

 

 

VC++ 6.0에서 Boost 라이브러리 설치

- 1.33 버전까지만 설치할 수 있습니다

http://blog.naver.com/sorkelf/40132524363

 

 

설치 파일로 설치하기 (VC++ 7.1 ~ VC++ 10까지 지원)

- Boost 라이브러리는 대부분의 기능은 헤더 파일 추가만으로 사용할 수 있지만 일부 기능(thread, filesystem ) lib 파일을 만들어야 합니다그러나 설치 파일로 설치하면 이미 빌드된 lib 파일을 얻을 수 있습니다.

http://ncanis.tistory.com/333

 

 

수동으로 설치하기

가장 기본 적인 방법으로 직접 lib 파일을 만들어야 합니다위의 설치 파일보다 장점은 lib 파일을 빌드할 때 옵션을 마음대로 지정할 수 있고특히 가장 최신 버전을 빨리 사용할 수 있습니다.

http://genkino.tistory.com/1446

 

 

Boost 라이브러리 설명

몇 년 전에 제가 번역한 것으로 1.33 버전을 기준으로 하고 있습니다설명에 부족한 것이 많지만 그런 부분은 구글링을 찾아보시기 바랍니다.

http://jacking75.cafe24.com/Boost/libraries.htm

 

 

Boost 라이브러리 e-book

영어라는 단점(?)이 있지만 각 기능을 잘 설명하고 있습니다.

http://en.highscore.de/cpp/boost/

 


꼭 Boost 라이브러리를 설치하고 사용하기를 강력하게 추천합니다




출처 : http://vsts2010.net/632


반응형

'Programming > boost' 카테고리의 다른 글

Microsoft Visual Studio에서 boost 사용하기  (0) 2012.07.22
Posted by blueasa
, |

안녕하세요? 맨날맑음 입니다.

WPF나 Silverlight 와는 다르게 Windows Form에는 '로드 완료' 이벤트가 없습니다. Load 이벤트가 제공 되고 있기는 하지만 MSDN에 나온 의미는 '폼이 처음으로 표시되기 전에 발생합니다.' 입니다. 즉 로드 완료가 아니라는 것입니다.

이것이 왜 문제일까?
로드 완료가 아닌 로드중 이벤트만 제공하여 생기는 문제가 있습니다.
예를 들어 프로그램을 시작할 때 폼을 숨기려고 한다고 하면, Hide() 메서드를 호출 해야합니다.
실행 할때 숨기려 했으니 당연히 폼의 생성자에 Hide()를 넣어보지만 전혀 동작 하지 않습니다.
두번째 방법으로 폼의 Load 이벤트 핸들러 안에 Hide()를 넣어봅니다. 역시 동작하지 않네요;
정확하지 는 않지만, MSDN의 설명대로 폼이 아직 표시되기 전이라 Hide()가 먹히지 않는 것 같습니다.
이밖에 Focus()나 몇몇 다른 메서드도 동작하지 않습니다.

어떻게 해결할까?
위의 문제를 해결하려면 '로드완료' 이벤트를 찾아야 하는데 아무리 뒤져보아도 로드완료는 존재하지 않았습니다.
그래서 임시 방편으로 Application.Idle 이벤트를 사용하여 해결 하였습니다. Application.Idle 이벤트는 말그대로 프로그램이 아이들 상태(쉬고 있을때) 발생합니다. 이걸 응용하면, 생성자에서 이벤트를 걸어주고, 이벤트 핸들러에서 이벤트를 빼주는 방법으로 로드 완료된 시점을 잡을 수 있습니다. 물론 엄밀히 말하면 프로그램이 더이상 할 일이 없어 쉬고 있을 시점을 잡아내는 것입니다.

using System;

using System.Windows.Forms;

namespace Sample

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

            //Idle이벤트를 걸어준다.

            Application.Idle += Application_Idle;

        }

        void Application_Idle(object senderEventArgs e)

        {

            //Idle이벤트를 없앤다.

            Application.Idle -= Application_Idle;

            this.Hide();

        }

    }

}


위의 코드에서 Idle 이벤트 핸들러에서 Application.Idle -= Application_Idle; 이벤트를 빼주는 방법으로 프로그램이 처음으로 쉴때(로드완료)를 잡아내는 것입니다. 이렇게 임시 방편이나마 로드 완료 시점을 잡아서 hide() 메서드를 동작시킬 수 있습니다.




반응형
Posted by blueasa
, |

프로그램에 실행 될 때마다 필요한 메모리 공간(지역 변수, 전역변수 공간)의 할당을 위해 메인 메모리(RAM)에 할당된다. 이렇게 할당되는 메모리 공간은 데이터, 힙, 스택의 세 영역으로 나뉜다.


[그림 1] C 언어의 메모리 관리 구조


■ 데이터 영역(Data Area)

데이터 영역은 전역 변수와 static 변수가 할당되는 영역이다. 이 영역에 할당되는 변수들은 일반적으로 프로그램의 시작과 동시에 할당되고, 프로그램이 종료되어야만 메모리에서 소멸된다. 즉, 데이터 영역에 할당된 변수는 프로그램이 종료될 때까지 계속 존재한다는 특징을 지닌다. 전역 변수와 static 변수의 특징과 일치하는 부분이다.

■ 스택 영역(Stack Area)

스택 영역은 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역이다. 이 영역에 할당된 변수는 함수 호출이 완료되면 사라진다는 특징을 지닌다. 이는 다른 메모리 영역과 확실히 비교되는 특징이다. 늦게 할당된 변수의 메모리가 먼저 해제되므로 스택의 특징과 일치한다.

■ 힙 영역(Heap Area)

힙 영역은 프로그래머가 관리하는 메모리 영역이다. 즉 프로그래머의 필요에 의해서 메모리 공간이 할당 및 소멸되는 영역이다. 동적 할당으로 생성되는 메모리 영역이다.

※ 정적 할당되는 변수의 메모리는 변수의 특성에 따라 데이터 또는 스택 영역에 생성된다. 정적 할당은 컴파일 단계(Compile-time)에서 모두 이루어진다. 하지만 컴파일 단계에서는 메모리의 크기만 생성 할 뿐 변수의 값은 저장 되지 않는다. 이 때문에 배열의 크기는 상수로만 지정해야 하는 것이다. 변수 값의 저장은 런타임(Run-time)에서 이루어지며, 런타임 단계에서 메모리를 생성하고자 할때 사용하는 것이 동적 할당이다.


출처 : http://blog.naver.com/sulzi83/100065485863

반응형
Posted by blueasa
, |

GetAsyncKeyState() 함수와 GetKeyState() 함수는 키보드의 키가 눌렸는지를 체크하는 함수들이다.

GetAsyncKeyState() 함수는 비 동기(Asynchronism)로 처리한다. 즉, 호출된 시점에서 키 상태를 조사하여, 메시지 큐를 거치지 않고 바로 리턴을 해 주므로 키 입력을 바로 처리해 줄 수가 있다.

GetKeyState() 함수는 호출된 시점에서 메시지 큐를 거치며, 메시지 발생 후의 상태를 리턴하게 되므로, 키보드 메시지 처리 루틴내에서 사용해야 한다. 게임과 같이 키 입력에 바로 반응을 해 줘야 하는 프로그램에서는 GetAsyncKeyState()함수를 사용하는 편이 좋다.

GetAsyncKeyState() 함수의 사용은

[code]if ( GetAsyncKeyState(VK_RETURN) )        // enter 키가 눌렀다면
// 처리            }
[/code]

이렇게 직접 쓰여도 되지만, 아래와 같은 형식으로 많이 사용한다.

[code]if ( GetAsyncKeyState(VK_RETURN) & 0x8000 )         // enter 키가 눌렀다면
// 처리            }
[/code]

왜? 0x8000으로 AND 연산을 통하여 키 눌림을 체크할까?

GetAsyncKeyState() 함수는, 키가 눌려진 시점에서 0x8000 값을 리턴해 준다. 그리고 함수가 호출되었을때 키가 눌려져 있었다고 0x0001 값을 리턴해 준다. 즉, 0x8000 은 현재 키가 눌려진 상태를 뜻하고, 0x0001은 지난번 호출과 이번 호출 사이에 키가 눌려진 적이 있었다 라는 것을 뜻한다.

예를 들어, 아래 방향키가 게임내에서 비행기도 움직이고, 메뉴에서 위아래 선택에도 쓰인다고 가정해 보자. AND 연산없이 그냥 사용하여 비행기를 움직이다가, F1키를 눌러 메뉴를 띄웠을 때 커서가 자동으로 아래쪽으로 내려갈 위험성이 생긴다. 왜냐하면, F1키를 누르는 시점에서 - if ( GetAsyncKeyState(VK_F1) ) - VK_DOWN은 눌리지 않았지만 리턴값이 0x0001이 되어 if ( GetAsyncKeyState(VK_F1) ) 전에 호출된 if ( GetAsyncKeyState(VK_DOWN) ) 이 참이 되기 때문이다. 하지만, 0x8000으로 AND 연산을 하면,

   1000 0000 0000 0000 (키눌림 0x8000)                0000 0000 0000 0001 (눌러진 적이 있음 0x0001)
& 1000 0000 0000 0000 (AND 연산 0x8000)         & 1000 0000 0000 0000 (AND 연산 0x8000)
---------------------------------------       -----------------------------------------------
   1000 0000 0000 0000 (키눌림 0x8000)                0000 0000 0000 0000 (키 안 눌림)

위와 같은 결과가 되어, 정확한 시점에서 키가 눌러진 상태를 체크할 수가 있는 것이다. 즉, 정확한 시점에서 키눌림 상태를 체크하기 위해서 0x8000으로 AND 연산을 해 주는 것이다.

 

GetKeyState() 함수의 사용 예

[code]// 키보드 메시지 처리루틴이 있는 콜백 함수 내에서...
// char szTemp[256];

case WM_KEYDOWN:
        // Ctrl + 왼쪽 화살표키가 눌렸는지 조사
        if ( wParam == VK_LEFT ) && (GetKeyState(VK_CONTROL) < 0) )
        {
                wsprintf(szTemp, "Ctrl키와 왼쪽 화살표 키가 눌림");
        }
        return 0;
[/code]

GetKeyState() 함수의 리턴값이 음수일 경우는 해당키가 눌린 상태이고, 음수가 아닐 경우는 해당키가 눌리지 않은 상태이다.

GetAsyncKeyState와 GetKeyState는 둘 다 키의 상태값을 알아내는 함수이다. 하지만 이 둘 사이에는 차이점이 있는데 다음과 같은 것들이다.

GetAsyncKeyState는 "키가 눌렸는가?"와 "언제부터 눌렸는가?"를 알아낼 때 사용한다. 키가 눌렸을 때 GetAsyncKeyState는 0x8000 bit가 1이된다. 그리고, 이전에 GetAsyncKeyState가 호출되었을 때부터 이번에 GetAsyncKeyState가 호출될 때까지 중간에 끊기지 않고 계속 눌려있는 상태라면 0x0001 bit는 0이 되고, 그렇지 않은 경우는 1이 된다.

1) CTRL 키가 눌린 상태이다.
2) GetAsyncKeyState(VK_CONTROL)를 호출하면 0x8001을 리턴한다.
3) GetAsycnKeyState(VK_CONTROL)을 한번 더 호출하면 0x8000을 리턴한다.

1) CTRL 키가 눌린 상태이다.
2) GetAsyncKeyState(VK_CONTROL)를 호출하면 0x8001을 리턴한다.
3) CTRL 키를 뗬다가 다시 눌렸다.
4) GetAsycnKeyState(VK_CONTROL)을 한번 더 호출해도 0x8001을 리턴한다.

키가 눌리지 않았을 때, GetAsyncKeyState는 항상 0x0000을 리턴한다.


GetKeyState는 "키가 눌렸는가?"와 "키의 토글상태가 무엇인가?"를 알아낼 때 사용한다. 키의 토글 상태란 Caps Lock, Num Lock의 키가 한번 누르면 불이 켜지고 다시 한번 누르면 불이 꺼지는 것을 생각하면 이해가 빠를것 같다.
키보드 상에는 위에서 말한 키만 불이 켜졌다 꺼졌다하면서 토글상태를 알려주고 있지만 다른 키들도 토글 상태를 갖고 있으며 단지 우리 눈에 보이지 않을 뿐이다. 이 토글 상태를 GetKeyState 함수로 알아낼 수 있다.

GetKeyState의 리턴값은 SHORT가 아닌 CHAR로 생각된다.
리턴값을 살펴보면 0xffffff81, 0xffffff80, 0x00000001, 0x00000000이 되는 것을 볼 수 있기 때문이다.
참고로 같은 SHORT형을 리턴하는 GetAsyncKeyState의 리턴값은 다음과 같다.
0xffff8001, 0xffff8000, 0x00000000 셋 중 하나

** MSDN에는 현재 하드웨어(키보드)의 상태값을 알아내길 원한다면 GetAsyncKeyState를 사용하라고 나와있다. GetKeyState는 메시지큐에 저장된 메시지에 따라 값이 변하기 때문이다.
메시지큐에 처리되지 않은 CTRL키가 눌렸다는 메시지가 쌓여있을 때,사용자가 CTRL키를 더이상 누르지 않고 있다면. GetAsyncKeyState는 "키가 눌리지 않았음"을, GetKeyState는 "키가 눌렸음"을 리턴할 것이다.



출처 : http://www.silverwolf.co.kr/4842

반응형

'Programming > Win32API' 카테고리의 다른 글

윈도우 투명  (0) 2011.10.30
한영키 누름 윈도우 메세지 확인 관련  (2) 2010.09.06
Keyboard 입력 받기  (0) 2010.09.03
IME 영문만 입력가능하게 하기  (0) 2010.09.03
IME  (0) 2010.09.02
Posted by blueasa
, |

DSP 프로그래밍에서 중요한 개념인 빅 엔디안 (Big Endian)과 리틀 엔디안 (Little Endian)에 대해 정리해보려고 한다.

원래 빅 엔디안과 리틀 엔디안은 걸리버 여행기에 나오는 소인국의 일화에서 처음 등장했다. 
소인국에서는 달걀의 껍질을 까서 먹을때 뭉툭한 곳(Big End)을 깨서 먹어야 하는지, 뽀죡한곳 (Little End)를 깨서 먹어야 하는지에
대한 논쟁이 일어났는데, 그때 뭉툭한곳을 주장하는 사람들을 Big Endian이라고 하고, 뾰족한 곳을 주장하는 사람들을 Little Endian이라고 불렀다. 이 소설에서의 용어를 가져와서 사용하게 되었다.

위키백과에 들어가보면 Endianess를 컴퓨터의 메모리같은 1차원 공간에 여러개의 연속된 대상을 배열하는 방법을 뜻한다고 한다. 이 대상에는 Word가 될수도 있고, Byte가 될수도 있고 bit가 될수도 있다. 

빅 엔디안과 리틀 엔디안 둘중 어느것이 우월하다고 말하기는 어려우며, 상황에 따라 다르다고 할수 있다. 



다음의 예는 영문 위키백과에서 따옴을 밝힌다.
1) 빅 엔디안
예를 들어 레지스터에 0A0B0C0D의 8비트 정보들이 있고, 메모리 주소는 1바이트씩 증가한다고 하면,
메모리 주소가 a, a+1, a+2, a+3으로 증가한다고 했을때 다음과 같이 mapping 된다.


a: 0A
a+1: 0B
a+2: 0C
a+3: 0D

즉, MSB에서 부터 주소가 증가하는 방향으로 데이터가 메모리에 저장되게 된다.

2) 리틀 엔디안
위와 같이 똑같은 가정을 했을때 리틀엔디안에서는 다음과 같이 mapping된다.

a: 0D
a+1: 0C
a+2: 0B
a+3: 0A

즉, 빅 엔디언과 반대방향으로 메모리에 데이터가 저장되게 된다.

<빅 엔디언과 리틀 엔디언의 장단점>

빅 엔디언의 장점 : 사람이 읽고 쓰는 방법과 같은 순서로 데이터가 저장되기 때문에, 디버깅이 편하다.
빅 엔디언의 단점 : 연산에 따라 수가 커지면 왼편에 자리수를 추가하기 위해서 기존에 저장된 모든 데이터를 오른쪽으로 옮겨야 하는 경우가 발생한다.

리틀 엔디언의 장점 : 수가 커질때 새로운 자리수가 단순히 오른편에 추가만 하면 된다. 즉 연산이 빨라진다.
리틀 앤디언의 단점 : 디버깅할때 사람의 읽는 방향과 반대이므로 편의성이 떨어진다.



보통 인텔 프로세서 계열은 리틀 앤디언을, 모토롤라 프로세서 계열은 빅 앤디언을 쓴다고 한다.



출처 : http://pelleas.tistory.com/entry/%EB%B9%85-%EC%97%94%EB%94%94%EC%95%88Big-Endian-%EA%B3%BC-%EB%A6%AC%ED%8B%80-%EC%97%94%EB%94%94%EC%95%88Little-Endian

반응형
Posted by blueasa
, |

<레지스터, 스택, 힙, 데이터 영역> 

1) 레지스터 (Register) 
레지스터는 CPU나 프로그램이 접근할수 있는 메모리 영역중 가장 빨리 접근 할 수 있는 곳이라고 할 수 있다.
보통은 CPU의 경우 내부 메모리로 설정되어있으며 RAM 같은 외부 메모리와는 다르다.쉽게 생각해서 CPU안에 숨어있는 메모리라고 보면 되겠다. (우리가 흔히 보는 4GB DRAM 같은 것은 외부 메모리이다.)
보통의 CPU는 "로드스토어 구조"라는 레지스터 접근 방식을 택하는데, 이는 지금 당장 연산이 이루어지는 메인 메모리의 데이터를 레지스터로 가져온후 연산을 하고 이후 다시 메인메모리로 저장하는 구조이다. 보통 레지스터는 메모리 계층의 최상위에 위치한다고 한다.
C/C++언어를 작성할 때, 특히 for문 같은 문법을 사용할때는 for문의 인자를 레지스터 변수로 선언하면 연산속도를 증가시킬 수 있다.
예) register int i;
for(i=0;i 
하지만 요즘의 컴파일러들은 위와같은 register 변수 선언을 굳이 하지 않아도 코드 최적화를 통해 위와같은 변수들은 레지스터로 보내는 경향이 있다.

2) 스택 (Stack) 
스택은 LIFO (Last Input First Output)의 경향을 가지는 메모리 영역으로 영어 단어 그대로 차곡차곡 "쌓는"메모리영역이다.
데이터를 쌓기 때문에 처음 쌓인 데이터가 가장 늦게 출력된다. 
C/C++ 프로그래밍에서는 지역변수(local variable)이 저장되는 영역이고, 대부분의 함수 내에서의 변수 선언은 모두 스택에 저장된다고 보면 된다. 또한 함수 호출이 완료되면 데이터도 사라진다. 따라서, 스택에서 선언되는 변수는 메모리 관리에 대해 신경쓸 필요가 없다. 호출이 완료되면 저절로 사라지기 때문에 메모리에 남아있지 않는다.

3) 힙(Heap) 
힙은 전적으로 프로그래머가 관리하는 메모리 영역이다. 이 영역의 의미는 다음과 같이 생각할수 있다.
스택의 경우, 앞서 지역변수가 저장되는 영역이라고 했다. 따라서, 함수가 호출되는 경우 컴파일러는 함수 안에 선언되어있는 지역변수들의 자료형을 훑어본 후, 이 함수가 실행되기 위해 필요한 스택의 메모리 양을 찾아낸다. 이때 중요한 것이 컴파일러는 스택 메모리 양을 계산할때 선언된 지역변수의 초기값에는 관심이 없다 . 즉, 초기값과는 상관없이 몇 바이트의 자료형이 선언되어있는지만 확인한다. 그래야 스택 메모리 양을 계산할 수 있기떄문이다. 그렇다면, 스택 메모리를 쓸때 한가지 불편한 점이 있다.

사용자가 때에 따라 유동적으로 메모리를 할당해주고 싶을때 스택 영역을 사용하기 쉽지 않다. 

즉, 메모리 할당을 변수를 사용하여 프로그래머가 유동적으로 하고 싶을때는 스택 영역의 메모리를 사용하기 어렵다. 이를 어려운 말로는 "컴파일-타임"이 아니라 "런-타임"에 메모리 할당을 한다고 한다. 즉, 프로그램이 실제로 실행할때 유동적으로 메모리 할당이 이루어진다는 뜻이다. 이때 바로 힙이 사용된다. 그리고, 힙에 메모리를 할당하는 것을 동적할당이라고 한다.
동적할당을 할때는 C의 경우는 malloc, calloc 명령어가, C++인 경우는 new 명령어가 사용된다. 또한 동적할당시 중요한 점이 할당된 메모리는 반드시 해제되어야 한다는 점이다. 이때 C에서는 free, C++에서는 delete 명령어가 사용된다.

4) 데이터 영역 
데이터 영역은 전역변수(Global variable)나 static 변수가 저장되는 메모리 영역이다. 이 영역에 할당된 메모리는 프로그램 자체가 완전히 종료되어야 삭제된다. 따라서, 프로그램 실행 내내 접근되거나 update 되어야 하는 변수들은 데이터 영역에 할당하면 된다.


출처 : http://pelleas.tistory.com/entry/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B3%B5%EA%B0%84%EC%9D%98-%EC%9D%B4%ED%95%B4

반응형
Posted by blueasa
, |

HLSL 내장함수

Programming/Shader / 2012. 6. 25. 00:49

※ 모든 함수들에 있어서 인자값이 벡터일 경우에 각 원소별 연산임을 유의

1. 삼각 함수

sin(x), cos(x), tan(x) : 기본삼각함수

asin(x), acos(x), atan(x) : 역삼각함수

atan2(y,x) : atan(y/x)에 해당하는 함수로, 
    atan(x)는 [-π/2, π/2]의 범위의 값을 가지지만, atan2(y,x)는  [-π, π]의 값을 리턴한다.
    atan2(y,x)는 x≠0 이면 항상 올바른 값을 계산핤 수 있으므로 더 선호한다.

sinh(x), cosh(x), tanh(x) : 쌍곡 삼각함수

sincos(x,s,c) : sin(x)와 cos(x)를 동시에 s, c로 리턴한다. 여기서 s, c는 x와 동일한 차원의 타입이어야 한다.

degrees(x) : 라디안 단위의 x값에 해당하는 각도값을 리턴한다.

radians(x) : 각도 단위의 x값에 해당하는 라디안값을 리턴한다.


2. 수학 함수

sqrt(x) : 제곱근

rsqrt(x) 
: 제곱근의 역수

exp(x), exp2(x), pow(x, y) : e^x, 2^x, x^y

ldexp(x) : x * 2^y

log(x), log10(x), log2(x) : loge(x), log10(x), log2(x)
→ 모든 로그함수의 인자값 x는 양수값으로 지정해야 한다. 
    x가 음수이면 함수값이 정의되지 않고, x=0이면 -무한대를 리턴한다.


3. 값 변환 함수

abs(x)
 : 절대값

sign(x) : 부호에 따라 음수이면 -1, 0이면 0, 양수이면 1을 리턴

ceil(x) : 올림한 정수를 리턴
floor(x) : 내림한 정수를 리턴
round(x) : 반올림한 정수를 리턴
→ 리턴하는 정수값의 타입은 모드 float 타입이다.

max(x,y), min(x,y) : 최대, 최소값

clamp(x, min, max) : x를 [min, max] 범위로 클램프한다.
    즉, x가 범위안에 있으면 x를 그대로 리턴하지만, min보다 작으면 min을, max보다 크면 max를 리턴한다.

saturate(x) : x를 [0, 1] 범위로 클램프한다.

lerp(x,y,s) : 선형보간인 x + s(y - x) 를 리턴한다. x, y, s는 모두 동일한 타입으로 지정.

step(x,y) : x≤y 이면 1을 리턴하고, 그렇지 않으면 0을 리턴한다.

smoothstep(min,max,x) : x가 [min, max] 사이의 값인 경우에 대해서 [0, 1] 사이에서 부드럽게 변하는 
    Hermite 보간법을 리턴한다. x가 min보다 작다면 0을 리턴하고, max보다 크다면 1을 리턴한다.

asfloat(x) : 입력인자값을 float 타입으로 바꾼다.
asint(x) : 입력인자값을 int 타입으로 바꾼다.
asuint(x) : 입력인자값을 uint 타입으로 바꾼다.

fmod(x,y) : x/y의 나머지를 실수로 리턴한다.

frac(x) : x의 소수점 이하 부분을 리턴한다.

frexp(x,e) : 주어진 실수 x의 표현에서의 소수점 이하값인 가수부분과 지수부분을 동시에 리턴한다.
    가수부분을 e로 리턴하고, 지수부분을 함수리턴값으로 리턴한다.

modf(x,i) : x의 정수부분을 i로 리턴하고, 소수점 이하부분을 함수리턴값으로 리턴한다.


4. 테스트 함수

a11(x) : 인자값의 모든 원소들이 0이 아닌지를 검사한다. 모두 0이 아니면 bool타입의 true값을 리턴한다.

any(x) : x의 원소중에 0이 아닌 원소가 하나라도 있으면 true값을 리턴한다.

isfinite(x) : 인자값이 무한대가 아닌 유한한 값이면 true를 리턴한다.

isinf(x) : 무한대 값(±INF)이면 true를 리턴한다.

isnan(x) : NAN(Not a Number)이면 true를 리턴한다.


5. 벡터 함수

cross(x,y) : 두 벡터의 외적을 계산한다. 두 인자값과 리턴값은 모두 float3 타입이다.

dot(x,y) : 두 벡터의 내적을 계산한다. 
distance(x,y) : 두 벡터의 거리를 계산한다.
length(x) : 벡터의 길이를 계산한다.
→ 이들은 모두 하나의 float를 리턴한다.

normalize(x) : 정규화된 벡터를 리턴한다. 즉, 리턴값은 x/length(x) 와 동일하다.

determinant(m) : 행렬식을 리턴한다. 입력인자는 정방행렬이어야 한다.

transpose(m) : 전치행렬을 리턴한다.

mul(x,y) : 두 행렬의 곱을 계산한다.


6. 기타 함수

ddx(x), ddy(x) : 스크린공간의 x, y 좌표에 대한 x, y의 편미분을 리턴한다.
fwidth(x) : abs( ddx(x) ) + abs( ddy(x) ) 를 리턴한다.
clip(x) : x의 한 원소가 0보다 작으면 현재 픽셀을 버린다. 
→ 이 함수들을 픽셀셰이더에서만 사용할 수 있다.

↓ 고급기법에서 사용되는 함수
faceforward(n, i, ng) : 관찰자를 향하는 표면 노말을 리턴한다.
reflect(i, n) : 반사벡터를 리턴한다.
refract(i, n, R) : 굴절벡터를 리턴한다.
lit(n·l, n·h, m) : 조명계수 벡터를 리턴한다.
noise(x) : 연기나 화재효과에 사용되는 Perlin 노이즈값을 리턴한다.



[출처] HLSL 내장함수|작성자 왕꿈틀이

반응형

'Programming > Shader' 카테고리의 다른 글

[링크] 붕괴3 방식의 카툰렌더링 구현하기  (0) 2019.05.20
쉐이더(Shader) 2.0 3.0 차이  (0) 2012.06.25
Posted by blueasa
, |

2.0과 3.0의 차이점.

1. 유연한 입출력 선언.

세이더 프로그램에 대한 입력의 수가 지원되는 입력 레지스터의 수를 초과하더라도,
여러 입력들을 한 레지스터에 함께 넣을 수 있다.

2. 조건자의 제공.
동적인 쓰기 마스킹이 가능한 4개의 불린 플래그들의 묶음으로 이루어진 레지스터.
이 레지스터를 이용하여 보통 4개의 채널별로 일어나는 세이더 연산이 적용될 것인지 아닌지를 정한다.

3. 정적, 동적 조건 분기
정적 조건 제어는 분기별 서로 다른 코드들을 한 세이더 안에 넣을 수 있게 하여 세이더 상태가
변하는 횟수를 줄일 수 있게 해 주며 정적루프는 고정된 회수의 루프를 사용할 경우에 유용하다.
2.0과 3.0의 차이점은 2.0에서는 정적 조건분기가 중첩문을 사용할 수 없다는 것이다.
3.0은 4단계의 중첩이 되는 정적조건 분기를 지원하며 동적 조건분기를 지원한다.
동적조건 분기는 세이더 프로그램 내의 결과값에 의해 수정된 레지스터 값을 비교하여 다른 코드를 수행하는 것이다.

4. 임의의 스위즐
2.0은 vs만 지원하고 ps에서는 지원하지 않지만 3.0은 둘 다 지원한다.

5. 텍스쳐 명령어 상의 쓰기 금지 마스크
3.0 에서는 이 기능을 이용하여 선택된 색상채널만 destination 레지스터에 텍스쳐 샘플링 결과로 업데이트할 수 있다. 
이것을 이용하여 텍스쳐 명령어를 수행하는 도중에 쓰기 금지된 성분을 보호 할 수 있다.

vs3.0의 기능

1. 레지스터
vs2.0에서는 12개의 레지스터가 있지만 vs3.0에서는 32개의 레지스터가 있다.

2. 명령어
vs2.0은 256개의 명령어를 지원하지만 vs3.0은 512개의 명령어를 지원한다.

3. 텍스쳐 샘플링
2.0에도 정점 세이더 유닛에 기본적인 텍스쳐 샘플러 기능이 있지만 기능이 제한적.
3.0에서는 정점 텍스쳐링을 완벽히 지원하기 떄문에 정점 세이더에서도 픽셀 세이더와 같은 수준의
기능과 유연함을 가지고 텍스쳐를 참조할 수 있다.

4. 정점 스트림 빈도
같은 입력데이터를 한번 이상 사용할 수 있도록 정점 데이터를 서로 다른 비율로 가져올 수 있다.

ps3.0의 기능

1. 레지스터
32개의 임시레지스터와 256개의 상수레지스터를 지원한다.

2. 명령어
ps2.0에서 96개의 명령어를 지원하는 것에 반해 ps3.0에서는 512개의 명령어를 지원한다.

3. 무제한의 텍스쳐 샘플과 의존적 읽기
ps3.0에서는 모든 텍스쳐 읽기 제한이 완벽하게 없어졌다.




출처 : http://blog.naver.com/jungbostyle/130116978009

반응형

'Programming > Shader' 카테고리의 다른 글

[링크] 붕괴3 방식의 카툰렌더링 구현하기  (0) 2019.05.20
HLSL 내장함수  (0) 2012.06.25
Posted by blueasa
, |

Invoke 를 써서 델리게이트를 간단히 하는 방법이 있다고 한다.

1곳에서만 메인쓰레드의 권한이 필요할경우, 이 방법을 쓰면 좋다고 한다.

만약 그렇지 않다면, 쓰는데마다 저렇게 선언을 해줘야한다고 한다.

 참고 해보길 바란다.

 

이 포스트를 보고있는 여러분들은, 모두 닷넷 프로그래밍에 관심이 있으시고,

현재도 개발툴로 사용중인 분이실 것이다. 쓰레드기반 프로그래밍을 할때(.Net)에서

폼(엄밀히 말하면 윈도우)의 Child컨트롤(요곳도 윈도우)들의 멤버변수들을 조작

하기 위해서는, 메인쓰레드의 권한이 필요하다. 따라서, 메인쓰레드의 권한이 필요

할경우, this.Invoke() 메서드를 쓰게되는데, 이때 이 메서드를 쓰면, 별별놈의

Delegate를 선언해줘야 하고, 또 선언한 델리게이트의 인스턴스를 할당해, 사용

해야해서 코드가 매우 더러워지는것을 느꼈을것이다.

 

예전에 아는 동생녀석의 C#코드를 보고있던 중. this.Invoke()를 아주 이쁘게

잘 써놓은 것을 발견했다. 물론 그놈은.. 예전부터 프로그래밍을 해왔던지라,

모르는 언어도 없고, 시스템 프로그래밍을 가지고 노는애였다.(__)

아무튼 내가 닷넷프로그래밍을 처음배울때, 그놈에게 C#.Net으로된 채팅서버

및 클라이언트 프로그램의 소스를 봐서, Invoke()메서드를 이쁘게 잘쓰는방법을

우연히 터득하게 되었다. 보통의 사람들이라면 Delegate 선언, 인스턴스할당,

Delegate변수명명 까지의 귀찮은 일을 모두 하겠지만, 이 포스트를 봤다면,

이제부터 그렇게 하지말자^^;

 

일단 사용하는 방법은 아주 간단하다. 그냥 this.Invoke()메서드 인자부분에

new MethodInvoker( delegate() { 코드 })를 써주면 끝이다. 이렇게 처리하게

되면, 저런 귀찮은 방법을 사용하지 않고, 그냥 저기안에 코드만 쓰면된다^^;

물론 저렇게 일자로 쓰면, 안이쁘겠지만, 적절히 엔터누질러주시면,

엄청 이쁜코드가 된다. ^^; 동생녀석이 썼던 코드를 보여주겠다.

 

             this.Invoke(new MethodInvoker(
                 delegate()
                 {
                     strCurTime = string.Format("{0:D2}:{1:D2}:{2:D2}", DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);
                     string[] strData = new string[3];
                     strData[0] = lstLog.Items.Count.ToString();
                     strData[1] = strCurTime;
                     strData[2] = strTLog;
                     lstLog.Items.Add(new ListViewItem(strData));
                 }
                 )
            );

 

이렇게쓰면, 아주이쁘게 써진다, 또한, Form의 전역공간에 델리게이트를 선언할

필요도 없어져서, 전체적으로 코드가 안정적으로 보인다^^;

저 코드는, 채팅서버에서 로그를 추가하는 델리게이트를 기술하는 것이다^^;

물론 이방법은, 이런 델리게이트가 필요한 곳이 1곳일때만 쓰는것을 추천한다.

만약 그렇지 않다면, 쓰는데마다 저렇게 선언을 해줘야한다.(__)

하지만, 1곳에서만 메인쓰레드의 권한이 필요할경우, 저렇게 하는것이

더 바람직하고, 이쁘다^^;



출처 : http://xmlangel2.blogspot.kr/2009/05/c-%EC%9C%88%ED%8F%BC%EA%B8%B0%EB%B0%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%84-%ED%95%A0%EB%95%8C-invoke-%EC%9D%B4%EC%81%98%EA%B2%8C%EC%93%B0%EA%B8%B0.html

반응형
Posted by blueasa
, |