Tag: opengl es

在iOS中将RGB像素数据高效地复制到屏幕上

我们的产品包含一种软件图像解码器,它主要产生需要快速复制屏幕(我们在iOS上运行)的全帧像素数据。 目前我们使用的是CGBitmapContextCreate,我们直接访问内存缓冲区,然后为每一帧调用CGBitmapContextCreateImage,然后将该位图绘制到屏幕上。 这对于在iPad的视网膜显示器上进行全屏刷新的速度太慢了,但是对于非视网膜设备来说也是可以的。 我们已经尝试了各种基于OpenGL ES的方法,包括使用glTexImage2D和glTexSubImage2D(本质上是渲染纹理),但CPU使用率仍然很高,我们无法获得超过30 FPS的全屏刷新在iPad 3上。问题是,在30 FPS下,CPU使用率接近于100%,只是将像素复制到屏幕上,这意味着我们没有太多的工作来处理我们自己在CPU上的渲染。 我们愿意使用OpenGL或任何可以提供最佳性能的iOS API。 像素数据被格式化为每像素32位的RGBA数据,但我们有一些灵活性… 有什么build议么?

Iphone像素失真,同时缩放Paint应用的OpenGL ES内容

我有一个openGL ES的一个奇怪的问题。 我正在为iPhone的绘画应用程序[从GLPaint应用程序引用]。在我的代码中,我正在使用包含大纲图像,我把[CAEAGLLayer] paintView填充颜色的imageView。 根据用户触摸的位置,通过屏幕上的绘图线填充轮廓图像中的颜色。 我使用“renderLineFromPoint”函数来绘制两点之间的一条线,使用“touchesMoved”获取起点和终点。 – (void) renderLineFromPoint:(CGPoint)start toPoint:(CGPoint)end{ //根据用户触摸的位置在屏幕上绘制一条线 static GLfloat* vertexBuffer = NULL; static NSUInteger vertexMax = 64; NSUInteger vertexCount = 0, count, i; [EAGLContext setCurrentContext:context]; glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); // Convert locations from Points to Pixels //CGFloat scale = self.contentScaleFactor; CGFloat scale; if ([self respondsToSelector: @selector(contentScaleFactor)]) { scale=self.contentScaleFactor; } else{ //scale = 1.000000; […]

OpenGL ES 2.0多个着色器程序 – 纹理渲染不再工作

我的应用程序绘制了点精灵和标准四方纹理的混合。 直到最近,我还是使用了一个着色器程序 – 但片段着色器中的一个分支(决定是否使用点精灵坐标/颜色)严重限制了我的渲染性能。 我的片段着色器最初看起来像这样: precision highp float; uniform sampler2D u_textureSprite; uniform bool u_isSprite; varying vec4 v_color; varying vec2 v_textureCoord; void main() { vec4 textureColor = texture2D(u_textureSprite, u_isSprite ? gl_PointCoord : v_textureCoord); if (u_isSprite) { gl_FragColor = v_color * textureColor; } else { gl_FragColor = textureColor; } } 在OpenGL ES编程指南中读取Apple的build议使得使用多个着色器程序听起来像是一件容易的事情…只需创build另一个正常的程序,并在相关绘制代码之前调用glUseProgram()。 但是,由于这样做,我不能让纹理渲染工作。 两个新的片段着色器是: pointSprite.fsh: precision highp […]

glViewport在Android和iOS中的不同结果

我刚刚开始使用opengl的跨平台框架(iOS和Android)的渲染器。 当我到视口的东西(这是分裂的东西所需要的),并注意到有一个iOS和Android之间的差异。 这里有两个图像。 Android其实还有另一个小故障。 它似乎包装。 iOS版 我的问题。 哪两个是正确的? 我没有应用任何转换,而是将绘制的四分音符稍微拉回来。 glTranslatef(0.0f,0.0f,-5.f); 初始化代码: glEnable(GL_TEXTURE_2D); glShadeModel(GL_SMOOTH); //Enable Smooth Shading glClearColor(0.f, 0.f, 0.f, 1.0f); //Black Background glClearDepthf(1.0f); //Depth Buffer Setup glEnable(GL_DEPTH_TEST); //Enables Depth Testing glDepthFunc(GL_LEQUAL); //The Type Of Depth Testing To Do //Really Nice Perspective Calculations glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 视口和项目代码 glViewport(viewportX, viewportY, viewportW, viewportH);. glEnable(GL_SCISSOR_TEST); glScissor(viewportX, viewportY, viewportW, viewportH); glMatrixMode(GL_PROJECTION); […]

我怎样才能访问一个opengl 2屏幕渲染缓冲区的原始像素数据?

我可以渲染到屏幕上,但我希望能够访问由着色器渲染的原始像素。 我知道如何使用glReadPixels的唯一方法是屏幕上,但我想访问它们,然后画到屏幕上,以保存帧到磁盘。 具体来说,我想使用着色器来处理从不显示的图像:1)从磁盘2抓取图像)渲染它3)输出回磁盘。

多个EAGLViews,但每个纹理只有一个副本 – 如何?

我有一个在iPad上运行的应用程序,它使用了大量的纹理,渲染成一个EAGLView。 现在我需要第二个EAGLView,与第一个共享纹理。 我可以在屏幕上通过修复苹果代码中的一些devise错误(例如,默认的ViewController需要一些调整来支持多个子EAGLView对象)来同时呈现两个视图。 但是我无法获得共享的纹理。 我不能复制纹理(这会增加内存使用量,而且我们已经使用了大部分内存)。 我找不到任何有关如何在多个EAGLView之间共享纹理的文档 – 有一些“提示”,这就是EAGLShareGroup的作用,允许每个GLView有自己的上下文,但是共享一个ShareGroup的两个上下文没有明确的我可以find。 我试着按照这个问题的答案: 如果使用多个EAGLViews,则不绘制纹理 …但这不是一个真正的答案。 它指出EAGLSharegroup没有真正解释如何使用它 – 这似乎没有任何区别。 它也间接地指向了一个关于从多个线程渲染的页面 – 这是一个完全不同的问题,我没有任何列出的问题(应用程序崩溃等)。

SceneKit – 将立方体贴图映射到框

我看起来像一个立方体的纹理 我想在SceneKit视图中的立方体上使用它。 我正在使用SceneKit几何SCNBox 。 不幸的是,结果是纹理完全投射到每个面上,而不是仅使用相应的部分: let videoGeometry = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0) videoGeometry.firstMaterial?.isDoubleSided = true videoGeometry.firstMaterial?.diffuse.contents = UIImage(named: "test")! 我知道我可以在几何体上使用着色器修改器,但是我不确定从哪里开始。 由于纹理目前使用了六次,我的直觉是SCNBox几何可能不适合我的目标,但是我不知道如何改变它。

OpenGL-ES字体呈现(在iOS上)…合理性检查

我正在为iOS编写游戏。 它有一个游戏地图,我用OpenGL来绘制它,因为其他选项太慢了。 我在地图上有单位,用字母表示,一个拉矮人堡垒 。 但是,在OpenGL中渲染文本。 我目前正在使用一个性能调整的Texture2D突变体,这个突变体已经足够原型了,但是它有各种各样的问题,而且对我来说也不是很好。 看来,这样做的尝试和真正的方法是生成一个“目录”的图像文件,所有的字母呈现在一个字体,然后映射到纹理当你想要渲染它们(参见这里 )。 不过,我在地图上放大缩小了很多。 加上视网膜显示加上iPad将需要多个分辨率。 丑陋。 思考一定有更好的办法,我检查了FTGLES ,它可以在iOS / OpenGLES上dynamic呈现TTF / OTF字体。 这不是即插即用的。 我已经摔了两天,甚至接近工作,但我认为我已经有了黄金的道路。 所以…我疯了吗? 我为自己创造更多的工作吗?

将离屏SCNScene渲染到UIImage中

我怎样才能渲染一个离屏的 SCNScene到UIImage ? 我知道SCNView提供了一个-snapshot方法,但不幸的是这对于离屏视图不起作用。 在其中一个答案build议使用glReadPixels从OpenGL读取位图数据之前,也曾经有过类似的问题 ,但是这种方法对于我来说不适用于离屏场景。 我试图使用SCNRenderer没有成功的渲染到GLKView的上下文中。

在Google Maps SDK for iOS上执行GMSMapView的屏幕截图

当我尝试拍摄GMSMapView(Google Maps SDK iOS)的任何部分时,我正在努力的一个项目。 UIGraphicsGetImageFromCurrentImageContext()UIImage输出是不可见的。 我最终发现,GMSMapView是用OpenGL渲染的。 知道这一点,我试图使用glReadPixels()方法。 令人不安的是,我能够在iPhone模拟器上检索地图屏幕截图,但是当我在真实设备上使用同样的方法时,它仍然是不可见的(iOS 6)。 我想知道是否有人遇到同样的问题? 我已经做了我的调查份额。 我找不到与我的情况有关的任何事情。 我发现的大多数通用解决scheme都说我应该更新一些CAEAGLLayer属性。 我认为GMSMapView会限制我find适当的层,但是我能够find并更新CAEAGLLayer,如下所示: [(CAEAGLLayer *)[[[mapView_ subviews] objectAtIndex:0] layer] setOpaque: NO]; [(CAEAGLLayer *)[[[mapView_ subviews] objectAtIndex:0] layer] setDrawableProperties:[NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES],kEAGLDrawablePropertyRetainedBacking,kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat,nil]]; 论坛build议通过将图层的OPAQUE属性设置为NO,并将保留的后台属性设置为YES,可以缓解iOS 6问题。 它确实在模拟器上,但不是设备。 我偶然发现的最后一个修复程序说要将主OpenGL视图的preserveBackBuffer更新为YES。 这是我的技术专长结束的地方。 我一直无法find在哪里或如何更新GMSMapView的preserveBackBuffer值。 我假设这是修复所有我的屏幕捕获问题的修复。 似乎只是运行iOS 6 +的设备的一个问题。 有没有人有这个问题的testing解决方法?