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




No comments:

Post a Comment

Task in UnrealEngine

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