Tag: opengl es

Sprite Kit会在后台还是在主线程中渲染? 它是如何工作的?

该文档显示了Sprite Kit的简化运行环境。 我正试图了解他们是如何实现它的。 SKView在SKScene上调用-update :。 这首先评估动作,然后模拟物理,并让子类调整场景。 在对场景进行修改之后, SKView最终将节点树渲染到屏幕上。 我不明白的是细节。 Sprite Kit是否通过使用不同的线程或GCD队列从场景渲染分离场景计算? 它是在后台执行所有的OpenGL渲染调用,还是在主线程中发生的一切? Sprite Kit在哪些点上在后台和主线程之间来回切换,以及如何同步处理场景和渲染场景呢? 当你的场景更新花费太长时间会发生什么?

glkView:drawInRect:和glkViewControllerUpdate之间的区别? OpenGL ES 2 – iOS

在我的渲染循环中,这两个方法之间应该有什么区别,明智的目的? 苹果有这个说…. 关于update() 视图控制器调用它的委托的glkViewControllerUpdate:方法。 您的委托应更新帧数据,而不涉及将结果呈现在屏幕上。 关于drawInRect: GLKView对象将其OpenGL ES上下文作为当前上下文,并绑定其帧缓冲区作为OpenGL ES渲染命令的目标。 你的委托方法应该绘制视图的内容。 所以基本上,当我在我的视图控制器中创build一个GLKView,该控制器成为delate,所以我正在看这些方法并排。 我认为update()应该包含任何转换或其他逻辑。

在OpenGL中绘制一个凹多边形

我需要在OpenGL中绘制一个凹多边形。 多边形被定义为形成其外环的点的列表,以及定义其内环(排除区)的列表的列表。 我已经可以处理禁区了,所以如何绘制一个没有内环的多边形的解决scheme也不错。 Boost.Geometry的解决scheme将会很好,因为我已经在我的应用程序中大量使用它。 我需要这个在iPhone上工作,即OpenGL ES(带有固定pipe道的旧版本)。 我怎样才能做到这一点?

使用GPUImagePoissonBlendFilter进行混合

我试图使用GPUImage框架的GPUImagePoissonBlendFilter混合两个脸在我的脸混合应用程序。 这是我的代码。 – (void)applyPoissonBlendToImage:(UIImage *) rearFace withImage:(UIImage *) frontFace { GPUImagePicture* picture1 = [[GPUImagePicture alloc] initWithImage:rearFace]; GPUImagePicture* picture2 = [[GPUImagePicture alloc] initWithImage:frontFace]; GPUImagePoissonBlendFilter * poissonFilter = [[GPUImagePoissonBlendFilter alloc] init]; poissonFilter.mix = .7; poissonFilter.numIterations = 200; [picture1 addTarget:poissonFilter]; [picture1 processImage]; [picture2 addTarget:poissonFilter]; [picture2 processImage]; finalResultImage = [poissonFilter imageFromCurrentlyProcessedOutputWithOrientation:rearFace.imageOrientation]; } 即你可以看到,我给了这个方法的两个图像(rearFace和frontFace)作为input。 图像正面是一个形状(通过连接相对眼睛和嘴的位置形成的多边形形状),并且具有与背面图像i.e相同的尺寸(为了匹配尺寸,我填充了多边形外部的空间在绘图时具有透明的颜色)。 但是混合不会像我预期的那样发生。 即正面的锋利边缘没有适当地混合到背面。 这里我的假设是PoissonBlendFilter从左上angular开始混合第二个图像,而不是脸部的左上边界。 问题:我觉得input图像没有正确input到滤镜中。 我是否需要对input图像应用某种遮罩? […]

更新iPad Retina的OpenGL ES触摸检测(光线追踪)?

我有下面的代码,我正在使用光线追踪。 该代码可以在非视网膜iPad上成功运行,但不能在视网膜iPad上运行。 触摸被检测到,但是转换后的点在左边,在下面。 任何人都可以build议如何更新下面以适应视网膜屏幕? – (void)handleTap: (UITapGestureRecognizer *)recognizer { CGPoint tapLoc = [recognizer locationInView:self.view]; bool testResult; GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); float uiKitOffset = 113; //Need to factor in the height of the nav bar + the height of the tab bar at the bottom in the storyboard. GLKVector3 nearPt = GLKMathUnproject(GLKVector3Make(tapLoc.x, (tapLoc.y-1024+uiKitOffset)*-1, 0.0), modelViewMatrix, projectionMatrix, […]

3D可旋转的立方体与两侧可点击的区域

我想要完成的是带有3D旋转立方体的iPad应用程序,并且在立方体的每一侧我想要定义多个区域,在这些区域中,一旦点击就会进入另一个视图或显示一个popup窗口。 这可以通过一些从头开始在Xcode中使用OpenGL ES来实现,或者我应该使用3D框架,如果是的话,那么最简单的框架是什么? (我只听说过Unity和它相当昂贵的) 有没有人有一个很好的教程,我学习如何做到这一点? 我已经尝试过3D CSS3转换,但是我想把它作为最后的手段。

SceneKit中的自定义顶点属性

我正在使用SceneKit来生成一些自定义几何。 这工作正常,但我努力find一种方法来包括自定义顶点属性。 具体来说,我期望在每个顶点包含一个额外的SCNVector3。 我发现很多使用shaderModifiers的例子包含了依赖于自定义统一值的GLSL / Metal代码,但还没有遇到包含顶点属性的方法 。 这是可能与SceneKit,或者是我的思想倒退?

iOS GLKit并返回到默认帧缓冲区

我正在运行XCode为iOS的OpenGL项目创build的锅炉板OpenGL示例代码。 这设置了一个简单的ViewController,并使用GLKit来处理剩下的工作。 应用程序的所有更新/绘制function都在C ++中。 它是跨平台的。 有很多帧缓冲创build正在进行。 绘制阶段渲染到几个帧缓冲区,然后尝试将其设置回默认帧缓冲区。 glBindFramebuffer(GL_FRAMEBUFFER, 0); 这会生成一个GL_INVALID_ENUM。 只在iOS上。 为什么我完全被难住了。 代码在除iOS之外的所有主要平台上运行良好。 我想要责怪GLKit。 任何不使用GLKit的iOS OpenGL设置示例? UPDATE 以下代码片段让我看到GLKit正在使用的默认帧缓冲区。 出于某种原因它出现为“2”。 果然,如果我在我所有的glBindFrameBuffer调用中使用“2”,它就可以工作。 这是非常令人沮丧的。 [view bindDrawable ]; GLint defaultFBO; glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &defaultFBO); LOGI("DEFAULT FBO: %d", defaultFBO); 究竟是什么原因会导致GLKit在0时不生成内部帧缓冲? 这是OpenGL使用的所有其他语义的语义,0是默认的FBO。

我如何在GLPaint中绘制背景图片和临时图纸?

我正在为iPad编写一个GLPaint-esque绘图应用程序,但是我碰到了一个绊脚石。 具体来说,我现在正在努力实现两件事情: 1)可以绘制到的背景图像。 2)绘制临时形状的能力,例如你可以绘制一条线,但最终的形状只有在手指抬起之后才能完成。 对于背景图片,我明白这个想法是将图像绘制到VBO中,然后在每一行绘制之前绘制图像。 这是好的,但现在我需要添加绘制临时形状的能力…与kEAGLDrawablePropertyRetainedBacking设置为YES(如在GLPaint)临时显然不是临时的! 将保留的背景属性设置为NO对临时对象非常有用,但是现在我以前的徒手画线没有保留。 这里最好的办法是什么? 我是否应该使用多个EAGLLayer? 我发现的所有文档和教程似乎都表明,大多数情况下,应该可以使用单层。 他们还说,保留的支持应该总是设置为NO。 有没有办法在这样的configuration中工作我的应用程序? 我尝试将每个绘图点存储到不断扩展的顶点数组中,以便重绘每个框架,但是由于绘制的精灵数量太多,所以无法正常工作。 我真的很感激任何帮助,因为我在网上search,没有发现任何东西!

从iOS中的屏幕外OpenGL像素缓冲区读取像素(OopenGL-ES)

我想从屏幕上读取像素(不支持CAEAGLLayer)Framebuffer。 我创build缓冲区的代码如下所示: glGenFramebuffersOES(1, &_storeFramebuffer); glGenRenderbuffersOES(1, &_storeRenderbuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, _storeFramebuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, _storeRenderbuffer); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, _storeRenderbuffer); glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_RGBA8_OES, w, h); 我阅读原始像素: glBindFramebufferOES(GL_FRAMEBUFFER_OES, _storeFramebuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, _storeRenderbuffer); glReadPixels(0, 0, _videoDimensions.width, _videoDimensions.height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(outPixelBuffer)); 这很好。 我可以渲染到这个缓冲区,并从它复制到屏幕上。 但我无法获得原始像素。 glReadPixel总是返回零,glReadBuffer似乎不存在。 我可以使用glReadPixels从屏幕帧缓冲区读取。 有任何想法吗?