PSP-2005 지름

오늘 여자친구님과 데이트가 있어, 잠시 시간도 때울겸해서 몇일전부터 사기로 마음먹은 신형 PSP-2005를 사기 위해 여자친구님이 근무하는 양재역에서 가까운 국제전자상가에 들렸다. 9층에 오르니 온통 게임관련 매장인데, 자리란 자리는 모두 앉어서 끼리끼리 게임에 열중하는 모습이 눈에 띠었다. 인터넷상에서는 품절된 상태인지라 구입이 불가능하여, 매장에서 혹시 매장에서는 구입할지 모른다는 기대반 포기반였는데, 몇군데 매장에 물건이 있었다. 내가 구입한 것의 색상은 피아노-블랙인데, 손때 기름이 장난아니게 뭍는다. 완전… 아모케이스(?)가 다음주에나 나온다니, 그때 구입할때까지 기스않나게 잘써야겠다. 요놈은 좀 쓰다가 팔아야하는 관계로 조심해서 써야지.. 중고로 게임타이틀도 하나 사왔는데, 건담베틀로얄이다. 무식하게 재미없더만… 내 상상력을 불어 넣으니 조금씩 재미있어진다. 닌텐도 DS를 사지 않은게 좀 후회가 되긴하지만…. 이왕 샀으니 재밌게 가지고 놀아야겠다. 공부는 언제할래? -_-;; 아래는 내가 산 PSP-2005의 스틸샷 몇장..

역시 … 좀 깨끗이 닦고 찍을걸 그랬나…. =_=;

OpenGL Shader – 17

GLSL Samples – Hello World in GLSL
원문 : http://www.lighthouse3d.com/opengl/glsl/index.php?minimal

이 섹션은 Hello World에 대한 GLSL 판이다. 가장 기본적인 내용을 수행하는 쉐이더를 살펴볼 것이다 : 버텍스의 변환, 단일 색상으로 프리미티브 렌더링하여 화면 표시.

버텍스 쉐이더
이전 섹션중에 버텍스 쉐이더 부분에서 언급했듯이, 버텍스 쉐이더는 버텍스의 변환을 담당한다. OpenGL의 고정기능과 동일한 내용을 수행하는 버텍스의 변환을 수행하는 쉐이더를 살펴볼 것이다.

고정기능은 다음과 같이 모델뷰 행렬과 투영행렬에 의해 변환을 수행한다.

vTrans = projection * modelview * incomingVertex

GLSL에서 위의 내용을 수행하는 코드를 작성하려면 모델뷰 행렬과 투영행렬을 얻을 수 있도록 OpenGL에 접근할 필요가 있다. 이전에 언급했듯이, OpenGL의 상태 중 일부를 GLSL에서 접근할 수 있는데, 주로 언급한 투영행렬과 모델뷰행렬이다. 행렬은 이미 정의된 Uniform 변수를 통해서 제공된다.

uniform mat4 gl_ModelViewMatrix;
uniform mat4 gl_ProjectionMatrix;

하나 더 필요한 것은 입력 버텍스에 접근하는 것이다. 이런 버텍스는 하나씩 하나씩 버텍스 쉐이더에 접근되는데 Attribute 변수를 통해서 제공된다.

attribute vec4 gl_Vertex;

행렬에 의해 변환된 버텍스를 출력하기 위해서, 쉐이더는 반드시 미리 정의된 변수인 gl_Position을 사용해야 하며 gl_Position은 vec4로 선언된 변수다.

위처럼 한다면, 이제 버텍스 쉐이더를 작성하는게 가능하다. 하지만 아직은 버텍스 변환 연산만 가능하다. 주의할 것은 버텍스 변환 이외의 다른 기능은 작동하지 않는데, 예를들어 빛계산은 수행되지 않는다.

버텍스 쉐이더는 main 함수를 가져야만 한다.

void main()
{
    gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;
}

위의 코드에서, 투영행렬은 모든 버텍스에 대해서 모델뷰행렬과 곱해지는데, 이것은 분명이 시간 낭비다. 왜냐하면 투영행렬과 모델뷰행렬은 모든 버텍스에 대해서 변하지 않는다. 이 행렬들은 Uniform 변수다.

GLSL은 몇개의 파생된 행렬을 제공하는데, 바로 gl_ModelViewProjecteionMatrix로써, 투영행렬과 모델뷰행렬을 곱한 결과 매트릭스이다. 이 변수를 사용해 다시 코드를 작성하면…

void main()
{
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

위의 두 main() 함수에 대한 쉐이더의 최종 결과는 동일하다. 그런데 고정기능과 동일한 변환을 보장하는가? 음… 이론적으로 그렇다. 그러나 버텍스의 변환의 실제 절차는 여기와 달리 동일한 순서를 따르지 않는다. 이것은 보통 그래픽 카드에 매우 최적화된 작업인데, 최적화의 이점을 취하기 위해 하나의 특별한 기능이 제공된다. 이 기능의 또 다른 이유는 float 데이터 타입의 정밀도에 제약이 있기 때문이다. 계산이 다른 순서로 이뤄질때, 이 제한된 정밀도로 인해 다른 결과가 얻어진다. 그래서 GLSL은 최고의 수행속도뿐만 아니라 고정기능과 동일한 결과를 항상 얻을 수 있는 함수를 제공한다. 바로 마법과 같은 그 함수는:

vec4 ftransform(void);

이 함수는 입력받은 버텍스를 변환한 결과를 반환하며, 고정기능과 동일한 단계를 수행해 고정기능과 동일한 결과를 제공한다. 이제 쉐이더는 다음과 같이 재작성될 수 있다.

void main()
{
    gl_Position = ftransform();
}

프레그먼트 쉐이더
프레그먼트 쉐이더 역시 프레그먼트의 색상을 설정할 수 있는 미리 정의된 변수를 가지고 있다: gl_FragColor. 버텍스 쉐이더의 경우에서처럼, 프레그먼트 쉐이더 역시 main 함수를 가지고 있다. 다음 코드는 푸르스름한 색상으로 모든 프레그먼트를 그리는 프레그먼트 쉐이더 코드이다.

void main()
{
	gl_FragColor = vec4(0.4, 0.4, 0.8, 1.0);
}

위의 버텍스 쉐이더와 프레그먼트 쉐이더를 적용한 결과는 아래와 같다.

“실패에서 자유로워요”


얼마전 커피숍에서 찍은 어느 잡지의 짧은 글귀다. 고작 4개의 문장으로 구성된 이 짧은 글귀에서 필이 꼿이는 문장이 2개다. 하나는 “단순하고 좀 어리석은 내 작품이 사람들에겐 이해가 되나 봐요”와 “난 실패에서 자유로워요”라는 문장.

나는 이 문장을 동경하나보다..

글귀도 글귀지만, 사진도 필이 꼿힌다. 잡힐것을 기대하지도 않는 한 사람이 달랑 낚시대 하나만 가져와서 폼을 잡고 있는 사진. 이 사진은 사람이 있기에 필이 있는 사진이다. 이 사진에 사람이 없다면 그저 평범한 사진일뿐… DEL 키를 바로 눌러도 섭섭하지 않을 사진이다. 이 사진은 “사람이  feel..”인 사진이다..

나는 이 사진을 동경하나보다..

으읔.. 쳐다보기도 싫은 “현대통계학”


ㅎㅎ.. 벌써 한달전부터 보고 있는 책이다. 이젠 정말 보기도 싫다. 무슨 말인지도 도통 모르겠고. 그런데 어쩔수없이 보고 있는 이유는, 분명 언젠가는 반드시 통계학이라는 분야가 필요할 것이라는 추측에서이다.

또한…. 싸나이 한번 보기 시작한 책은 다 봐야하지 않냐라는 생각에서 이다. 어여 대충이라도 한번 훌터나 보자. 이거 얼릉 보고 다음엔, 유익하고 재미있는 프로그래밍 책 보고파.. ㅠ_ㅠ 어휴… 지겨워 지겨워…

아참, 신기한게.. 요 몇일전에 영풍문고엘 가서 책을 훌터보던중에.. 요 책이랑 똑 같은 책을 봤다. 걔도 4판이던데.. 내가 보는것도 4판이네.. 내가 이 책을 2002년 4월 15일날 샀는데.. 그동안 개선도 없이 그냥 막 찍어 팔기만 했구먼…. ㅡ,.ㅡ

OpenGL Shader – 16

Varying 변수
원문 : http://www.lighthouse3d.com/opengl/glsl/index.php?varying

이전에 언급했듯이, 쉐이더는 2가지가 있다 : 버텍스 쉐이더와 프레그먼트 쉐이더. 프레그먼트에 대한 값을 계산하기 위해서는, 버텍스 쉐이더에 접근할 필요가 있다. 예를들어서, 프레그먼트에 대한 빛 계산을 하려면, 해당 프레그먼트에서의 노말벡터를 얻어와야 한다. 그러나 OpenGL에서, 노말벡터는 오직 버텍스에 지정되어져 있다. Attribute 변수를 사용해서 OpenGL 어플리케이션으로부터 노말벡터를 얻어왔기 때문에 노말벡터를 버텍스 쉐이더에서 접근할 수 있지만, 프레그먼트 쉐이더에서는 접근할 수 없다.

모든 버텍스 데이터를 포함해서, 버텍스가 처리된 후에, 버텍스 정보는 연결정보를 이용할 수 있는, 파이프라인의 어떤 단계로 이동된다. 이 어떤 단계가 프리미티브가 만들어지고 계산되어지는 단계이다. 각 프레그먼트에 대해서, 자동으로 해석되어지고 프레그먼트 쉐이더에 제공되지는 변수가 있다. 예를들어 프레그먼트의 색상이 있다. 프레그먼트 쉐이더에 도착하는 색상은 프리미티브를 구성하는 버텍스의 색상 보간의 결과이다.

이 변수의 타입이 바로 “varying” 변수이다. GLSL은 미리 정의된 몇개의 varying 변수를 가지고 있는데, 위에서 언급한 색상이 한 예이다. GLSL은 varying 변수를 사용자가 정의할 수 있다. 이 변수는 버텍스 쉐이더와 프레그먼트 쉐이더 모두에서 선언되어져야한다. 아래처럼 말이다.

varying float intensity;

varying 변수는 버텍스 쉐이더에서 각 버텍스에 대한 계산값으로 설정된다. 프레그먼트 쉐이더에서 이 varying 변수(버텍스 쉐이더에서 이미 계산되어진 값들)는 단지 읽기만 할 수 있다.