问题标签 [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 投票
1 回答
547 浏览

c++ - glReadPixels 与 glPixelStore 的使用

我看了多个关于 glReadPixels 的教程,但我很困惑:

void glReadPixels(GLint x, GLint y, GLsizei 宽度, GLsizei 高度, GLenum 格式, GLenum 类型, GLvoid * 数据)

最后一个参数是无效的?我看到了教程,他们将参数声明为向量,无符号字符,GLubyte,......但它的真正含义是什么?你需要调用 glPixelStoref( , ) 吗?

0 投票
2 回答
777 浏览

opengl - 如何通过 CPU 停止 glReadPixels 转换数据格式?

众所周知,glReadPixels()会阻塞管道并使用 CPU 转换数据格式,尤其是当我想将深度值读取到系统 RAM 时。

我尝试了 Songho 提供的 PBO,但我发现它只有在 param ofglReadPixels()设置为 GL_BGRA 时才有用。

  • 当我将 PBO 与 param 一起使用时GL_BGRA,读取时间几乎为 0.1ms,CPU 使用率为 4%。
  • 当我将参数更改为 时GL_RGBA,它读取 2ms,CPU 使用率为 50%。

我尝试时也是如此GL_DEPTH_COMPONENT。显然缓慢是由转换引起的,所以任何人都知道如何阻止它转换数据格式?

在我的程序中,我必须在不到一秒的时间内读取深度值并计算 16*25 次,所以 2ms 是不可接受的。

0 投票
2 回答
1576 浏览

android - glReadPixels alpha 值问题

我在从 Android 上的 OpenGL 纹理读取 alpha 通道时遇到问题。我glReadPixels这样称呼:

作为一个测试,我做了一个片段着色器,看起来像这样:

对于每个像素,我返回 { 64, 64, 64, -1 }。

我已经尝试了各种方法来弄清楚为什么 alpha 的返回方式与 RGB 值不同,包括在每次渲染之前:

但无论我做什么,它都会返回-1。

这是Android限制还是我错过了什么?

请注意,如果有任何区别,我将使用屏幕外 FBO。

编辑:如果我这样做:

我回来了 { 8, 8, 8, 0 }。

0 投票
1 回答
2785 浏览

c# - 将 OpenGL 场景绘制到 C# 位图;屏幕外被剪辑

我将复杂的 2D 场景绘制到 OpenGL 窗口。我希望用户能够截取场景的屏幕截图并将其保存为 JPG。但是,我希望他们能够指定可以将场景绘制得比他们的屏幕大(这将使他们能够看到更多细节等)。

当他们指定大于适合他们屏幕的视口的数字时,他们不可见的所有内容都不会被绘制到位图上。我觉得我对其中一些我无法追踪的 OpenGL 函数的行为有错误的理解。

renderSize小于我启动程序的默认视口时,下面的代码工作得很好。如果renderSize更大,则会创建适当大小的 JPG,但超出屏幕可见区域的右侧/顶部部分只是空白。如果我在第二个显示器上单击并拖动视口,则会绘制更多图片,但如果renderSize比两个显示器都大,则仍然不是全部。我怎样才能使这个绘图独立于屏幕上显示的视口是什么?

(我可以验证renderLocationrenderSize在调用此函数时正确设置,renderSize并且数字很大,例如 7000 x 2000)

下面是我如何初始化我的 GL 窗口,以防万一。

0 投票
1 回答
3036 浏览

android - GL_INVALID_FRAMEBUFFER_OPERATION Android NDK GL FrameBuffer 和 glReadPixels 返回 0 0 0 0

我的 C++ 代码是为 iOS 设计的,现在我将它移植到 NDK 中,只做很少的修改。

我绑定帧缓冲区并调用

然后我像这样绑定主帧缓冲区

glGetError()返回GL_INVALID_FRAMEBUFFER_OPERATION

我可以在我的帧缓冲区中绘制并使用它的纹理在主帧缓冲区中绘制它。但是当我打电话时glReadPixels,我得到零

该代码在 iOS 中运行,大多数在 Android 中运行,除了glReadPixels

glCheckFramebufferStatus(GL_FRAMEBUFFER)返回 GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7

--

我将考虑示例代码,它将为我提供来自帧缓冲区或纹理的像素数据,我可以将其保存到文件中answer

现在我可以用附加的纹理绘制到缓冲区,我可以使用该纹理在主缓冲区上绘制。但我无法从帧缓冲区/纹理中获取像素以保存到文件或发布到 facebook。

0 投票
3 回答
1799 浏览

java - 使用 glReadPixels() 找到正确的上下文以截取屏幕截图

我正在尝试通过 glReadPixels() 直接从帧缓冲区读取,以便我可以从屏幕上的任何内容中截取屏幕截图。
我没有使用 GUI,而是在我触摸屏幕时打印屏幕的原始内容(这对于开始来说已经足够了)。

我现在一直在为我的 gl.glReadPixels() 函数获取正确的上下文。
因为我认为我现在得到的上下文与屏幕上的实际内容无关。

当我运行应用程序时,它会打印一个 libEGL 错误,上面写着

在没有当前上下文的情况下调用 OpenGL ES API(每个线程记录一次)

然后我让我的数组充满了零。

为了隐藏我的应用程序,我在清单中使用了以下行。

这是代码:

高度赞赏帮助:)

0 投票
1 回答
399 浏览

opengl - 如何快速读取OpenGL颜色缓冲区和深度缓冲区?

我必须每帧读取颜色缓冲区和深度缓冲区。我知道这个glReadPixels功能很慢,所以我想知道是否有更快的阅读方法。

0 投票
0 回答
858 浏览

opengl - glTexImage2D 给出 GL_INVALID_VALUE 因为宽度或高度不能表示为 2k + 2

我有一个从第一个 opengl 画布截取的屏幕截图,我需要在第二个 opengl 画布中绘制它。我使用以下方法截取了屏幕截图glReadPixels

第一个 opengl 画布有两个或多个图像,周围有一些线条和文本数据。我正在使用第二个 opengl 画布来显示图像与周围数据作为一个整体的平铺。我不想在第二个 opengl 画布中重新绘制相同的内容,因此想要截取屏幕截图并绘制屏幕截图的平铺部分在第二个画布中。

我还将拍摄的快照保存到一个完美的 jpg 文件中。

但是,当我需要使用 glTexImage2d 绘制像素数据时,问题就来了,因为所使用的 pageWidth 或 pageHeight 不能表示为 2K+ 2。因此错误为GL_INVALID_VALUE.

pageWidth 和 pageHeight 可以是任何值(小于GL_MAX_TEXTURE_SIZE),例如 240 X 600。那么我应该如何解决这个问题呢?

0 投票
2 回答
522 浏览

iphone - 显示屏幕截图生成的 UIImage 不在 UIImageView 中显示(仅适用于设备)

我正在尝试将 OpenGL 缓冲区(视图中当前显示的内容)保存到设备的照片库中。下面的代码片段在模拟器上运行良好。但对于实际设备,它正在崩溃。我相信我创建从屏幕捕获的 UIImage 的方式可能存在问题。

  • 此操作通过 IBAction 事件句柄方法启动。
  • 我用来保存图像的函数是 UIImageWriteToSavedPhotosAlbum(我最近将其更改为 ALAssetsLibrary 的 writeImageToSavedPhotosAlbum)。
  • 我已确保我的应用程序有权访问照片库。
  • 我还确保我的 CGImageRed 是全局定义的(在文件顶部定义)并且我的 UIImage 是一个(非原子,保留)属性。

有人可以帮我解决这个问题吗?我想要一个从 glReadPixels 数据生成的有效 UIImage 引用。

下面是相关的代码片段(调用保存到照片库):

* 更新 * 我想我已经设法缩小我的问题范围。我开始进行反复试验,在注释掉代码行后我运行应用程序(在设备上),以缩小范围。看起来我可能对TakeImageBufferSnapshot函数有问题,该函数获取屏幕缓冲区(使用 glReadPixels)并创建一个 CGImageRef。现在,当我尝试从中创建 UIImage 时(使用 [UIImage imageWithCGImage:] 方法,这似乎就是应用程序崩溃的原因。如果我将这一行注释掉,似乎没有问题(除了事实上我没有 UIImage 参考)。

我基本上需要一个有效的 UIImage 参考,以便我可以将其保存到照片库(使用测试图像似乎可以正常工作)。

0 投票
1 回答
165 浏览

java - 隐藏元素时 glReadPixels 失败

当我触摸屏幕时,glReadpixels 返回像素的 RGB。触摸后,我调用一个方法来隐藏具有相同 RGB 值的元素。在此之后,如果我触摸屏幕 glReadpixels 仅返回 0 值。

------------------------------Square.java------ --------------------------