Iphone 如何使用OpenGL ES将像素数据blit到屏幕上?

Iphone 如何使用OpenGL ES将像素数据blit到屏幕上?,iphone,objective-c,opengl-es,pixels,Iphone,Objective C,Opengl Es,Pixels,我目前正在学习OpenGL ES for iPhone,我想知道如何获取一组RGB像素数据并将其显示到屏幕上,到目前为止,我找到的所有教程都包括将预先存在的图像加载到纹理中并显示它 下面是我如何使用Core Graphics通过创建imageref,然后使用UIImage和UIImageView完成的: int screenWidth = (int)[[UIScreen mainScreen] bounds].size.width; int screenHeight = (int)[[UIScr

我目前正在学习OpenGL ES for 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);

我可以用OpenGL ES(目前使用的是1.0)而不是核心图形来实现这一点吗

您可以使用
glTexImage2D
(http://www.opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml)或
glTexSubImage2D
(http://www.opengl.org/sdk/docs/man/xhtml/glTexSubImage2D.xml).
glTexSubImage2D
主要用于实时更新纹理

e、 g.对于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).

创建一个全屏四元组,并编写一个小着色器,将像素数据作为纹理2D,并在没有照明的情况下填充。texBuffer是GLuint格式还是Glubyte?好吧,您可以将texBuffer声明为
GLuint texBuffer[texWidth*texHeight]
-关键是大小等于
sizeof(Glubyte)*4*texWidth*texHeight
。(4在本例中,假设您需要4个组件-即RGBA)。当您在调用
glTexImage2D
之前填充texBuffer时,差异就会出现(在缓冲区中设置该像素之前,您需要将4个组件打包到一个uint中)。请注意,您将保持glTexImage2D调用相同。
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);