Tag: glreadpixels

glReadPixels只保存1/4屏幕大小的快照

我正在为客户端开发增强现实应用程序。 OpenGL和EAGL部分已经在Unity 3D中完成,并在我的应用程序中实现了View。 我现在需要的是一个button,捕捉OpenGL内容的屏幕截图,这是最后面的视图。 我试图自己写,但是当我点击一个button与分配的IBAction,它只保存了1/4的屏幕(左下angular) – 虽然它确实保存到相机胶卷。 所以基本上,我怎样才能保存整个screenize,而不是只有四分之一? 这里是我的代码的方法: -(IBAction)tagBillede:(id)sender { UIImage *outputImage = nil; CGRect s = CGRectMake(0, 0, 320, 480); uint8_t *buffer = (uint8_t *) malloc(s.size.width * s.size.height * 4); if (!buffer) goto error; glReadPixels(0, 0, s.size.width, s.size.height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, buffer, s.size.width * s.size.height * 4, NULL); if […]

在使用深度缓冲和抗锯齿技术时,通过glreadpixel()读取数据时出现问题

我想用glreadpixel()捕捉我的游戏画面。 它也可以在2g iphone上使用ios版本3.1.1在模拟器上正常工作。 但与iOS 4.2.1版本的iPad没有。 我来了解这个问题。 对于特定设备(ipad)上面的ios版本4.0,我们绑定深度缓冲区并使用抗锯齿技术。 当我们使用opengl的glreadpixel()从帧缓冲区捕获数据返回目标缓冲区中的所有0 … 如果我们不把深度缓冲区绑定到帧缓冲区,并且不使用抗锯齿技术,它就可以正常工作。 我使用的代码是: CGRect screenBounds = [[UIScreen mainScreen] bounds]; int backingWidth = screenBounds.size.width; int backingHeight =screenBounds.size.height; NSLog(@"width : %f Height : %f",screenBounds.size.width,screenBounds.size.height); CGSize esize = CGSizeMake(screenBounds.size.width, screenBounds.size.height); NSInteger myDataLength = esize.width * esize.height * 4; GLuint *buffer = (GLuint *) malloc(myDataLength); glReadPixels(0, 0, esize.width, esize.height, GL_RGBA, GL_UNSIGNED_BYTE, […]

使用OpenGL ES纹理caching而不是glReadPixels来获取纹理数据

在iOS 5中,引入了OpenGL ES纹理caching,以提供从摄像机video数据到OpenGL的直接方式,而无需复制缓冲区。 在会话414 – WWDC 2011的OpenGL ES for iOS 5中进行了纹理caching的简要介绍。 我发现了一篇有趣的文章 ,最后进一步滥用了这个概念,并且通过简单地locking纹理,然后直接访问缓冲区来绕过对glReadPixels的调用。 由于iPad 2中使用的基于图块的渲染器(即使只使用1×1纹理), glReadPixels的速度非常慢。 但是,所描述的方法似乎处理比glReadPixels更快。 文章中提出的方法是否有效,是否可以用来提升依赖glReadPixels应用程序? 由于OpenGL处理​​与CPU并行的graphics数据, CVPixelBufferLockBaseAddress调用如何知道什么时候渲染完成而不与OpenGL交谈?

glReadPixel停止使用iOS6 Beta

可能重复: 为什么glReadPixels()在iOS 6.0的代码中失败? 我目前在使用Cocos2D框架的Appstore中有一个App。 对于碰撞检测,我使用glReadPixels。 屏幕只有白色和黑色像素,检测黑色像素意味着碰撞。 一切工作正常的iOS 5.1.1,但在iOS6 Beta(所有这些)glReadPixels停止工作。 现在glReadPixels返回的RGB值总是0,0,0。 有没有人有一个想法出了什么问题或如何解决? 非常感谢您的帮助!

OpenGL ES到iOS中的video(渲染为具有iOS 5纹理caching的纹理)

你知道苹果的CameraRipple效果的示例代码? 那么我试图在openGL完成水的所有酷的效果之后将相机输出logging在文件中。 我用glReadPixels完成了这个工作,在这里我读取了void *缓冲区中的所有像素,创buildCVPixelBufferRef并将其附加到AVAssetWriterInputPixelBufferAdaptor中,但速度太慢,因此readPixels需要大量的时间。 我发现使用FBO和纹理现金你可以做同样的事情,但更快。 下面是我在Apple使用的drawInRect方法中的代码: CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)_context, NULL, &coreVideoTextureCashe); if (err) { NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d"); } CFDictionaryRef empty; // empty value for attr value. CFMutableDictionaryRef attrs2; empty = CFDictionaryCreate(kCFAllocatorDefault, // our empty IOSurface properties dictionary NULL, NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); attrs2 = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); […]

将RGBA转换为ARGB(glReadPixels – > AVAssetWriter)

我想在AVAssetWriter的帮助下将使用OpenGL渲染的图像logging到电影文件中。 问题出现了,从OpenGL framebuffer访问像素的唯一方法是使用glReadPixels,它只支持iOS上的RGBA-pixel格式。 但AVAssetWriter不支持这种格式。 在这里,我可以使用ARGB或BGRA。 由于alpha值可以忽略不计,我得出的结论是,将RGBA转换为ARGB的最快方法是将glReadPixels的缓冲区移位一个字节: UInt8 *buffer = malloc(width*height*4+1); glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer+1); 问题是, glReadPixels调用导致EXC_BAD_ACCESS崩溃。 如果我不移动一个字节的缓冲区,它完美的作品(但显然在video文件颜色错误)。 这里有什么问题?

使用glReadPixel()与多重采样读取数据

目前我正在尝试从帧缓冲区中读取像素数据以捕获IOS中的屏幕。 使用下面的代码来设置帧缓冲区时,GlreadPixels命令工作正常。 //buffers // Create a depth buffer that has the same size as the color buffer. glGenRenderbuffersOES(1, &m_depthRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_depthRenderbuffer); glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT24_OES, width, height); // Create the framebuffer object. glGenFramebuffersOES(1, &framebuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, m_colorRenderbuffer); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, m_depthRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer); 但是当我使用深度缓冲区和颜色缓冲多采样glreadpixels()不捕获任何像素数据像以前的代码….多采样我使用以下代码: – glGenFramebuffersOES(1, &sampleFramebuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, sampleFramebuffer); //GLuint sampleColorRenderbuffer; glGenRenderbuffersOES(1, […]

像素格式,CVPixelBufferRefs和glReadPixels

我使用glReadPixels将数据读入CVPixelBufferRef 。 我使用CVPixelBufferRef作为CVPixelBufferRef的input。 不幸的是,像素格式似乎是不匹配的。 我认为glReadPixels正在返回RGBA格式的像素数据,而AVAssetWriter ARGB格式的像素数据。 将RGBA转换成ARGB的最佳方法是什么? 以下是我迄今为止所尝试的: 按照argb =(rgba >> 8)|的方式进行位操作 (rgba << 24) 使用CGImageRef作为中间步骤 位操作不起作用,因为CVPixelBufferRef似乎不支持下标。 CGImageRef中间步骤可以工作,但是我不希望有50多行代码可能会影响性能。

用glReadPixels读纹理字节?

我想将原始纹理数据转储到磁盘(稍后回读),我不确定glReadPixel会从当前绑定的纹理中读取。 我怎样才能从我的纹理读取缓冲区?