2010-08-02 3 views
10

저는 석영 2d를 사용하여 이미지를 생성 중이므로 OpenGL 텍스처로 사용하고 싶습니다. 까다로운 부분은 내가 가능한 한 픽셀 당 적은 수의 비트를 사용하려는, 그래서 다음과 같은 cgContext을 만드는거야 :CGBitmapContextCreate로 만든 이미지를 OpenGL 텍스처로 사용합니다.

문서 here에 명시된 바와 같이
int bitsPerComponent = 5; 
int bytesPerPixel = 2; 
int width = 1024; 
int height = 1024; 
void* imageData = malloc(width * height * bytesPerPixel); 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGImageContext context = CGBitmapContextCreate(imageData, width, height, bitsPerComponent, width * bytesPerPixel, colorSpace, kCGImageAlphaNoneSkipFirst); 
//draw things into context, release memory, etc. 

, 이것은 지원되는 유일한 RGB 픽셀 형식입니다 픽셀 당 16 비트를 사용하는 CGBitmapContextCreate입니다. 그래서이 imageData를 "1 비트 건너 뛰기 - 5 비트 빨강 - 5 비트 녹색 - 5 비트 파랑"처럼 보이는 이미지를 opengl 텍스처로 업로드하고 싶습니다.

glGenTextures(1, &texture); 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, imageData); 

"- 5 녹색 - 5 블루 - 1 알파 5 빨간색"으로 내가 픽셀 형식을 지정한이 호출로 인해 작동하지 않습니다 그래서 내가 이런 일을해야한다. 그게 잘못이지만 핵심 그래픽 출력과 일치하는 형식이없는 것 같습니다.
GL_UNSIGNED_SHORT_1_5_5_5_REV와 같은 몇 가지 옵션이 있지만 아이폰에서는 작동하지 않습니다.

이 imageData를 텍스처로 사용하려면 약간의 방법이 필요하지만 실제로 memset 등을 사용하여 수동으로 바이트를 스왑하고 싶지는 않습니다. 왜냐하면 그렇게 비효율적으로 보이기 때문입니다.

+0

픽셀 당 약 5 비트가 걱정되는 이유는 무엇입니까? OpenGL을 위해 가장 쉬운 것이 컨텍스트가되는 것입니다. 소스 이미지가 다르다면 쿼츠가 컨텍스트에 맞출 때 변환을 수행 할 수 있습니까? 나는 게임에서 모든 종류의 역동적 인 질감을 가지고 있으며 이러한 문제를 한번도 경험하지 못했습니다. – badweasel

+0

나는이 질문을 2010 년에도 2g 기술을 계속 지원할 때 만들었습니다. 2g와 3g는 모두 거의 기억이 없었으며 앱은 게임이 아니 었습니다. 전자 책 리더였습니다. 우리는 텍스트 파싱/스타일링/레이아웃 엔진 용으로 최소한 10MB의 데이터를 사용해야했으며, 모든 작은 비트가 중요했습니다. 나는 누군가가 이것을 2012 년에 사용해야 할지도 모르지만, 아마도 memmory warning으로 죽고 memmory footprint를 줄이려는 애플 리케이션이있을 수 있습니다. – Alexey

+0

@Alexey : 텍스처에 대해로드하는 이미지 데이터의 해상도는 무엇입니까? – 8Ours

답변

2

RGBA551 또는 RGB565와 같은 고밀도 포맷으로 변환하려면 비트를 교체해야합니다. CGBitmapContext는 이러한 포맷을 지원하지 않으므로 (단순성 및 효율성을 위해).

memset은 트릭을 수행하지 않지만 Accelerate.framework에는 "빠른"변환 루틴이 있습니다.

vImageConvert_ARGB8888toRGB565(…)vImageConvert_ARGB8888toARGB1555(…) (iOS 5 이상에서 사용 가능)을 참조하십시오. 아이폰 OS 7.0

1

, 이후의 OS 및 X.9 :

vImage_CGImageFormat fmt = { 
    .bitsPerComponent = 5, 
    .bitsPerPixel = 16, 
    .colorSpace = NULL, // faster with CGImageGetColorSpace(cgImage) if known to be RGB 
    .bitmapInfo = kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder16Little // ARGB1555 little endian 
}; 
vImage_Buffer buf; 
vImageBuffer_InitWithCGImage(&buf, &fmt, NULL, cgImage, kvImageNoFlags); 

...

free(buf.data); 

데이터 상 높이, 폭 및 rowBytes 정보와 함께 buf.data이다. 행 패딩이 허용되는지에 대한 GL의 요구 사항을 기억하지 않습니다. buf.data 및 buf.rowBytes 필드를 미리 할당하고 플래그에 kvImageDoNotAllocate를 전달하여 제어 할 수 있습니다.

565_REV는 kCGImageAlphaNone | kCGBitmapByteOrder16Little. 5551_REV는 kCGImageAlphaNoneSkipLast입니다. kCGBitmapByteOrder16Little

관련 문제