OpenGLES Programming Guide for iOS 번역 - 10장. 텍스처 테이터를 처리하기 위한 모범적 방법

OpenGL ES/iOS 2011. 9. 22. 16:02

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


텍스처 데이터는 응용프로그램 프레임의 렌더링에 사용하는 데이터 중 가장 큰 부분을 차지하는 경우가 많습니다. 그것은 텍스처가 아름다운 이미지를 사용자에게 표시하는데 필요한 디테일을 제공해주는 것입니다. 응용프로그램에서 가능한 최고의 성능을 위해 응용프로그램의 텍스처를 주의깊게 관리해야합니다.

텍스처의 관리 가이드는 다음과 같습니다.

● 텍스처로 사용하는 메모리의 양을 감소시킨다.

● 응용프로그램의 초기화할 때 텍스처를 만들고 렌더링 루프 사이는 텍스처를 절대 변경하지 않는다.

● 비교적 작은 텍스처를 더 큰 텍스처 아틀라스에 정리한다.

● 밉맵을 사용하여 텍스처 데이터를 페치하는 데 필요한 대역폭을 감소시킨다.

● 멀티 텍스처링을 사용하여 텍스쳐 연산을 수행한다.


텍스처 메모리 사용량을 줄임

iOS 응용프로그램이 사용하는 메모리 양을 줄이는 것은 항상 응용프로그램 튜닝의 중요한 부분입니다. 그러나 OpenGL ES 응용프로그램 텍스처를 로드하는 데 사용할 수있는 총 메모리가 제한되어 있습니다. PowerVR MBX 그래픽 하드웨어를 사용하는 iOS 장치는 텍스처와 렌더링 버퍼에 사용할 수있는 총 메모리가 제한되어 있습니다 ("PowerVR MBX" 참조). 응용프로그램이 텍스처 데이터 보존에 사용하는 메모리 양을 최대한 억제하도록 합니다. 텍스처가 사용하는 메모리를 줄이는 것은 반드시라고해도 좋을 정도 화질을 희생합니다. 따라서 응용프로그램에서 텍스처의 변경 내용과 최종적으로 렌더링되는 프레임의 품질 수준과 균형을 잡아야합니다.
최상의 결과를 얻기 위하여 다음과 같은 다른 기술을 시도하고 허용 가능한 품질 수준에서 가장 메모리가 절약되는 기술을 선택합니다.

텍스처 압축

텍스처 압축은 일반적으로 메모리의 절약과 품질의 균형이 잘 잡는 방법입니다. iOS용 OpenGL ES는 GL_IMG_texture_compression_pvrtc 확장 기능을 구현하여 PowerVR Texture Compression(PVRTC) 형식을 지원합니다. PVRTC 압축은 4비트/채널 및 2비트/채널 2개 수준이 압축되지 않은 32 비트 텍스처 포맷에 비해 압축률은 각각 8:1과 16:1입니다. 압축된 PVRTC 질감, 특히 4비트 수준의 경우 상당한 수준의 품질을 제공할 수 있습니다.

중요 : 미래 Apple의 하드웨어 PVRTC 텍스처 형식을 지원하지 않을 가능성이 있습니다. PVRTC 압축된 텍스처를로드하기 전에 GL_IMG_texture_compression_pvrtc 확장의 존재를 확인할 필요가 있습니다. 확장 기능을 확인하는 방법은 "확장 기능을 사용하기 전에 확인"을 참조하십시오. 호환성을 최대화하기 위해이 확장을 사용할 수없는 경우에 사용하는 압축없이 텍스처 응용프로그램에 포함할 수 있습니다.

텍스처를 PVRTC 포맷으로 압축하는 방법은 "texturetool를 사용하여 텍스처 압축"을 참조하십시오.

저 정밀도의 칼라 포맷을 사용

응용프로그램이 압축 텍스처를 사용할 수없는 경우 더 낮은 정밀도의 픽셀 포맷의 사용을 고려합니다. 형식 RGB565, RGBA5551 또는 RGBA4444의 텍스처는 RGBA8888 형식 텍스처의 절반 메모리 사용하면 됩니다. RGBA8888을 사용하는 응용프로그램에서 해당 수준의 품질이 필요한 경우에만 합니다.

적절한 크기의 텍스처를 사용

iOS 기반 장치가 표시 이미지는 아주 작은 것입니다. 응용프로그램은 화면에 적절한 이미지를 표시하는 데 큰 텍스처를 제공할 필요는 없습니다. 텍스처의 가로와 세로 모두 크기를 절반으로하면 그 텍스처에 필요한 메모리는 원래 질감의 4분의 1로 줄일 수 있습니다.

텍스처를 축소하기 전에 먼저 텍스처 압축 및 낮은 정밀도의 컬러 포맷의 사용을 시도합니다. 일반적으로 PVRTC 형식의 텍스처 압축을 사용하는 것이 텍스처를 축소보다 이미지 품질은 높고 메모리 사용량도 적습니다.

초기화하는 동안 텍스처 로드

텍스처 생성 및 로드는 비용이 많이 드는 작업입니다. 최상의 성능을 얻으려면 응용프로그램 실행 중에 새로운 텍스처를 만들 마십시오. 대신 초기화 텍스처 데이터를 생성 및 로드합니다. 텍스처의 작성이 완료되면 원본 이미지를 반드시 삭제하십시오.

응용프로그램이 텍스처를 만든 후 프레임의 첫 번째 또는 마지막 이외의 텍스처 변경하지 마십시오. 현재 모든 iOS 장치는 타일 기반의 지연 렌더러를 사용하고 있습니다. 이 렌더러는 glTexSubImage 함수 glCopyTexSubImage 함수 호출시 특히 비용이 소요됩니다. 자세한 내용은 "타일 기반의 지연 렌더링(TBDR)"을 참조하십시오.

복수의 텍스처를 텍스처 아틀라스로 통합

텍스처에 바인딩은 OpenGL ES의 처리시 시간이 걸립니다. OpenGL ES의 상태를 변경하는 횟수가 적은 응용프로그램 쪽이 성능이 높아집니다. 텍스처에 관해서 새로운 텍스처에 바인딩을 피하는 방법 중 하나는 여러 작은 텍스처를 결합하여 1개의 큰 텍스처(texture atlas라고 부른다)하는 것입니다. 텍스처 아틀라스를 사용하여 응용프로그램은 단일 텍스처를 바인딩하고 텍스처를 사용하는 여러 그리기 호출을 수행할 수 있습니다. 정점 데이터로 제공되는 텍스처 좌표는 텍스처 아틀라스의 텍스처의 더 작은 부분을 선택하도록 수정됩니다. 텍스처 아틀라스는 다음과 같은 제한이 있습니다.

GL_REPEAT 텍스처 랩(wrap) 매개 변수를 사용하는 경우 텍스처 아틀라스를 사용할 수 없습니다.

● 필터링하는 가정의 범위를 넘은 텍셀(texels)을 얻을 수 있습니다. 텍스처 아틀라스에서이 같은 텍스처를 사용하려면 텍스처 아틀라스 구성 텍스처 사이에 여백을 배치해야합니다.

● 텍스처 아틀라스 또한 1개의 텍스처이기 때문에 OpenGL ES 구현의 제한을 받습니다. 특히, 구현이 허용하는 최대 텍스처 크기가 제한됩니다.

밉맵핑(Mipmapping)을 사용하여 메모리 대역폭을 줄임

2D의 확대 축소없이 이미지를 그리는 경우를 제외하고 모든 응용프로그램의 텍스처에 밉맵를 제공해야 합니다. 밉맵은 여분의 메모리를 사용하지만, 텍스처링의 아티팩트(artifacts)를 억제하고 이미지 품질을 향상시킵니다. 더 중요한 것은 샘플링된 밉맵가 작으면 작을수록 텍스처 메모리로부터 취득되는 텍셀이 작아져 그래픽 하드웨어가 필요로하는 메모리의 대역폭이 감소되어 성능이 향상됩니다.

GL_LINEAR_MIPMAP_LINEAR 필터 모드는 텍스처 때 최상의 품질을 제공하지만 메모리에서 추가로 텍셀(telxels)을 취득할 필요가 있습니다. GL_LINEAR_MIPMAP_NEAREST 필터 모드를 지정하면 이미지 품질을 떨어뜨리는 대신 성능을 향상시킬 수 있습니다.

밉맵 및 텍스처 아틀라스을 결합하면 APPLE_texture_max_level 확장 기능을 사용하여 텍스처 필터링 방법을 제어합니다.

다중 경로 대신 멀티 텍스처링을 사용

많은 응용프로그램 경로마다 그래픽 파이프라인 설정을 바꾸면서 여러 경로를 실행하여 모델을 그립니다. 그것은 그래픽 파이프라인을 다시 설정하는 횟수가 늘어나는것 뿐만 아니라 각 경로에 정점 정보를 재처리하고, 후반의 경로는 픽셀 데이터를 프레임 버퍼에서 다시 읽어하거나 하는 필요가 생깁니다. iOS의 OpenGL ES의 구현은 적어도 2개의 텍스처 유닛을 지원하고 대부분의 장치가 최대 8개의 텍스처 유닛을 지원합니다. 응용프로그램은 이러한 텍스처 유닛을 사용하여 각 경로 알고리즘에서 가능한 한 많은 단계를 실행해야 합니다. glGetIntegerv 함수를 호출하고 매개 변수로 GL_MAX_TEXTURE_UNITS를 전달하여 응용프로그램에서 사용 가능한 텍스처 유닛의 수를 얻을 수 있습니다.

1개의 객체를 렌더링하기 위해 다중 경로가 필요한 경우 다음 사항에 유의하십시오.

● 경로 때마다 위치 데이터가 변화하지 않는다는 것을 보증한다.

● 2번째 이후의 경로는 GL_EQUAL를 매개 변수로 glDepthFunc 함수를 호출하여 모델의 표면에 픽셀을 테스트한다.

텍스처 이미지 데이터를로드 전의 텍스처 매개 변수 설정

목록 10-1 와 같이, 텍스처 데이터를 로드하기 전에 텍스처 매개 변수를 설정합니다. 매개 변수를 먼저 설정하여 OpenGL ES는 설정에 맞게 그래픽 하드웨어에서 제공하는 텍스처 데이터를 최적화할 수 있습니다.

목록 10-1. 새로운 텍스처로드

glGenTextures(1, &spriteTexture);
glBindTexture(GL_TEXTURE_2D, spriteTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);


주. texel : texture element
주. artifacts : 부적정한 영상 샘플링의 결과로 계산기에서 만들어지는 화상의 결함, 특히 상의 경계선이 톱니 모양으로 되는것.

: