Визуализация CoreGraphics для текстуры OpenGL на IOS - PullRequest
1 голос
/ 28 марта 2012

Использование CoreGraphics на iOS очень просто в использовании, но можно получить вывод CoreGraphics и поместить его в OpenGL Текстуры?

Конечная цель - использовать CGContextDrawPDFPage для рендеринга очень производительных PDF-файлов и записи их в конкретный идентификатор текстуры с помощью

OpenGL.glBindTexture(GL_TEXTURE_2D, TextureNativeId);

Похоже, что CoreGraphics не может визуализировать непосредственно в определенный "родной идентификатор текстуры".

1 Ответ

2 голосов
/ 28 марта 2012

Да, вы можете, визуализируя содержимое Core Graphics в растровый контекст и загружая его в текстуру. Ниже приведен код, который я использую для рисования UIImage в контексте Core Graphics, но вы можете заменить часть CGContextDrawImage() собственным кодом рисования:

GLubyte *imageData = (GLubyte *) calloc(1, (int)pixelSizeOfImage.width * (int)pixelSizeOfImage.height * 4);
CGColorSpaceRef genericRGBColorspace = CGColorSpaceCreateDeviceRGB();    
CGContextRef imageContext = CGBitmapContextCreate(imageData, (int)pixelSizeOfImage.width, (int)pixelSizeOfImage.height, 8, (int)pixelSizeOfImage.width * 4, genericRGBColorspace,  kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, pixelSizeOfImage.width, pixelSizeOfImage.height), [newImageSource CGImage]);
CGContextRelease(imageContext);
CGColorSpaceRelease(genericRGBColorspace);

glBindTexture(GL_TEXTURE_2D, outputTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (int)pixelSizeOfImage.width, (int)pixelSizeOfImage.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, imageData);

Предполагается, что вы создали свою текстуру, используя следующий код:

glActiveTexture(GL_TEXTURE0);
glGenTextures(1, &outputTexture);
glBindTexture(GL_TEXTURE_2D, outputTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// This is necessary for non-power-of-two textures
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBindTexture(GL_TEXTURE_2D, 0);

Для быстро меняющегося содержимого вы можете захотеть взглянуть на кэши текстур в iOS 5.0 (CVOpenGLESTextureCacheCreateTextureFromImage() и т. П.), Которые могут позволить вам визуализировать данные непосредственно в байтах. Однако я обнаружил, что накладные расходы на создание и рендеринг текстуры с кэшем текстур делают это немного медленнее при рендеринге одного изображения, поэтому, если вам не нужно постоянно обновлять это, приведенный выше код, вероятно, является вашим самым быстрым маршрутом.

...