Как перетаскивать пиксельные данные на экран с помощью OpenGL ES? - PullRequest
2 голосов
/ 03 января 2012

В настоящее время я изучаю OpenGL ES для iPhone, и мне интересно, как взять массив данных пикселей RGB и перенести его на экран, пока все учебники, которые я нашел, покрывают загрузку уже существующего изображения в текстура и отображение.

Вот как я сделал это, используя Core Graphics, создав imageref, затем используя UIImage и UIImageView:

int screenWidth = (int)[[UIScreen mainScreen] bounds].size.width;
int screenHeight = (int)[[UIScreen mainScreen] bounds].size.height;

//Create blank image
CGImageRef blankImageRef = [self createBlankImageRef];
CFDataRef m_DataRef; 
m_DataRef = CGDataProviderCopyData(CGImageGetDataProvider(blankImageRef)); 
UInt8* bufferData = CFDataGetBytePtr(m_DataRef); 


//Manipulate the image here
for(int x=0; x < screenWidth-1; x++)
{
    int y = x;//*2;

    [self setPixel:bufferData width:screenWidth x:x y:y r:255 g:0 b:0];
}


//Paint the image to the screen
CGImageRef imageRef = blankImageRef; 
CGContextRef ctx; 
ctx = CGBitmapContextCreate(bufferData, 
                            CGImageGetWidth( imageRef ), 
                            CGImageGetHeight( imageRef ), 
                            8, 
                            CGImageGetBytesPerRow( imageRef ), 
                            CGImageGetColorSpace( imageRef ), 
                            kCGImageAlphaPremultipliedLast ); 
screenImage = [UIImage imageWithCGImage:CGBitmapContextCreateImage (ctx)]; 
CGContextRelease(ctx); 

[imageView setImage:screenImage];

free(bufferData);

...

- (CGImageRef) createBlankImageRef
{
CGFloat imageScale = (CGFloat)1.0;
CGFloat width = [[UIScreen mainScreen] bounds].size.width;
CGFloat height = [[UIScreen mainScreen] bounds].size.height;

// Create a bitmap graphics context of the given size
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL, width * imageScale, height * imageScale, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);

// Draw ...
CGContextSetRGBFillColor(context, (CGFloat)0.0, (CGFloat)0.0, (CGFloat)0.0, (CGFloat)1.0 );

// Get your image
CGImageRef cgImage = CGBitmapContextCreateImage(context);

CGColorSpaceRelease(colorSpace);
CGContextRelease(context);

return cgImage;
}

-(void)setPixel:(UInt8*)buffer width:(int)width x:(int)x y:(int)y r:(int)r g:(int)g b:(int)b
{
buffer[x*4 + y*(width*4)] = r;
buffer[x*4 + y*(width*4)+1] = g;
buffer[x*4 + y*(width*4)+2] = b;
buffer[x*4 + y*(width*4)+3] = 255;
}

Любые идеи, как я мог бы сделать это с помощью OpenGL ES (в настоящее время использует 1.0) вместо Core Graphics?

1 Ответ

2 голосов
/ 03 января 2012

Вы можете создать текстуру с помощью glTexImage2D (http://www.opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml) или glTexSubImage2D (http://www.opengl.org/sdk/docs/man/xhtml/glTexSubImage2D.xml). glTexSubImage2D) в основном для обновления текстур в реальном времени.

например. для текстуры RGBA:

GLubyte texBuffer[4*texWidth*texHeight];
GLuint texName;
glGenTextures(1, &texName) ;
glBindTexture(GL_TEXTURE_2D, texName) ;
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, texBuffer);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

если вы используете ES 1.x, вы также можете использовать glDrawPixels (http://www.opengl.org/sdk/docs/man/xhtml/glDrawPixels.xml).

...