问题标签 [glreadpixels]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
7376 浏览

ios - 像素格式,CVPixelBufferRefs 和 glReadPixels

glReadPixels用来将数据读入CVPixelBufferRef. 我将CVPixelBufferRef用作 的输入AVAssetWriter。不幸的是,像素格式似乎不匹配。

我认为glReadPixels返回RGBA格式的像素数据,而AVAssetWriter想要ARGB格式的像素数据。将RGBA转换为ARGB的最佳方法是什么?

这是我到目前为止所尝试的:

  • 沿 argb = (rgba >> 8) | 行的位操作 (RGB << 24)
  • 使用 aCGImageRef作为中间步骤

位操作不起作用,因为 CVPixelBufferRef 似乎不支持下标。中间CGImageRef步骤确实有效......但我不希望有 50 行可能会影响性能的额外代码。

0 投票
1 回答
5708 浏览

android - glReadPixels 太慢无法使用

我使用.方法 glReadPixels定期拍摄快照。我需要定期拍摄此快照,以根据我的应用程序要求继续保存我的数据。drawFrameGLSurfaceView.Renderer

然而glReadPixels,性能真的很慢并且显示出滞后。这是我使用该方法的方式:

有替代使用glReadPixels吗?如何保存图像而不会造成延迟?

0 投票
1 回答
1724 浏览

android - android 支持比 glreadpixels 更好的方法?

我正在制作安卓游戏。(使用andengine)我需要记录游戏画面。这不是为了制作宣传视频,而是为了让游戏玩家回顾他们的游戏。我的应用程序应该自己录制视频。所以我无法使用市场上可用的录音应用程序来解决这个问题。我已经检查了下面的代码。

http://code.google.com/p/andengineexamples/source/browse/src/org/anddev/andengine/examples/ScreenCaptureExample.java?spec=svn66d3057f672175a8a21f9d06e7a045942331f65c&r=66d3057f672175a8a21f9d16e7a0459423

它工作得很好..但我想录制游戏视频,而不是一个截图。

至少我需要 24fps 才能顺利回放,但如果我使用 glreadpixels ,我可以在我的 xoom 设备上获得 5 fps。我搜索了各种网站来解决这个优化问题。大多数人说 glreadplxels 录制视频太慢了。

http://www.gamedev.net/topic/473794-glreadpixel-takes-tooooo-much-time/

他们推荐 glcopyteximage2d 而不是 glreadpixels。因为 glcopyteximage2d 比 glreadpixels 快得多。但我找不到如何在andengine中使用glcopyteximage2d。甚至有人说android opengl ES 不支持glcopyteximage2d。

也许存在另一种方法来录制流畅的视频。它是 android 设备的读取帧缓冲区。市场上的大多数录音应用程序都使用这种方法。但这些应用程序需要 root 权限才能获取帧缓冲区。我读过一些消息,Android 将在姜饼之后支持从 suface_flinger 捕获屏幕。

但我不知道如何在没有 root 权限的情况下使用帧缓冲区。T_T

这些是我的猜测解决方案。

  1. 使用另一个比 glreadpixels 速度更快的 opengl API。

  2. 发现一些android API可以在没有root权限的情况下获取framebuffer。(也许我可以访问 android SURFACE_FLINGER ??)

  3. 绘制另一个屏幕外纹理来录制视频。

但我不知道如何实现这些方法。哪种方法是正确的?你有为安卓录制视频的示例代码吗?请帮我解决这个问题。如果您知道任何其他方法,那将很有帮助。

任何帮助将不胜感激

0 投票
1 回答
371 浏览

opengl-es - iOS 5 短信通知导致 glreadpixels 崩溃

我们的应用程序使用 glreadpixels 在每一帧上捕获屏幕。在 iOS 5 设备上,当您收到短信(或任何其他通知,我假设)时,应用程序在glreadpixels通话时崩溃。

崩溃只发生在 iOS 5 上,带有新样式的通知(从顶部向下滑动并在不久之后消失的通知)。在 iOS 4 上,旧式UIAlertView通知可以正常工作。

具体来说,调用会glReadPixels()引发EXEC_BAD_ACCESS错误。

具体调用是

在哪里

(应用程序仅处于横向模式)

我们还尝试在发出读取命令之前检查帧缓冲区的状态,glCheckFramebufferStatus(GL_FRAMEBUFFER)总是返回GL_FRAMEBUFFER_COMPLETE

这是如何实现新通知弹出的错误吗?我们如何解决它?如果我们能够检测到通知即将出现,并暂停调用glreadpixels直到它消失,那也是可以接受的。

谢谢,

蒂姆

0 投票
1 回答
3492 浏览

opengl-es - 带有 FBO 的 glReadPixels 太慢了

我正在使用 openGL ES 2.0 和 GLSL 着色器,并使用 Renderbuffer 处理 FBO,也就是离屏渲染。
它适用于30 fps
但是当我使用 glReadPixels 或 glcopyteximage2d 时,它会下降到8 fps
我做了类似的事情:

无论如何我可以提高速度吗?我的意思是当我不使用 FBO 并使用具有相同参数的 glReadPixels 时,它的工作速度为15 fps,我认为使用 FBO 可以提高速度?

0 投票
2 回答
2391 浏览

android-ndk - Android NDK glReadPixels() 来自屏幕外缓冲区

我正在使用 android ndk 编写游戏。我正在使用pick来选择opengl中的对象。为此,我有一个屏幕外帧缓冲区对象,我在其中渲染并使用 glReadPixels() 从 FBO 获取颜色。然后颜色对单击对象的 id 进行编码。

问题是 glReadPixels() 不起作用。它只是不读取任何颜色值。有什么我必须做的,让它工作吗?

这就是我尝试使用 readpixels 的方式。但结果始终是 (0,0,0,0)。我检查了坐标(x,y)。他们很好。根据 opengl 文档,任何 opengl es 2.0 实现也应该支持 GL_RGBA、GL_UNSIGNED_BYTE 组合。

我已经阅读了一些关于我必须在 android 清单中设置的权限的内容。我试图添加这样的权限:

但它也没有用。

有谁知道解决方案可能是什么?或者我可以在哪里看?

0 投票
5 回答
4716 浏览

ios - 将 RGBA 转换为 ARGB (glReadPixels -> AVAssetWriter)

我想在AVAssetWriter. 问题出现了,从 OpenGL 帧缓冲区访问像素的唯一方法是使用 glReadPixels,它仅支持 iOS 上的 RGBA 像素格式。但AVAssetWriter不支持这种格式。在这里,我可以使用 ARGB 或 BGRA。由于可以忽略 alpha 值,我得出的结论是,将 RGBA 转换为 ARGB 的最快方法是给 glReadPixels 缓冲区移动一个字节:

问题是,glReadPixels调用会导致EXC_BAD_ACCESS崩溃。如果我不将缓冲区移动一个字节,它就可以完美地工作(但显然视频文件中的颜色错误)。这里有什么问题?

0 投票
2 回答
16507 浏览

c++ - 将数据从 glReadPixels() 转换为 OpenCV::Mat

我想使用glReadPixels()从动画中获取每个 OpenGL 帧并将数据转换为OpenCV::Mat。我知道glReadPixels()从下一行到上一行,从左到右逐行获取数据。另一方面,OpenCV 以不同的方式存储数据。

有人知道任何库或任何教程/示例可以帮助我将数据从glReadPixels转换为C++ 中的OpenCV:Mat吗?

概括

0 投票
3 回答
2571 浏览

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

我正在为客户开发增强现实应用程序。OpenGL 和 EAGL 部分已在 Unity 3D 中完成,并在我的应用程序中实现为视图。

我现在需要的是一个按钮,它可以捕捉 OpenGL 内容的屏幕截图,这是最后面的视图。

我尝试自己编写它,但是当我单击分配了 IBAction 的按钮时,它只保存了屏幕的 1/4(左下角)——尽管它确实将它保存到了相机胶卷中。

所以基本上,我怎样才能让它保存整个屏幕尺寸,而不是四分之一?

这是我的方法代码:

0 投票
1 回答
5338 浏览

ios - 使用 OpenGL ES 纹理缓存而不是 glReadPixels 来获取纹理数据

在 iOS 5 中,引入了 OpenGL ES 纹理缓存,以提供从相机视频数据到 OpenGL 的直接方式,而无需复制缓冲区。在WWDC 2011 的第 414 节——iOS 5 的 OpenGL ES 进展中对纹理缓存进行了简要介绍。

我发现了一篇有趣的文章,它最终进一步滥用了这个概念,并glReadPixels通过简单地锁定纹理来绕过调用,然后直接访问缓冲区。

glReadPixels由于 iPad 2 中使用的基于 tile 的渲染器(即使您只使用 1x1 纹理),它真的很慢。但是,所描述的方法似乎比glReadPixels.

文章中提出的方法是否有效,是否可以用于提升依赖的应用程序glReadPixels

由于 OpenGL 与 CPU 并行处理图形数据,CVPixelBufferLockBaseAddress调用如何知道渲染何时完成而不与 OpenGL 对话?