OpenGLES Programming Guide for iOS 번역 - 12장. 플랫폼 관련 정보

OpenGL ES/iOS 2011. 9. 22. 19:31

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


Apple에서는 다양한 하드웨어 플랫폼에 다양한 OpenGL ES 구현을 제공하고 있습니다. 각 구현은 텍스처에 허용되는 최대 크기에서 지원되는 OpenGL ES 확장 기능 목록에 이르기까지 그 기능은 다양합니다. 이 장에서는 최고의 성능과 품질을위한 응용 프로그램의 조정에 도움이 되도록 각 플랫폼에 대해 자세히 설명합니다.

이 장의 정보는 iOS 4.2 버전 시점의 것입니다. 미래의 하드웨어 또는 소프트웨어 릴리스에서 변경될 수 있습니다. 응용 프로그램이 향후 플랫폼과의 호환성을 확보할 수 있도록, " OpenGL ES 의 기능 확인"과 기능에 대해 반드시 런타임에 명시적으로 테스트하십시오.

표 12-1. iOS 하드웨어 장치 목록 장치 호환성 그래픽 플랫폼

 장치  그래픽 플랫폼 OpenGL ES 2.0 OpenGL ES 1.1 
 iPod Touch  PowerVR MBX  No  Yes
 iPod Touch 2세대  PowerVR MBX  No  Yes
 iPod Touch 3세대  PowerVR SGX  Yes  Yes
 iPod Touch 4세대  PowerVR SGX  Yes  Yes
 iPhone  PowerVR MBX  No  Yes
 iPhone 3G  PowerVR MBX  No  Yes
 iPhone 3GS  PowerVR SGX  Yes  Yes
 iPhone 3GS(중국향)  PowerVR SGX  Yes  Yes
 iPhone 4  PowerVR SGX  Yes  Yes
 iPad Wi-Fi  PowerVR SGX  Yes  Yes
 iPad Wi-Fi + 3G  PowerVR SGX  Yes  Yes

PowerVR SGX 플랫폼

PowerVR SGX는 iPhone 3GS , iPhone 4 , iPod touch (3세대) 및 iPad 에 탑재되어있는 그래픽 프로세서에서 OpenGL ES 2.0을 지원하도록 설계되어 있습니다. PowerVR SGX의 그래픽 드라이버는 OpenGL ES 1.1도 구현되었으며, 쉐이더를 사용하여 고정 기능 파이프라인을 효율적으로 구현되어 있습니다. PowerVR 기술에 대한 자세한 내용은  "PowerVR Technology Overview"를 참조하십시오. PowerVR SGX 대한 자세한 내용은 "POWERVR SGX OpenGL ES 2.0 Application Development Recommendations"를 참조하십시오.

타일 기반의 지연 렌더링 (Tile-Based Deferred Rendering, TBDR)

PowerVR SGX는 타일 기반의 지연 렌더링( Tile-Based Deferred Rendering : TBDR )이라고하는 방법을 사용하고 있습니다. 렌더링 명령을 하드웨어로 전송하기 위해 OpenGL ES 함수를 호출할 이러한 명령은 일정량의 명령이 축적 때까지 버퍼에 저장됩니다. 이들 명령은 하드웨어에 따라 단일 연산으로 렌더링됩니다. 이미지를 렌더링하기 위해 프레임 버퍼는 타일로 분할되어 명령은 타일마다 한번 그려지며 각 타일은 타일에 표시되는 기본만을 렌더링합니다. 지연 렌더러의 주요 장점은 매우 효율적으로 메모리에 액세스할 수 있습니다. 렌더링을 타일로 나눌 수에 따라 GPU는 프레임 버퍼에서 픽셀 값을 효율적으로 캐시 있기 때문에 깊이 테스트 및 혼합 효율이 향상됩니다.

지연 렌더링의 또하나의 장점은 GPU가 조각을 처리하기 전에 숨겨진 표면 제거하는 것입니다. 표시되지 않는 픽셀 텍스처 샘플링이나 조각 작업을 실행하지 않고 삭제됩니다. 따라서 GPU가 타일을 렌더링하기 위해 실행해야 하는경우 계산량을 크게 줄일 수 있습니다. 이 기능의 효과를 극대화, 프레임의 가능한 많은 부분을 불투명 콘텐츠로 렌더링하고, 혼합, 알파 테스트 및 GLSL 쉐이더에서 discard 명령의 사용을 최소화합니다. 숨겨진 표면 제거는 하드웨어에 의해 수행되므로 응용 프로그램은 전면에서 후면까지 기본을 정렬할 필요가 없습니다.

지연 렌더러의 하부 작업 중에는 기존의 스트림 렌더러의 경우보다 비용이 많이 드는 것도 있습니다. 앞서 설명한 메모리 대역폭과 계산량 축적은 큰 장면을 처리할 때 가장 효과가 있습니다. 작은 장면 렌더링을 요구하는 OpenGL ES 명령을 하드웨어가 받으면 렌더러의 효율이 크게 저하됩니다. 예를 들어, 응용 프로그램이 텍스처를 사용하는 한 묶음의 삼각형을 렌더링 후 그 텍스처를 수정하려면 OpenGL ES의 구현은 그 명령을 즉시 플래시하거나 텍스처를 복제하거나 둘 중 하나를 수행해야 합니다. 두 옵션 모두 하드웨어 효율적으로 사용되지 않습니다. 마찬가지로 프레임 버퍼에서 픽셀 데이터를 읽으려고하면 이전 명령이 프레임 버퍼를​변경하려면 그들이 실행되고 있어야합니다.

PowerVR SGX 릴리스 노트 및 모범 사례

다음과 같은 모범 사례는 OpenGL ES 2.0 및 OpenGL ES 1.1 의 두 응용 프로그램 모두 적용됩니다.

● (이전 보낸 그리기 명령에 대한) 렌더러가 이미 사용하는 OpenGL ES 개체를 수정하는 작업을 피하십시오. OpenGL ES 리소스를 수정해야하는 경우에는 그 수정을 프레임의 첫 번째 또는 마지막에 예약합니다. 이러한 명령으로 glBufferSubData , glBufferData , glMapBuffer , glTexSubImage , glCopyTexImage , glCopyTexSubImage , glReadPixels , glBindFramebuffer , glFlush , glFinish 가 있습니다.

● 숨겨진 표면 제거 처리 기능을 사용하려면 "올바른 렌더링에 필요한 경우를 제외한 렌더링된 개체를 정렬하지 않는다"과 그리기 지침을 따르십시오.

● 정점 버퍼 개체 (Vertex Buffer Object : VBO)를 이용하면 PowerVR SGX에서 성능이 크게 향상됩니다. 자세한 내용은 "정점 버퍼 개체를 사용하여 정점 데이터의 복사본 관리"를 참조하십시오.

● iOS 4.0 이상에서는 독립적인 스텐실 버퍼를 지원하지 않습니다. 결합된 깊이/스텐실 버퍼를 사용합니다.

● iOS 4.0 이상에서는 glTexImage2D glTexSubImage2D 성능이 크게 향상됩니다.

● iOS 4.2 이상에서는 렌더링 버퍼의 Core Animation 의 회전 성능이 크게 향상되어 콘텐츠를 회전시켜 가로 모드와 세로 모드를 전환하는 방법으로 권장됩니다. 최고의 성능을 위해 렌더링 버퍼의 높이와 너비가 각각 32픽셀의 배수가되도록합니다.

PowerVR SGX 에서의 OpenGL ES 2.0

제한사항

● 2D 텍스처 또는 큐브 맵 텍스처의 최대 크기는 2048x2048 입니다. 이것은 렌더 버퍼 크기와 관점의 최대 크기이기도 합니다.

● 조각 셰이더에서는 최대 8개의 텍스처를 사용할 수 있습니다. 정점 셰이더에서는 텍스처 검색을 사용할 수 없습니다.

● 정점 속성은 최대 16개까지 사용할 수 있습니다.

● varying 벡터는 최대 8개까지 사용할 수 있습니다.

● 정점 셰이더에서는 최대 128개의 uniform 벡터를 사용할 수 조각 셰이더에서는 최대 64개의 uniform 벡터를 사용할 수 있습니다.

● 점 크기의 범위는 1.0 픽셀에서 511.0 픽셀까지입니다.

● 선 두께 범위는 1.0 픽셀에서 16.0 픽셀까지입니다.


지원되는 확장 기능

다음과 같은 향상된 기능을 지원합니다.

 APPLE_framebuffer_multisample

 APPLE_rgb_422

 APPLE_texture_format_BGRA8888

 APPLE_texture_max_level

 EXT_blend_minmax

 EXT_discard_framebuffer

 EXT_read_format_bgra

 EXT_shader_texture_lod

 EXT_texture_filter_anisotropic

 IMG_read_format

 IMG_texture_compression_pvrtc

 OES_depth24

 OES_depth_texture

 OES_fbo_render_mipmap

 OES_mapbuffer

 OES_packed_depth_stencil

 OES_rgb8_rgba8

 OES_standard_derivatives

 OES_texture_half_float

 OES_texture_float

 OES_vertex_array_object

iOS 3.1 이상에서는 큐브 맵 텍스처에 렌더링도 지원합니다. 이전 버전의 iOS는 큐브 맵 FRAMEBUFFER_UNSUPPORTED를 반환합니다.

알려진 제한 사항 및 문제점

● PowerVR SGX 는 2의 거듭제곱이 아닌 큐브 맵 텍스처와 밉맵 텍스처는 지원하지 않습니다.

OpenGL ES 2.0의 모범적 방법

iOS 4.2 이상에서는 셰이더 컴파일러는보다 적극적으로 루프를 확장합니다.

PowerVR SGX는 비록 벡터로 선언되는 값도 스칼라 프로세서를 사용하여 높은 정밀도의 부동 소수점 연산을 처리합니다. 쓰기 마스크를 적절히 사용하여 주의깊게 연산을 정의하는 개와에서 쉐이더 성능을 향상시킬 수 있습니다. 자세한 내용은 "벡터 계산 시간이 걸리는 실행"을 참조하십시오.
중 정밀도와 낮은 정밀도의 부동 소수점 숫자는 병렬로 처리됩니다. 그러나 저정도의 변수는 다음과 같은 특별한 성능상의 제한이 있습니다.

● 낮은 정밀도로 선언된 벡터의 구성 요소 swizzle 비용이 소요되기 때문에 피해야 합니다.

● 대부분의 기본 제공 함수는 중 정도의 입력과 출력을 사용합니다. 응용 프로그램이 낮은 정밀도의 부동 소수점 값을 매개 변수로 제공하고, 낮은 정밀도의 부동 소수점 값으로 결과를 할당하는 경우 쉐이더가 값을 변환하는 추가 명령을 포함해야 할 수 있습니다. 이러한 추가 명령은 계산 벡터 결과를 스위즈루하는 경우에도 추가됩니다.

PowerVR SGX에서의 OpenGL ES 1.1

OpenGL ES 1.1은 사용자 지정 셰이더를 사용하여 PowerVR SGX 하드웨어 구현됩니다. 응용 프로그램이 OpenGL ES의 상태 변수를 변경 때마다 필요에 따라 새로운 쉐이더를 암시적으로 생성됩니다. 따라서 OpenGL ES의 상태를 변경하면 순수한 하드웨어 구현의 경우보다 비용이 높아질 가능성이 있습니다. 응용 프로그램의 성능은 응용 프로그램이 실행 상태의 변경 횟수를 줄임으로써 향상시킬 수 있습니다. 자세한 내용은 "OpenGL ES 상태 변수주의"를 참조하십시오.

제한 사항

● 2D 텍스처의 최대 크기는 2048x2048입니다. 이것은 렌더링 버퍼 크기와 관점의 최대 크기이기도 합니다.

● 8개의 텍스처 유닛을 사용할 수 있습니다.

● 점 크기의 범위는 1.0 픽셀에서 511.0 픽셀까지입니다.

● 선 두께 범위는 1.0 픽셀에서 16.0 픽셀까지입니다.

● 텍스처 LOD 바이어스의 최대값은 4.0입니다.

● GL_OES_matrix_palette 대한 팔레트 매트릭스의 최대 수는 11, 정점 단위의 최대 수는 4입니다.

● 사용자 클리핑 플레인 최대 6입니다.


지원되는 확장 기능

 APPLE_framebuffer_multisample

 APPLE_texture_2D_limited_npot

 APPLE_texture_format_BGRA8888

 APPLE_texture_max_level

 EXT_blend_minmax

 EXT_discard_framebuffer

 EXT_read_format_bgra

 EXT_texture_filter_anisotropic

 EXT_texture_lod_bias

 IMG_read_format

 IMG_texture_compression_pvrtc

 OES_blend_equation_separate

 OES_blend_func_separate

 OES_blend_subtract

 OES_compressed_paletted_texture

 OES_depth24

 OES_draw_texture

 OES_fbo_render_mipmap

 OES_framebuffer_object

 OES_mapbuffer

 OES_matrix_palette

 OES_packed_depth_stencil

 OES_point_size_array

 OES_point_sprite

 OES_read_format

 OES_rgb8_rgba8

 OES_stencil8

 OES_stencil_wrap

 OES_texture_mirrored_repeat

 OES_vertex_array_object


PowerVR MBX

PowerVR MBX는 OpenGL ES 1.1의 고정 기능 파이프라인을 구현하고 있습니다. PowerVR 기술에 대한 자세한 내용은 "PowerVR Technology Overview"를 참조하십시오. PowerVR MBX 대한 자세한 내용은 "PowerVR MBX 3D Application Development Recommendations"를 참조하십시오. PowerVR MBX는 타일 기반의 지연 렌더러입니다. PowerVR MBX는 OpenGL ES 2.0뿐만 아니라 사용자 정의 프래그먼트 쉐이더를 지원하지 않지만, 그래픽 하드웨어는 숨겨진 조각에 대한 색상 값 계산을 방지합니다. 지연 렌더 러에서 효율적으로 작동하도록 응용 프로그램을 조정하는 방법은 "타일 기반의 지연 렌더링 (TBDR)"을 참조하십시오.
PowerVR MBX을 대상으로 한 OpenGL ES 응용 프로그램은 텍스처와 렌더링 버퍼의 메모리가 24MB를 넘지 않도록 제한해야합니다. 전체적으로 PowerVR MBX 쪽이 메모리 사용의 영향을 받기 쉽고, 응용 프로그램은 텍스처와 렌더링 버퍼의 크기를 최소화해야 합니다.

PowerVR MBX 릴리스 노트 및 모범 사례

● 최고의 성능을 얻으려면 표준 정점 속성을 다음 순서로 정렬합니다. Position, Normal, Color, TexCoord0, TexCoord1, PointSize, Weight, MatrixIndex.

● iOS 4 이상에서는 glTexImage2D glTexSubImage2D의 성능이 크게 향상됩니다.

● 정점 배열 개체와 정적 정점 버퍼 개체를 정리, 정점 데이터를 OpenGL ES로 전송하여 드라이버는 새로운 최적화를 수행할 수 있으며, 그래픽 하드웨어의 데이터 수집의 오버헤드를 줄일 수 있습니다.


PowerVR MBX에서의 OpenGL ES 1.1

제한 사항

● 2D 텍스처의 최대 크기는 1024x1024입니다. 이것은 렌더링 버퍼 크기와 관점의 최대 크기이기도 합니다.

● 2 개의 텍스처 유닛을 사용할 수 있습니다.

● 점 크기의 범위는 1.0 픽셀에서 64 픽셀까지입니다.

● 선 두께 범위는 1.0 픽셀에서 64 픽셀까지입니다.

● 텍스처 LOD 바이어스의 최대값은 2.0입니다.

● GL_OES_matrix_palette 대한 팔레트 매트릭스의 최대 수는 9, 정점 단위의 최대 개수는 3입니다.

● 사용자 클리핑 평면의 최대 개수는 1입니다.


지원되는 확장 기능

iOS위한 OpenGL ES 1.1 구현에서 지원되는 확장 기능은 다음과 같습니다.

 APPLE_framebuffer_multisample

 APPLE_texture_format_BGRA8888

 APPLE_texture_max_level

 EXT_discard_framebuffer

 EXT_texture_filter_anisotropic

 EXT_texture_lod_bias

 IMG_read_format

 IMG_texture_compression_pvrtc

 OES_blend_subtract

 OES_compressed_paletted_texture

 OES_depth24

 OES_draw_texture

 OES_framebuffer_object

 OES_mapbuffer

 OES_matrix_palette

 OES_point_size_array

 OES_point_sprite

 OES_read_format

 OES_rgb8_rgba8

 OES_texture_mirrored_repeat

 OES_vertex_array_object


알려진 제한 사항 및 문제점

OpenGL ES 1.1의 PowerVR MBX의 구현은 OpenGL ES 1.1 사양을 완전히 준수하지 않습니다. 호환성의 이유에서 응용 프로그램에서는 다음과 같은 특수한 경우를 피하도록하십시오.

● (1 개의 텍스처 수준 내에서) 텍스처의 확대 필터 축소 필터가 일치해야합니다.

    ● Supported :
       GL_TEXTURE_MAG_FILTER = GL_LINEAR,
       GL_TEXTURE_MIN_FILTER = GL_LINEAR_MIPMAP_LINEAR

    ● Supported :
       GL_TEXTURE_MAG_FILTER = GL_NEAREST,
       GL_TEXTURE_MIN_FILTER = GL_NEAREST_MIPMAP_LINEAR

    ● Not supported :
       GL_TEXTURE_MAG_FILTER = GL_NEAREST,
       GL_TEXTURE_MIN_FILTER = GL_LINEAR_MIPMAP_LINEAR

● 다음의 텍스처 환경 조작은 사용할 수 없습니다 (사용하는 경우는 거의 없습니다).

      ● GL_COMBINE_RGB 값이 GL_MODULATE의 경우 두 피연산자 중 하나만 GL_ALPHA 소스를 읽을 수 있습니다.

      ● GL_COMBINE_RGB 값이 GL_INTERPOLATE, GL_DOT3_RGB 또는 GL_DOT3_RGBA 경우 GL_CONSTANT 소스 GL_PRIMARY_COLOR 소스 GL_ALPHA 피연산자의 조합 중 일부는 제대로 작동하지 않습니다.

      ● GL_COMBINE_RGB 또는 GL_COMBINE_ALPHA 값이 GL_SUBTRACT 경우
 GL_SCALE_RGB 또는 GL_SCALE_ALPHA는 1.0이어야합니다.

      ● GL_COMBINE_ALPHA 값이 GL_INTERPOLATE 또는 GL_MODULATE의 경우, 2 개의 소스 하나만 GL_CONSTANT이 될 수 있습니다.

      ● GL_TEXTURE_ENV_COLOR 값은 모든 텍스처 유닛에서 동일해야합니다.

● 양면 라이팅 (GL_LIGHT_MODEL_TWO_SIDE)는 무시됩니다.

● glPolygonOffset의 factor 인수는 무시됩니다. 경사에 의존하지 않는 units 매개 변수에만 유효합니다.

● 원근 보정 텍스처, 텍스처 좌표 S 좌표와 T 좌표에 대해서만 지원됩니다. Q 좌표는 원근 보정으로 보정되지 않습니다.

iOS 시뮬레이터

iOS 시뮬레이터는 OpenGL ES 1.1과 OpenGL ES 2.0 모두 호환되는 완전한 구현을 제공하며 응용 프로그램 개발에 사용할 수 있습니다. 시뮬레이터는 다음 몇 가지가 PowerVR MBX와 PowerVR SGX와 다릅니다.

● 시뮬레이터는 타일 기반의 지연 렌더러를 사용하지 않습니다.

● 시뮬레이터는 PowerVR MBX의 메모리 제한하지 않습니다.

● 시뮬레이터는 PowerVR MBX와 PowerVR SGX와 같은 확장 기능을 지원하지 않습니다.

● 시뮬레이터는 PowerVR MBX와 PowerVR SGX에 대해 픽셀 단위의 정확성을 보장하지 않습니다.

중요 : 시뮬레이터의 OpenGL ES의 렌더링 성능은 실제 장치의 OpenGL ES의 성능과 전혀 관계 없습니다. 시뮬레이터는 Macintosh 컴퓨터의 벡터 처리 기능을 이용한 최적화된 소프트웨어 래스터 라이저를 제공합니다. 그 결과, OpenGL ES 코드는 실제 장치보다 iOS 시뮬레이터에서 실행하는 것이 빠른 경우도 느린 경우도있어, 실행하는 컴퓨터와 그리기에 따라 다릅니다. 반드시 실제 장치에 그리기 코드를 프로 파일링하여 최적화하십시오. 시뮬레이터가 실제 성능을 반영하고 있다고 상정합니다.


시뮬레이터의 OpenGL ES 2.0

지원되는 확장 기능

시뮬레이터는 OpenGL ES 2.0의 다음과 같은 향상된 기능을 지원합니다.

 APPLE_framebuffer_multisample

 APPLE_rgb_422

 APPLE_texture_format_BGRA8888

 APPLE_texture_max_level

 EXT_blend_minmax

 EXT_discard_framebuffer

 EXT_shader_texture_lod

 EXT_texture_filter_anisotropic

 IMG_read_format

 IMG_texture_compression_pvrtc

 OES_depth24

 OES_depth_texture

 OES_fbo_render_mipmap

 OES_mapbuffer

 OES_rgb8_rgba8

 OES_texture_half_float

 OES_texture_float

 OES_vertex_array_object

시뮬레이터의 OpenGL ES 1.1

지원되는 확장 기능

 APPLE_framebuffer_multisample

 APPLE_texture_2D_limited_npot

 APPLE_texture_format_BGRA8888

 APPLE_texture_max_level

 EXT_blend_minmax

 EXT_discard_framebuffer

 EXT_texture_filter_anisotropic

 EXT_texture_lod_bias

 EXT_texture_filter_anisotropic

 IMG_read_format

 IMG_texture_compression_pvrtc

 OES_blend_equation_separate

 OES_blend_func_separate

 OES_blend_subtract

 OES_compressed_paletted_texture

 OES_depth24

 OES_draw_texture

 OES_fbo_render_mipmap

 OES_framebuffer_object

 OES_mapbuffer

 OES_matrix_palette

 OES_point_size_array

 OES_point_sprite

 OES_read_format

 OES_rgb8_rgba8

 OES_stencil8


: