问题标签 [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.
qt - OpenGL + QT:渲染到纹理并显示回来
经过一些麻烦后,我设法在 Qt 4.8 应用程序中正确渲染到帧缓冲区对象内的纹理:我可以使用 QGLWidget 打开 OpenGL 上下文,渲染到 FBO,并将其用作纹理。
现在我需要显示在 QPixmap 中渲染的纹理,并将其显示在 gui 的其他一些小部件中。但是..什么都没有显示。
这些是一些代码:
我看到小部件打开了,但是......里面什么都没有。如果我取消测试线..我看到“dudee”字符串,所以我知道有一个 qlabel 但是..没有来自 QPixmap 的图像。
我知道原始数据是“unsigned char”,我正在使用“char”,并且尝试了一些不同的颜色参数(“GL_RGBA”、“GL_RGB”等),但我认为这不是重点。 ..关键是我什么都没看到..
有什么建议吗?如果我必须发布更多代码,我会这样做!
编辑:
我没有发布所有代码,但我想明确的是纹理被正确渲染为立方体内的纹理。我只是无法将它从 gpu 放回 cpu
编辑2:
感谢 peppe 的回答,我发现了问题:我需要一个 Qt 对象,它接受一些原始像素数据作为构造函数。这是完整的片段:
opengl-es - 带有 FBO 的 glReadPixels 在 iOS 上崩溃
在 FBO 上调用 glReadPixels 时,我遇到了一些间歇性崩溃。目前在我的实时应用程序中每天导致超过 1000 次崩溃。
我将在下面包含用于读取像素和生成 FBO 的代码。如果需要,很高兴包含使用的其他代码。
崩溃日志如下所示(有一些变化):
android - 从 PBuffer 读取时,glCopyTexImage2D 不适用于 GL_RGBA
我在带有 OpenGL ES2 的 Android 上使用 NDK。
- 我使用 eglCreatePbufferSurface 创建 PBuffer 表面,分辨率为 1024x576。我使用 GL_RGBA 格式。每个颜色分量 8 位。
- 从位图中加载纹理并将其粘贴到表面上。调用 glFlush()。
- 比我创建另一个纹理并使用 glCopyTexImage2D 将帧缓冲区读入这个纹理。纹理内部格式为 GL_RGBA。
- 我再次将新纹理粘贴到同一个帧缓冲区上。调用 glFlush()。
- 最后调用 glReadPixels 读取帧缓冲区并将其保存为 Bitmap。
结果是像素化的:
我所有的纹理都有这些参数:
此外,如果我使用窗口表面而不是 PBuffer 并在屏幕上绘制结果,它是正确的并且没有像素化。
我尝试的另一件事是将原始纹理渲染到 PBuffer 并立即从缓冲区读取像素。无需额外使用 glCopyTexImage2D。结果也是正确的。
如果我将 glCopyTexImage2D 内部格式从 GL_RGBA 更改为 GL_RGB 一切正常。我的 PBuffer 颜色空间格式是 RGBA。
更新:我的代码在模拟器上似乎可以正常工作,但在 Nexus 7 设备上却不行。
那么为什么当我使用带有 GL_RGBA 格式的 glCopyTexImage2D 时它会像素化呢?
opengl - glReadPixels 或 glCopyTexSubImage2D 太慢?
我需要绘制N遍,对于每遍,我从fbo读取一个像素,我发现每次读取一个像素太慢了。然后,我使用另一个纹理(rectange:N*1) 来缓存像素,这意味着对于每次传递,我将一个像素复制到结果纹理。N次通过后,我读取了一次结果纹理。但是,它也太慢了。例如,读取结果纹理 (200*1) 需要 13 毫秒。
我想知道是否有另一种方法可以解决这个问题。
我还解决了一些关于像素缓冲区对象的帖子,它以异步方式工作。但是,在最后一次通过后,我需要立即从结果纹理中得到结果。cpu 和 gpu 都没有其他工作。
android - 如何在 Android 中保存相机拍摄的图片(应用 glsl 效果)?
我已经通过 OpenGL ES 2.0 着色器对相机预览应用了一些效果。接下来,我要保存这些效果图(灰度、负片……)
我在 onDrawFrame() 中调用 glReadPixels(),根据从 opengl 帧缓冲区读取的像素创建位图,然后将其保存到设备存储中。
但是,这样,我只是“快照”了相机效果预览。换句话说,保存的图像分辨率(例如:800*480)与 Camera.PictureCallback 拍摄的图像(例如:1920 * 1080)不同。
我知道预览大小可以通过 setPreviewSize() 改变,但最终不能等于图片大小。
那么,是否可以使用 glsl 着色器直接对 Camera.PictureCallback 获取的图像进行后期处理?或者还有其他方法可以实现相同的目标?
任何建议将不胜感激。谢谢。
opengl - 修改现有的 opengl 应用程序以呈现到 PBO(并从那里到文件)?
我想修改现有的 OpenGL 应用程序以渲染到 PBO,然后读取 PBO 以生成最初要渲染到屏幕的编码视频。由于性能是关键,我不能像以前那样通过从后台缓冲区执行 glReadPixels 来停止管道。我想知道是否有一种简单或直接的方法可以将渲染的所有内容重定向到帧缓冲区并使其转到 PBO。换句话说,我不在乎它是否没有显示在屏幕上。事实上,我宁愿屏幕上什么也不显示。
android - 如何在 Android 中通过 OpenGL ES 2.0(有效)保存大纹理
现在,我可以通过使用 glReadPixels() 来读取帧缓冲区 (FBO) 中的数据来保存纹理。但是,我遇到了两个问题。
(1)为了保持保存的图像质量,尺寸会大于GL_MAX_TEXTURE_SIZE(大多数设备是4096)。如果我创建了大纹理(例如:4160x3120),则在调用 glCheckFramebufferStatus() 时出现 GL_FRAMEBUFFER_UNSUPPORTED 错误...。
(2) 如果我创建了小纹理(例如:3648x2736),除了 glReadPixels() 之外的一切都会很慢......
所以回到我的问题,是否有可能克服最大纹理大小限制并有效地保存它?谢谢。
android - 使用 PBuffers 时 glReadPixels 在某些 android 设备中失败
我遇到了一些 opengl ES 驱动程序的问题,当为 Pbuffer 调用 glReadPixels 时,某些设备只会杀死应用程序而没有任何消息。其他人会给我下一个跟踪,然后冻结大约 10 秒钟,然后终止应用程序。
到目前为止,问题可重现的受影响设备是:
我还在下一个设备中测试了代码,它可以按预期正常工作,完全没有问题:
我已经组合了一个快速测试功能来重现问题。也许有人可以发现问题。请这只是一种测试方法,没有必要对其进行评论,因为我只是将它放在一起以测试错误,如果我遗漏了什么,请告诉我。
android - OpenGL ES 3.0 在 Android 中的 glReadPixels 性能提升
我找到了一些通过 OpenGL ES 3.0 加速 glReadPixels 的方法,但我不确定它是否有效。
- 将glReadPixels()的第五个参数指定为GL_BGRA以避免不必要的混乱。
- 如上所述使用PBO。_
为了验证,我更新到最新的Android SDK和ADT,并尝试使用OpenGL ES 3.0。但是,我找不到GL_BGRA
我预期的定义,也不知道如何使用glMapBuffer()
. 我错过了什么吗?
总结一下,
- 除了使用 glReadPixels() 之外,还有其他更快的方法来访问帧缓冲区吗?
- 如何在 Android 上通过 OpenGL ES 3.0 使用 GL_BGRA 和 PBO?
如果有人知道,请指出我。一些代码片段会更好。提前致谢。