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

카테고리

분류 전체보기 (2794)
Unity3D (852)
Programming (478)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (11)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
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

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


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


■ 데이터 영역(Data Area)

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

■ 스택 영역(Stack Area)

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

■ 힙 영역(Heap Area)

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

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


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

반응형
Posted by blueasa
, |

필리핀 슬럼가에는 집안에 햇빛이 들지 않아서 대낮에도 어두운 집이 많다. 그렇지만, 이런 가난한 집안에서 전기를 끌어다 쓴다는 것은 커다란 사치이다. 이런 슬럼가에 한 줄기 빛을 전기도 없이 밝힐 수 있는 혁신적인 프로젝트가 소개되어 화제다. 

흔히 구할 수 있는 플라스틱 병에 물과 표백제를 약간 넣고, 지붕에 작은 구멍을 뚫어서 꽂으면 햇빛을 산란시켜서 집안 전체를 마치 형광등을 켠 것처럼 밝혀주게 된다. 55~60와트 백열등에 해당하는 밝기의 빛을 1년에 10개월 가까이 공급할 수 있는 것이다. 이 프로젝트는 Illac Diaz 라는 생태 운동가에 의해 진행이 되었다. 

이 기술의 최초 아이디어는 MIT의 학생에 의해서 제시되었다고 한다. 이렇게 제작된 물병등(?)은 5년 정도는 지속되는데, 첨가된 표백제가 이끼 등이 자라는 것을 막아주기 때문에 그 동안은 집안에 안정적으로 빛을 공급할 수 있다. 비록 밤에는 동작하지 않는다고 하더라도, 낮 동안 사용되는 이 물병등에 의해 저소득 층의 전기 사용량을 크게 줄일 수 있다. 

이 프로젝트는 지방정부와 여러 NGO 등과 함께 마닐라시와 주변의 라구나 지방에 10,000개가 넘게 설치가 되었으며, 일반 주택에서도 전기를 절약한다는 측면에서 설치하는 곳들도 많이 늘어나고 있다. 아주 첨단의 하이테크 기술이 아니더라도 얼마든지 많은 사람들의 생활을 증진시키고, 필요하지 않은 에너지를 절약할 수 있는 좋은 선례라고 할 수 있다.



출처 : http://www.journalogplus.net/economy/go/4146

반응형
Posted by blueasa
, |
반응형

'Memories' 카테고리의 다른 글

[M/V] 이선희 정규 15집 앨범 세렌디피티(Serendipity) - 그중에 그대를 만나  (0) 2014.03.27
자귀 나무  (0) 2013.05.24
[MUD] 마계지문 재오픈  (11) 2012.06.09
노이즈 - 착각  (0) 2012.06.04
고메~ 빼때기죽~  (1) 2012.01.25
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
, |

피셔맨 매듭법

Etc / 2012. 6. 19. 01:47



위기탈출 넘버원에서 불 났을때 탈출하는 매듭법의 정답이었던 매듭방법인데요!!
꼭 알아두어야 할 매듭방법인거 같아서요 ㅎㅎ
이 매듭법으로 줄만들고 실험해 봤는 데 장정 8명 무리를 간단히 견디더라구요!!!
방송 정리해 놓은 곳 경로 : http://danbis.net/8753


반응형
Posted by blueasa
, |

일본 웹을 돌아다니다 발견했는데 싸이트 링크를 까먹었습니다. 
 다운 받은거 올려봅니다. 필요하신분들 다운 받아서 만들어보세요. 

 (해당 싸이트에서도 무료로 그냥 누구나 다운 받을 수 있다고 했었는데..
  프린트하면 싸이트 주소가 나오는데 ... 폰트가 이상한지 잘못알아보겠더라구요..)

 한 5분이면 손쉽게 만들수 있답니다. 







goukakutolo.pdf


ricky.pdf


shocktolo.pdf


tolonaki.pdf


tolowarai.pdf



출처 : http://ang514.tistory.com/292

반응형

'PaperCraft' 카테고리의 다른 글

[완료] RX-78 NT-1 ALEX(ver.인형사)  (0) 2013.06.02
[지름] GUNDAM 'RX-78 NT-1 ALEX' PaperCraft 도안  (0) 2013.03.27
하츄네 미쿠  (0) 2013.03.10
토로(Toro)  (0) 2013.03.10
Posted by blueasa
, |