gpt4 book ai didi

iphone - 如何使用 OpenGL ES 将像素数据传输到屏幕?

转载 作者:行者123 更新时间:2023-12-03 21:04:32 25 4
gpt4 key购买 nike

我目前正在学习 iPhone 的 OpenGL ES,我想知道如何获取 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 来完成此任务吗?

最佳答案

您可以使用 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)。

关于iphone - 如何使用 OpenGL ES 将像素数据传输到屏幕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8705276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com