2010년 5월 4일 화요일

Determining OpenGL ES Capabilities

OpenGL ES 능력 결정하기

iPhone OS의 OpenGL ES 는 고정 함수 그래픽스 파이프라인을 수행하는 OpenGL ES 1.1 과 쉐이더 파이프라인을 수행하는 OpenGL ES 2.0 을 모두 지원한다. OpenGL ES 2.0 은 OpenGL ES 1.1 의 슈퍼셋이 아니다; OpenGL ES 의 고정함수 능력들은 그래픽스 하드웨어의 최신 인터페이스의 지원에서 제거 되었다.

OpenGL ES 1.1과 OpenGL ES 2.0 모두 반드시 지원해야 하는 모든 임플리먼테이션에 해당하는 최소한의 능력을 정의한다. 하지만, OpenGL ES 명세서는 능력들에 관해서는 하드웨어 임플리먼테이션에 제한을 하지 않는다. OpenGL ES 임플리먼테이션은 최소한의 능력(예를들어, 텍스쳐의 최대 사이즈 증가라던가..)이나 OpenGL ES 확장 메커니즘으로 인한 OpenGL ES의 확장된 능력들도 확장할 수 있다. 애플은 다른 iPhone 모델들 상에서 다양한 능력들을 제공하는데에 두 메커니즘들을 사용한다. 다음 장인, "Platform Notes," 에서 이 능력들에 대해 자세히 알아보도록 한다. 하지만, 애플에서 OpenGL ES 의 다른 버전을 제공하여 같은 버전에서도 다른 능력들을 보이기 때문에, 당신의 어플리케이션은 반드시 이 능력에 맞는 동작을 하도록 디바이스의 능력을 테스트 하고 조절해야 한다. 만약에 당신의 어플리케이션이 런타임에 OpenGL ES 의 능력 테스트에 실패한다면, 실행할때 충돌 또는 실패할 것이며, 사용자에게 좋지 못한 경험을 제공하는 것이 된다.


어떤 버전을 타겟으로 삼아야 할까?
OpenGL ES 어플리케이션을 설계할 때, 당신이 반드시 대답해야 할 첫번째 질문은 당신의 어플리케이션이 OpenGL ES 1.1 과 2.0을 모두 지원해야 하는가 이다.

OpenGL ES 1.1 의 고정함수 파이프라인은 3D 그래픽스 파이프라인을 위한 동작에 버텍스 변형 및 라이팅 부터 프레임 버퍼와 함께 마지막 픽셀들을 블렌딩 하는 것 까지 좋은 기준치를 제공한다. 만약 당신이 OpenGL Es 2.0 애플리케이션을 구현하는 것을 선택한다면, 이런 기능을 중복할 필요가 있다. OpenGL ES 2.0은 OpenGL ES 1.1 보다 좀더 융통성 있다. OpenGL ES 2.0 쉐이더에서 쉽게 구현할 수 있는 커스텀 버텍스와 프래그먼트 연산들도 OpenGL ES 1.1 을 사용하려면 어렵거나 불가능하다. OpenGL ES 1.1 어플리케이션에서의 커스텀 연산의 구현은 종종 다중 렌더링 과정이나 OpenGL ES 상태에 복잡한 변경을 요구하는데, 이것은 코드에 의존적이며, 이해하기 어렵다.  당신의 알고리즘이 복잡해질수록, 쉐이더는 이 연산들을 보다 명료하고 간결하게 그리고 보다 나은 퍼포먼스로 전달한다.

OpenGL ES 렌더링 컨텍스트 생성
iPhone OS 에서 당신의 애플리케이션은 EAGLContext 오브젝트로 알려져 있는 OpenGL ES 렌더링 컨텍스트를 초기화 할 때, 어떤 버전의 OpenGL ES 를 사용할 것인지 결정한다.  당신의 어플리케이션은 각 컨텍스트가 사용하는 OpenGL ES의 버전을 결정한다.  예를 들어, OpenGL ES 1.1 을 사용하는 컨텍스트를 생성하려면, 당신의 애플리케이션은 다음과 같이 초기화 한다.
 EAGLContext* myContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];

만약 OpenGL ES 2.0을 사용하길 원한다면, 다음과 같이 초기화 한다.
EAGLContext* myContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

만약 각 OpenGL ES 의 구현이 가능하지 않다면, initWithAPI:는 nil을 리턴한다.  당신의 어플리케이션은 반드시 사용하기 전에 컨텍스트가 성공적으로 초기화 되었는지 테스트 해 보아야 한다.

OpenGL ES 2.0과 OpenGL ES 1.1 이 같은 어플리케이션에서 모두 지원되도록 하려면, 코드 2-1에 보여지는 바와 같이 당신의 어플리케이션에서는 첫번째로 OpenGL ES 2.0 렌더링 컨텍스트를 생성하는것을 시도해야 한다. 만약 이것이 실패한다면, 대신에 OpenGL ES 1.1 컨텍스트를 생성하는것을 시도한다.

[코드 2-1] 같은 어플리케이션에서 OpenGL ES 1.1 과 OpenGL 2.0 지원하기
EAGLContext* CreateBestEAGLContext(){
    EAGLContext *context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    if(context == nil)
    {
         context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
    }
    return context;
}

당신의 어플리케이션이 컨텍스트를 초기화했을 때, 이것은 OpenGL ES 의 어떤 버전을 지원할지 결정하는 컨텍스트의 API 속성을 읽을 수 있다.  예를 들어, 당신의 어플리케이션이 고정함수 렌더러와 쉐이더 렌더러를 클래스에서 구현하여, 일반적인 기본 클래스와 공유한다고 하면, 당신의 어플리케이션은 런타임에 적절한 렌더러를 사용할 것이다.

중요 : OpenGL ES 2.0 은 OpenGL ES 1.1 에 있는 많은 함수들을 제거 하였고 OpenGL ES 1.1 에서 사용할 수 없는 함수들을 추가하였다.  만약 당신의 어플리케이션이 OpenGL ES 1.1 컨텍스트에서 OpenGL ES 2.0 함수의 호출을 시도한다면(또는 반대로), 결과는 undefined 가 될 것이다.  두개의 렌더링 패스간에 약간의 코드 콩유가 가능한 동안은, 당신은 OpenGL ES 의 두 버전을 식별하는 작업을 호출하는데 공유를 제한해야 한다.


OpenGL ES 의 각 버전으로 당신의 어플리케이션을 제한하기





원문

댓글 없음:

댓글 쓰기

내 블로그 목록

관심 사용자