OpenGLES Programming Guide for iOS 번역 - 1장. iOS의 OpenGL ES

OpenGL ES/iOS 2011. 9. 20. 23:59

본 번역은 얼마든지 정확하지 않을 수 있습니다. 참고용으로만 보시길... ^^;;;

OpenGL ES provides a procedural API for submitting primitives to be rendered by a hardware accelerated graphics pipeline. Graphics commands are consumed by OpenGL to generate images that can be displayed to the user or retrieved for further processing outside of OpenGL ES.

OpenGL ES는 하드웨어 가속화된 그래픽 파이프라인에 의해 렌더링 되는 기본적인 보내기 절차적 API를 제공합니다. 그래픽 명령은 OpenGL에 따라 해석되고 사용자에게 표시하는 이미지 또는 OpenGL ES 외부에서 추가 처리를 위해 이미지가 생성됩니다.


The OpenGL ES specification defines the precise behavior for each function. Most commands in OpenGL ES perform one of the following activities:
● Reading detailed information provided by the implementation about its capabilities.
● Reading and writing state variables defined by the specification. OpenGL ES state typically represents the current configuration of the graphics pipeline. For example, OpenGL ES 1.1 uses state variables extensively to configure lights, materials, and the computations performed by the fixed-function pipeline.
● Creating, modifying or destroying OpenGL ES objects. OpenGL ES objects are not Objective-C objects; they are OpenGL ES resources manipulated through OpenGL ES’s procedural API.
● Drawing primitives. Vertices are submitted to the pipeline where they are processed, assembled into primitives and rasterized to a framebuffer.

OpenGL ES의 사양은 각 함수의 정확한 동작이 정의되어 있습니다 .OpenGL ES의 대부분의 명령은 다음 작업을 수행 합니다.
* 기능 구현이 제공하는 정보 읽기
* 사양으로 정의되는 상태 변수 읽기 및 쓰기. OpenGL ES의 상태는 일반적으로 그래픽 파이프라인의 현재 설정을 나타냅니다.
   예를 들어 OpenGL ES 1.1은 광원, 소재, 및 고정 기능 파이프라인이 실행하는 작업을 설정하기 위해 폭넓게 상태 변수를 사용합니다.
* OpenGL ES 개체 만들기, 변경 또는 삭제. OpenGL ES 개체는 OpenGL ES의 절차적 API를 통해 작업하는 OpenGL ES 자원이며, Objective-C 객체가 없습니다.
* 그리기 기본. 정점은 처리를 실시하고 기본을 조립하여 프레임 버퍼 래스터 화하는 파이프라인에 보내집니다.


When designing your OpenGL ES application, a critical question you must answer is whether your application should support OpenGL ES 2.0, OpenGL ES 1.1 or both.

● OpenGL ES 2.0 is more flexible and more powerful than OpenGL ES 1.1 and is the best choice for new applications. Custom vertex or fragment calculations can be implemented more clearly and concisely in shaders, with better performance. To perform the same calculations in OpenGL ES 1.1 often requires multiple rendering passes or complex state configurations that obscure the intent of the algorithm. As your algorithms grow in complexity, shaders convey your calculations more clearly and concisely and with better performance. OpenGL ES 2.0 requires more work up front to build your application; you need to recreate some of the infrastructure that OpenGL ES 1.1 provides by default.

● OpenGL ES 1.1 provides a standard fixed-function pipeline that provides good baseline behavior for a 3D application, from transforming and lighting vertices to blending fragments into the framebuffer. If your needs are simple, OpenGL ES 1.1 requires less coding to add OpenGL ES support to your application. Your application should target OpenGL ES 1.1 if your application needs to support all iOS devices

If you choose to implement an OpenGL ES 1.1 application primarily for compatibility with older devices, consider adding an OpenGL ES 2.0 rendering option that takes advantage of the greater power of OpenGL ES 2.0-capable graphics processors found on newer iOS devices.

Important:   If your application does not support both an OpenGL ES 1.1 and an OpenGL ES 2.0 rendering path, restrict your application to devices that support the version you selected.

타겟에 대한 OpenGL ES의 버전 선택
OpenGL ES 응용 프로그램을 설계할 때 명확하게 해 할 중요한 점은 응용프로그램에서 OpenGL ES 2.0 및 OpenGL ES 1.1 중 어느 것을 지원하거나 또는 모두 지원해야 하는 것입니다.

* OpenGL ES 2.0은 OpenGL ES 1.1 보다 유연한 기능이 풍부하고, 새로운 애플리케이션에 있어서 최선의 선택입니다. 셰이더에서는 자신의 정점 계산이나 조각 계산을 보다 명확하고 간결하게 구현할 수 있고 성능도 향상됩니다. 같은 계산을 OpenGL ES 1.1에서 실행하려면 알고리즘의 의도가 알기 어려울것 같은 멀티 렌더딩 패스와 복잡한 상황 설정이 필요한 상황이 적지 않습니다. 알고리즘이 복잡해 지면서 쉐이더 쪽이 계산을 명확하게 간결하게 표현하고 성능도 뛰어납니다. OpenGL ES 2.0은 응용프로그램을 빌드하는 데 더 많은 작업이 사전에 필요합니다. OpenGL ES 1.1이 기본적으로 제공하는 일부 인프라는 다시 작성을 해야 합니다.

* OpenGL ES 1.1은 정점 변형이나 조명에서 조각과 프레임버퍼 블렌딩에 이르기까지 3D 애플리케이션을 위한 뛰어난 기본 동작을 제공하는 표준 고정 기능 파이프라인이 포함되어 있습니다. 응용프로그램에 단순함을 요구하는 경우, OpenGL ES 1.1은 애플리케이션에 OpenGL ES 지원을 추가하기 위한 코딩이 작습니다. 만약 응용프로그램이 모든 iOS 장치를 지원해야 하는 경우 응용프로그램은 OpenGL ES 1.1을 대상으로 해야 합니다.

주로 오래된 장치와의 호환성을 확보하기 위해 OpenGL ES 1.1 응용프로그램 구현을 선택할 경우 새로운 iOS 장치에 탑재되는 OpenGL ES 2.0 기반 그래픽 프로세서의 능력을 이용하는 OpenGL ES 2.0 렌더링 옵션 추가를 검토 하십시오.

중요 : 응용프로그램이 OpenGL ES 1.1 및 OpenGL ES 2.0 렌더링을 모두 지원하지 않으면 지정된 버전을 지원하는 장치에서만 실행하도록 응용프로그램을 제한하십시오.


OpenGL ES 아키텍처의 이해

OpenGL ES는 몇 가지 주요 원칙에 따라 작동합니다. 효율적인 OpenGL ES 응용 프로그램을 설계하려면 기반 아키텍처를 이해 해야 합니다.

클라이언트 서버 모델
OpenGL ES는 그림 1-1과 같이 클라이언트 서버 모델을 사용하고 있습니다. 응용프로그램은 OpenGL ES 함수를 호출할 때 OpenGL ES와 상호 작용합니다. OpenGL 클라이언트 함수는 호출을 처리하고 필요한 경우 명령으로 변환하여 OpenGL 서버에 보내집니다. 클라이언트 서버 모델에서 클라이언트와 서버 사이에서 함수 호출을 분할하여 처리할 수 있습니다 .클라이언트, 서버 및 클아이언트와 서버간의 통신 경로의 본질은 OpenGL ES 구현에 고유한 것입니다. iOS는 작업 부하가 CPU와 전용 그래픽 프로세서 사이에 분할 됩니다.

그림 1-1그림 1-1


중요한 기능은 플랫폼 고유의 라이브러리를 사용
OpenGL ES 사양은 OpenGL ES의 동작을 정의하고 있습니다만, OpenGL ES와 호수트 운영체제 간의 상호 작용을 관리하는 함수를 정의하지 않습니다. 대신 OpenGL ES 스펙은 렌더링 컨텍스트 및 시스템 프레임 버퍼를 할당하는 함수를 제공하여 개별 구현 할 것을 요구하고 있습니다.

렌더링 컨텍스트는 OpenGL ES 상태 머신의 내부 상태가 저장됩니다. 렌더링 컨텍스트를 사용하여 각 OpenGL ES 응용프로그램은 다른 응용프로그램을 신경쓰지 않고 상태 데이터 복사본을 유지하는 것이 가능합니다. 다중 렌더링 컨텍스트를 단일 응용프로그램에서 사용할 수 있습니다.
시스템 프레임버퍼는 OpenGL ES 드로잉 명령의 대상이며, 일반적으로 호스트 운영체제의 그래픽 서브 시스템과 관련되어 있습니다. iOS에는 시스템 프레임버퍼가 없습니다. 대신 iOS는 OpenGL ES가 제공하는 프레임버퍼 개체를 확장하여 Core Animation과 데이터를 공유하는 프레임버퍼를 실현하고 있습니다.

명령은 비동기적으로 실행될 수 있다
OpenGL ES 클라이언트 서버 모델의 장점은 OpenGL ES 함수는 요청된 작업이 완료되기 전에 제어를 응용프로그램에 반환할 수 있다는 것입니다. OpenGL ES는 당신의 애플리케이션에 제어권을 반환하기 전에  많은 함수의 완료를 요구할 경우, CPU와 GPU는 lockstep에서 동작하며, 응용프로그램 병렬처리에 많은 기회손실이 있습니다. iOS에서는 드로잉 명령의 실행을 지연하는 것은 매우 일반적입니다. 일부 드로잉 명령의 실행을 지연 동시에 처리하여 그래픽 하드웨어는 부하의 큰 조각 계산을 수행하기 전에 비 표시할 표면을 삭제할 수 있습니다.

많은 OpenGL ES 함수는 그래픽 하드웨어에 대해 암시적 또는 명시적으로 명령을 flush 합니다. 다른 OpenGL 함수는 그래픽 프로세서 명령을 flush하여, 일부 또는 모든 처리되지 않은 명령이 완료될 때까지 기다립니다. 가능하면 클라이언트 및 서버 동기화를 피할수 있도록 응용프로그램을 설계해야 합니다.


명령은 순차적으로 실행
OpenGL ES는 렌더링 컨텍스트에 적용된 함수 호출의 결과를 마치 클라이언트 응용프로그램이 함수를 호출한 것과 같은 순서로 실행되도록 처리하는 것을 보증합니다. 응용프로그램이 OpenGL ES에 대한 함수 호출을 수행할 때 응용프로그램은 일부 명령의 실행 또는 완료하지 않은 경우에도 이전 함수의 결과를 사용할 수 있다고 생각할 수 있습니다.


매개 변수는 호출시에 복사된다.
명령을 비동기적으로 처리할 수 있도록하기 위해 OpenGL ES 함수는 프로그램이 호출하면 온 함수 호출을 완료하는 데 필요한 매개 변수 데이터는 제어가 응용 프로그램에 반환되기 전에 OpenGL ES 가 복사해야합니다. 응용 프로그램 메모리에 저장되는 꼭지점 데이터의 배열을 매개 변수가 가리키는 경우 OpenGL ES 는 반환되기 전에 정점 데이터를 복사해야합니다.
여기에는 두 가지 중요한 의미가 있습니다. 
하나는 OpenGL ES 및 응용 프로그램은 동일한 메모리에 동시에 액세스할 수 없으므로 응용 프로그램은 OpenGL ES 에 대해 수행 호출에 관계없이 소유 메모리를 자유롭게 변경할 수있다는 것입니다.
두번째는 그래픽 하드웨어가 데이터를 읽을 수 있도록 매개 변수를 복사하여 데이터 형식을 변경함으로써 함수 호출 각각 오버헤드가 추가된다는 것입니다.
최상의 성능을 얻기 위해 응용 프로그램은 그래픽 하드웨어에 최적화된 형식으로 응용 프로그램 데이터를 정의합니다. 그리고 버퍼 개체를 사용하여 응용 프로그램과 OpenGL ES 사이의 메모리 복사를 명시적으로 관리합니다.

사양에 정의된 기능은 구현 확장 가능
OpenGL ES 구현은 다음 두 가지 방법 중 하나로 OpenGL ES 규격을 확장하는 경우가 있습니다.
 첫번째는 텍스처 크기 또는 응용 프로그램이 액세스할 수있는 텍스처 유닛의 수와 같은 구현을 충족해야 특정 요구 사항을 사양이 정하는 방법입니다. OpenGL ES 구현은 더 큰 텍스처, 혹은 더 텍스처 유닛과 같이,보다 큰 값을 사용할 수 있습니다.
두번째는 OpenGL ES 확장 기능은 구현에서 OpenGL ES 의 새로운 함수와 상수를 제공할 수 있도록하는 방법입니다. 확장 기능은 구현에 완전히 새로운 기능을 추가할 수 있습니다.
Apple 은 많은 확장 기능을 구현하여 응용 프로그램이 하드웨어 기능을 사용할 수 있도록하고 응용 프로그램 성능 향상에 도움이되도록하고 있습니다. 실제 하드웨어 제한 및 각 구현이 제공하는 확장 기능 목록은 응용 프로그램을 실행하는 장치 또는 장치에서 실행되는 iOS 버전에 따라 다를 수 있습니다. 응용 프로그램은 런타임 기능을 확인하여 적합하도록 응용 프로그램의 동작을 변경해야합니다.

OpenGL ES 개체는 응용프로그램 대신 리소스를 캡슐화 한다.

개체는 렌더 러가 필요로하는 설정의 상태 및 데이터를 유지하기 위해 응용 프로그램에서 사용하는 융화의 컨테이너입니다. 개체에 대한 유일한 접근은 절차적 API 를 통해 때문에, OpenGL ES 의 구현에서는 응용 프로그램 개체를 할당할 때 다양한 전략을 선택할 수 있습니다. 응용 프로그램은 그래픽 프로세서에 적합한 형식으로 또는 그래픽 프로세서에 적합한 메모리 영역에 데이터를 저장할 수 있습니다. 객체 또 1 개의 장점은 재사용이다, 그것은 어플 리케이션은 한 번 설정한 개체를 여러 번 사용하는 것이 가능합니다.

가장 중요한 OpenGL ES 객체 유형은 다음과 같습니다.

● 질감이 그래픽 파이프라인에 의해 샘플링 가능한 이미지 1 개입니다. 이것은 일반적으로 컬러 이미지를 기본에 매핑하는 데 사용되지만, 법선 맵과 사전에 계산된 조명 정보 등 다른 데이터 매핑에 사용할 수 있습니다.

● 버퍼 개체는 OpenGL ES 가 소유한 메모리 블록에서 응용 프로그램 데이터를 저장하는 데 사용합니다. 버퍼는 응용 프로그램과 OpenGL ES 간의 데이터 복사 과정을 정확하게 제어하는 데 사용합니다. 예를 들어, OpenGL ES 정점 배열을 제공하는 경우 응용 프로그램이 그리기 호출을 보낼 때마다 데이터를 복사해야하는 없습니다. 대조적으로, 응용 프로그램이 데이터를 정점 버퍼 개체에 저장할 경우, 정점 버퍼 개체의 내용을 변경하는 명령을 응용 프로그램이 전송하는 경우에만 데이터가 복사됩니다. 버퍼를 사용하여 정점 데이터를 관리하여 응용 프로그램 성능을 크게 향상시킬 수 있습니다.

● 정점 배열 개체는 그래픽 파이프라인 읽을 정점 속성 설정을 유지합니다. 많은 응용 프로그램이 렌더링 엔터티마다 다른 파이프라인 설정을 필요로합니다. 정점 배열에 설정을 저장하여 파이프라인을 다시 설정하지 않고 있습니다보고 구현에서 특정 정점 설정 처리를 최적화할 수있는 경우가 있습니다.

● 쉐이더 프로그램을 객체이며 단순히시다라고도합니다. OpenGL ES 2.0 응용 프로그램은 정점 셰이더와 조각 쉐이더를 작성하여 각 정점 또는 각 조각에 대해 각각 수행하는 연산을 지정합니다.

● 렌더링 버퍼는 지정된 형식의 간단한 2D 그래픽입니다. 이 형식은 일반적으로 색 데이터 심도 데이터 또는 스텐실 데이터로 정의됩니다. 렌더링 버퍼는 일반적으로 분리하여 사용되는 것은 아닌 프레임 버퍼에 대한 부착으로 사용됩니다.

● 프레임 버퍼 개체는 그래픽 파이프라인의 마지막 지점입니다. 프레임 버퍼 오브젝트는 실제로는 렌더 러가 필요로하는 고급 설정을 만드는 데 텍스처와 렌더링 버퍼가 연결되는 단순한 컨테이너입니다.

OpenGL ES 의 각 객체 유형은 각각을 조작하기위한 고유의 기능을 가지고 있습니다만, 모든 객체가 다음과 같은 프로그래밍 모델을 채용하고 있습니다.
1. 객체 식별자를 생성한다.
식별자는 특정 개체 인스턴스를 식별하는 데 사용하는 의미있는 정수입니다. 새로운 개체가 필요한 경우 항상 OpenGL ES 를 호출하여 새로운 식별자를 만듭니다. 개체 식별자를 작성해도 실제로 객체가 할당되는 것이 아니라 단순히 개체 참조가 할당됩니다.
2. 오브젝트를 OpenGL ES 컨텍스트에 바인딩합니다.
대부분의 OpenGL ES 함수는 각 함수 호출에서 개체 식별을 명시적으로 요구하는 것이 아니라 개체에 대해 암시적으로 작동합니다. 개체는 컨텍스트에 개체를 바인딩하여 설정합니다. 객체 유형은 각각 다른 함수를 사용하여 개체를 컨텍스트에 바인딩합니다. OpenGL ES 는 객체 식별자를 먼저 바인딩할 때 개체를 할당 및 초기화합니다.
3. 오브젝트 상태를 변경한다. 응용 프로그램은 1 개 이상의 함수 호출하여 개체를 설정합니다.
예를 들어, 텍스처 개체를 바인딩 후 일반적으로 텍스처 필터링 방법을 설정하고 다음 텍스처 개체에 이미지 데이터를로드합니다.
개체의 변경은 그래픽 하드웨어에 새로운 데이터 전송이 필요할 수 있으므로 부하가 증가 우려가 있습니다. 일단 개체를 만들고 구성되면 그 후 응용 프로그램을 실행하는 동안 개체의 변경을 피하도록합니다 (이렇게하는 것이 의미있는 경우).
4. 렌더링을 위해 객체를 사용한다.
장면의 렌더링에 필요한 모든 개체를 만들고 설정되면 파이프라인을 필요로하는 개체를 바인딩하고 1 개 이상의 그리기 함수를 실행합니다. OpenGL ES 는 오브젝트에 저장된 데이터를 사용하여 기본을 렌더링합니다. 결과는 바인딩된 프레임 버퍼 객체에 전달됩니다.
5. 개체를 삭제한다.
개체 사용이 끝나면 응용 프로그램이 개체를 삭제합니다. 오브젝트가 삭제되면 그 내용은 삭제되고 개체 식별자는 재활용됩니다.

프레임버퍼 객체는 iOS에서 유일한 렌더링 대상이다.
프레임 버퍼 개체는 렌더링 명령의 대상입니다. OpenGL ES 2.0 은 핵심 사양의 일부로 프레임 버퍼 개체를 제공합니다. OpenGL ES 1.1 에서는 ES_framebuffer_object 확장 기능은 프레임 버퍼 개체가 제공됩니다. 프레임 버퍼 객체는 iOS의 단지 1개의 렌더링 대상이기 때문에 Apple 은 iOS 의 모든 OpenGL ES 1.1 구현 항상  OES_framebuffer_object 확장 기능이 제공되는 것을 보장합니다.
 
프레임 버퍼 객체는 이미지를 프레임 버퍼에 연결하여 색깔, 깊이, 및 스텐실 데이터의 스토리지를 제공합니다 (그림 1-2 참조). 가장 일반적인 이미지 첨부는 렌더링 버퍼 개체입니다. 그러나 OpenGL ES 텍스처는 프레임 버퍼의 색상 부착 포인트에 연결할 수 있으며, 이는 이미지를 직접 텍스처에 렌더링 수 있습니다. 이미지가 렌더링되는 텍스처는 이후 사용되는 렌더링 명령 입력의 역할을 할 수 있습니다.

그림 1-2 색상과 깊이 렌더링버퍼와 프레임버퍼그림 1-2 색상과 깊이 렌더링버퍼와 프레임버퍼

프레임 버퍼는 다음 단계를 사용하여 만듭니다.

1. 프레임 버퍼 개체를 만들고 바인딩합니다.
2. 이미지를 생성 바인딩 설정합니다.
3. 프레임 버퍼 첨부 포인트 1 개의 이미지를 연결합니다.
4. 다른 이미지에 단계 2와 3을 반복 합니다.
5. 프레임버퍼의 무결성을 테스트합니다. 완전성에 대한 규칙은 OpenGL ES 사양에 정의되어 있습니다. 이 규칙은 프레임버퍼 및 첨부가 명확하게 정의 되어 있습니다.

: