Thursday, September 20, 2012

iOS OpenGL ES1.0에서 ES2.0으로 갈아타기

ES1.0은 Fixed pipeline을 사용하고 ES2.0은 쉐이더를 사용한다. 그렇기 때문에 기존에 사용하던 OpenGL 일부 기능들을 사용할 수 없다.

가령 glShadeMode와 glPushMatrix, glPopMatrix와 같은 것들은 함수를 콜할 경우 unimplement에러를 얻거나 혹은 컴파일 자체가 되지 않는다.

내가 제작한 DeadEngine을 ES2.0으로 옮기면서 해결했던 문제들을 나열해 보고자 한다.

1. glPushMatrix, glPopMatrix와 같은 매트릭스 스택 개념이 사라졌기 때문에 직접 구현해서 사용해야 한다. 나는 간단하게 DePushMatrix, DePopMatrix와 같이 함수를 제작하고 내부 자료구조는 STL stack을 사용해서 간단하게 구현했다. 구현은 다음과 같다.


void KRendering::DePushMatrix()
{
    IvMatrix44* mat = new IvMatrix44();
    
    // copy it.
    *mat = *mMatStack.top();
    
    mMatStack.push(mat);
}

void KRendering::DePopMatrix()
{
    IvMatrix44* tm = mMatStack.top();
    delete tm;
    mMatStack.pop();
}

2. glColor와 같은 기능도 사용할 수 없다. 쉐이더에 직접 넘겨 주어야 한다.

3. PC에서 OpenGL을 사용할 때 in이라는 keyword를 사용할 수 없고 attribute를 사용해야 한다. out역시 uniform을 사용해야 한다. 간단한 구현 사항은 다음과 같다.

attribute vec2 VertexPosition;
attribute vec2 TexCoordIn;
varying vec2 TexCoordOut;
uniform mat4 Projection;
void main() 
{
    gl_Position = Projection * vec4(VertexPosition.x, VertexPosition.y, 0, 1);
    TexCoordOut = TexCoordIn;
}

2D 부분이라 vec2로 사용하고 in 키워드가 아닌 attribute, out이 아닌 uniform을 사용했다.

4. vertex array object, vertex buffer object를 사용한다.
기존 고정 파이프라인을 사용하다가 쉐이더를 사용하면 이게 헷갈리기 쉽상인데 잘 정리된 문서가 이미 두 개나 존재한다. (한개도 아닌 두 개다!)

http://www.opengl.org/wiki/Vertex_Specification_Best_Practices
http://www.raywenderlich.com/3664/opengl-es-2-0-for-iphone-tutorial




Tuesday, September 18, 2012

xcode에서 전처리기로 프로그래머 골탕 먹이기

xcode에서 preprocessor를 설정할 때 다음과 같이

DE_IPHONE\n-

과 같이 작성하면 (DE_IPHONE은 다른것이 되어도 무방함) 컴파일할 때 쌩뚱 맞은 버그를 발견하게 된다. 게다가 xcode 툴만 사용하면 겉으로 보이기에는 아무런 문제가 없어 보이는데 그 이유는 preprocessor를 보여줄 때 \n 때문에 그 뒷 부분(다른 선언 부분)이 화면에 전혀 보이지 않기 때문이다.

올바른 전처리는 DE_IPHONE으로 설정해야만 하며 그렇게 해야 그 다음에 선언된 것이 제대로 처리 된다.

OpenGL ES2로 갈아타야 하나...

DeadEngine의 경우 OpenGL ES1을 사용하고 있었는데 다른 라이브러리와 연동하는걸 하려고 하니까 ES2 없이는 돌릴 수가 없다. 결국 내 엔진을 ES2로 바꾸어야 하는데 지금 거의 마무리 하고 있던 프로젝트를 바꿀 순 없을거 같다. 일단 스케쥴대로 현재 만들고 있는 것은 ES1으로 돌리고 이후에 엔진을 업그레이드 해야겠다.

ES1에서 ES2로 옮길 때 작업 상황을 블로그에 남겨보아야 겠다.

Monday, September 17, 2012

스타크래프트 인공지능

http://code.google.com/p/bwapi/wiki/UsingBWAPI

이 API를 이용해서 Custom AI를 만들어 볼 수 있다.
예전에 Paul이 알려줬던 내용인데 이제서야 보게됐다...
내가 생각했던 AI기술들을 이용해서 AI를 개발하는것도 재밌을 것 같다.


Monday, September 10, 2012

OpenGL es 16 bits 스크린 캡쳐하기 (iOS)


short* buffer = (short*)malloc(myDataLength);
glReadPixels(startx, starty, width, height, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, buffer);
    
int* buffer2 = (int*)malloc(width * height * 4);
    
int table5[] = { 0, 8, 16, 25, 33, 41, 4958, 66, 74, 82, 90, 99, 107, 115, 123, 132, 140, 148, 156, 165, 173, 181, 189197, 206, 214, 222, 230, 239, 247, 255 };

int table6[] = { 0, 4, 8, 12, 16, 20, 2428, 32, 36, 40, 45, 49, 53, 57, 61, 65, 69, 73, 77, 81, 85, 89, 93, 97, 101105, 109, 113, 117, 121, 125, 130, 134, 138, 142, 146, 150, 154, 158, 162, 166170, 174, 178, 182, 186, 190, 194, 198, 202, 206, 210, 215, 219, 223, 227, 231235, 239, 243, 247, 251, 255 };
    
for ( int y = 0; y < height; ++y )
{
    for ( int x = 0; x < width; ++x )
    {
        int b8 = table5[buffer[y * width + x] & 0x001F];
        int g8 = table6[(buffer[y * width + x] & 0x07E0) >> 5];
        int r8 = table5[(buffer[y * width + x] & 0xF800) >> 11];
            
        buffer2[((height-1) - y) * width + x] = b8 << 16 | g8 << 8 | r8;
    }
}

buffer에는 RGB형태로 들어오고 buffer2에 넣어줄 때는 BGR형태로 넣어 주어야 한다. Alpha는 그냥 0으로 셋팅하게 되어 있다.

Wednesday, September 5, 2012

오... 슈퍼스타K에 연규성씨 나오는군요!

좋아하던 사람이었는데 성대에 문제가 있었군요;;
아무튼 저도 음악을 사랑하는 30대로써 응원합니다. :)
화이팅!~

아래에 있는 Pro git이라는 책의 번역본도 있다!

https://github.com/dogfeet/progit

읽다가 보니... 이미 번역이 되어 있었다; 한글 버전도 있으니 읽어 보시길 :)

Tuesday, September 4, 2012

git 브랜치(branch)에 대한 설명

http://git-scm.com/book/en/Git-Branching-What-a-Branch-Is

정말 잘 설명해 놓았다. 하지만 이 링크를 읽기 전에 최소한 1챕터는 완독해 주어야 제대로 이해 가능하다.

우선 1챕터에서 git이 다른 버전 컨트롤데이터를 다루는 면에 있어서 어떤 차이점이 있는지 알아야 한다. 그리고 요약해보면...

각각의 스냅샷 마다 트리의 노드고 최신 노드를 브랜치가 포인팅 하고 있다.




현재 작업하고 있는 브랜치를 변경하면 HEAD는 그림과 같이 master가 아닌 new branch가 되며 이때 새로운 snapshot 하나를 만들면 그림과 같이 new snapshot 3-1이 생긴다.
만일 이렇게 작업을 하다가 다시 master 브랜치로 옮겨오면 현재 master 브랜치가 포인팅하고 있는 노드는 Snapshot 3이기 때문에 working directory에서 작업하던 파일들은 이전 소스로 바뀐다.


Git 설명을 가장 잘한 책(블로그)

http://git-scm.com/book

기존의 소스컨트롤(perforce)을 쓰다가 git을 사용할 때 다른 점을 잘 설명해 놓았다.
1장만 읽어도 크게 도움이 될 듯.


(모음집) xcode에서 architecture setting하기

armv6와 armv7이 있는데 이 두개는 차이점이 존재한다.
기존에 ipod 3rd에는 armv6를 사용하였고 double precision에
성능이 좋지 못하였다. ios 5.0 즉, iphone 4가 나오면서 armv7을 사용할 수 있는데 더 좋고 빠른 명령어를 탑재하고 있어 프로그램이 이 명령어들을 사용할 경우 더 빠르게 수행된다.

추가 정보
ios5.0기반으로 app을 돌릴 때 반드시 armv7으로 셋팅해야 한다. apple에서 강제적으로 사용하게 한다.

(모음집) NSObjectCRuntime.h에서 오류가 나올 때

NSObjectCRuntime.h에서 오류가 나올 때 십중팔구 cpp파일의 속성을 objective c++로 설정하지 않아서 생기는 문제이다.

끝.

(모음집) png를 iOS에서 사용할 때 주의할 점

이 글은 제가 예전에 메모해놓았던 글을 그대로 옮겨 적은글 입니다. 혹 다른 분들에게 도움이 될까 싶어서요. 개인적으로 작성했던글이라 반말입니다.

--
libpng가 PC에서는 돌아가고 iPhone에서 돌아가지 않는 현상이 있었는 데 그 이유는 iPhone에 png를 넣어줄 때 컨버팅이 되기 때문이다.

Apple의 png는 BGRA로 저장된다.

Apple에서 png의 chunk type은 CgBI로 된다. IHDR이 아니라.

해결 방법.
1. png의 확장자를 바꾸기
2. user define옵션으로 컨버팅 옵션을 끈다.
IPHONEOPTIMIZATIONS = -skip-PNGs

끝.

Task in UnrealEngine

 https://www.youtube.com/watch?v=1lBadANnJaw