问题标签 [grafika]

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 回答
155 浏览

android - 如何在ContinuousCaptureActivity中使相机预览区域为SurfaceView的一半

我想让相机预览的区域是SurfaceView的一半,所以我修改了ContinuousCaptureActivity的代码。详情如下:

用于GLES20.glViewport(0, 0, viewWidth / 2, viewHeight / 2);替换https://github.com/google/grafika/blob/master/src/com/android/grafika/ContinuousCaptureActivity.java#L436

但结果很奇怪,见下图。

在此处输入图像描述

我真的无法理解它,正确的方法是什么?

谁能给我一些建议?

0 投票
1 回答
764 浏览

android - 无法设置背景颜色并清除 EGL 中的输出

我已经尝试在 Android 中使用以下示例代码来学习 OpenGL。但我看不到预期的输出。请指出问题出在哪里?

我使用了 fadden 的贡献作为参考。

涂鸦法登

步骤1:

我用renderHandler 创建了renderThread。

我在 RenderThread 构造函数中收到的 userSurface。

现在,我在 Choreographer 回调机制的帮助下调用 doFrame() API 来在表面上绘制颜色。

注意:应用程序使用 TextureView 并以下列方式接收到表面。

问题:

我不确定我是否与 OpenGL 编码中的正确程序保持一致。此外,我没有看到表面显示任何颜色,而只有黑色。即使我什么都不做,我也会做黑色。

请提供输入。另外,让我知道我需要注意的缺失部分?

0 投票
2 回答
3645 浏览

android - 使用 Matrix 的 rotateM() 从 SurfaceTexture 旋转矩阵但损坏视频输出

我设法用opengl es播放视频,我使用了grafika的ContinuousCaptureActivity的方式,我的数据源是MediaPlayer而不是Camera,这没有什么区别。MediaPlayer 连续生成视频帧,我在 onFrameAvailable 回调中将每一帧绘制到屏幕上。代码如下,效果很好:

现在我想将视频帧旋转 270 度,所以我更改了代码:

但是结果很奇怪,看下图: 在此处输入图像描述

但我可以使用以下代码成功翻转视频帧:

如何实现旋转,有人可以帮我吗?

添加:

首先,我想说的是,我总是在每个绘制动作中使用这段代码:

我用这个demo来做我的测试,对于这个测试来说是一个很好的demo。 https://github.com/izacus/AndroidOpenGLVideoDemo

从surfacetexture得到的矩阵是:

1.0, 0.0, 0.0, 0.0

0.0, -1.0, 0.0, 0.0

0.0, 0.0, 1.0, 0.0

0.0, 1.0, 0.0, 1.0

"Matrix.setRotateM(videoTextureTransform, 0, 270, 0, 0, 1);"之后,

它变成了:

1.1924881E-8, -1.0, 0.0, 0.0

1.0, 1.1924881E-8, 0.0, 0.0

0.0, 0.0, 1.0, 0.0

0.0, 0.0, 0.0, 1.0

而这个视频效果是: 在此处输入图像描述

0 投票
1 回答
335 浏览

android - 将 Egl 配置的表面传递给本机并推送数据的问题

首先,感谢 fadden 提供的精彩示例。

我尝试遵循 这个ContinuousCapture.java 示例,并生成了以下程序。

1)

我试图通过获取其 ANativeWwindow 引用并使用 ANative lock 和 unlockpost 方法来获取 BufferQueue并填充数据,将图像显示到本机层的 TextureView 中。

IE:

2)

同时我想从这个 Surface 检索数据并将其传递给编码器。或者,将其显示到另一个表面。

作为第一步,我创建了下面的类,它将 EglCore 初始化到不同的线程中,并尝试在 EglContext 中配置用户给定的表面。到目前为止,一切都很好。但是,当我尝试通过 lock 和 unlockAndPost 方法将数据复制到缓冲区时,我收到以下错误。

问题: 这是正确的方法吗?或者我忽略了什么?

请帮助我。

0 投票
1 回答
520 浏览

android - 无法理解有助于异步显示的 BufferQueue 同步逻辑

我正在从此链接阅读 android 体系 结构

在第一次尝试时,除了零零碎碎的东西,我什么都不懂。

我明白什么?

1)

有一种叫做“同步框架”的东西。- 好的

2)

此同步框架可用于进程之间以及用户空间和内核空间之间。- 好的

3)

用于异步机制。- 好的。

4)

假设没有 Sync 框架。

有一个显示系统显示给定的缓冲区。

可能会有延迟,因为它是同步的。

5)

假设我们有同步框架支持。它是这样的:我会给显示系统缓冲区和 startfence,当你在 startfence 上收到信号时,你需要显示缓冲区。同时,当你完成后,你需要用donefence来亲近我。显示系统为我提供的。[我不完全理解,但我觉得它对异步模型有帮助],这样我就可以在系统渲染时填充缓冲区。

灰色区域:但是,我仍然无法编写伪代码来说明如何在异步模式下使用 display_buffer?

从android官方链接阅读段落。

最新的 Android 设备支持“同步框架”。这允许系统在与可以异步操作图形数据的硬件组件结合时做一些漂亮的事情。例如,生产者可以提交一系列 OpenGL ES 绘图命令,然后入队渲染完成之前的输出缓冲区。缓冲区伴随着一个栅栏,当内容准备好时发出信号。当缓冲区返回空闲列表时,第二个栅栏伴随着缓冲区,以便消费者可以在内容仍然存在时释放缓冲区正在使用中。随着缓冲区在系统中移动,这种方法可以改善延迟和吞吐量。

问题:

我对这种说法特别感到困惑。

“当缓冲区返回到空闲列表时,第二个栅栏会伴随缓冲区,以便消费者可以在内容仍在使用时释放缓冲区。当缓冲区在系统中移动时,这种方法可以改善延迟和吞吐量。”

同一缓冲区上的第二个栅栏?或不同的缓冲区?如我所见,有两个缓冲区队列,一个是填充列表,另一个是空列表。

0 投票
0 回答
397 浏览

android - 无法在android中从外部纹理到EGLSurface

当我尝试将纹理和变换矩阵渲染到 EGLSurface 时,视图中看不到任何显示。

作为此问题的后续,我通过遵循 grafika/fadden 示例代码连续捕获稍微修改了代码

这是我的代码:

这是一个在 RenderThread 上运行的绘制方法。

无论数据是在生产者端从本机代码生成的,此绘制方法都会被正确调用。

为了确认本机端的产品是否产生数据,如果我直接通过用户界面而没有任何 EGL 配置,则将帧渲染到屏幕中。

在原生级别,

渲染我使用的框架

我无法思考可能出了什么问题以及我必须在哪里挖掘更多?

感谢法登的帮助。

0 投票
0 回答
214 浏览

android - 使用android opengl es处理图像但输出图像在某个设备中很奇怪

我写了一个关于相机的演示,它类似于 grafika的 ContinuousCaptureActivity(ContinuousCaptureActivity.java 的源代码)。对于每一帧,除了将帧绘制到屏幕之外,我还添加了一些操作。

我创建了一个 fbo,然后将其绑定并将框架绘制到 fbo。为了检查渲染到 fbo 的图像,我使用 pbo 将图像数据读回 RAM,并每 50 帧将图像保存为 jpg。这样,我得到了jpg文件,但是它被缩放了,图片如下: 在此处输入图像描述

我认为来自 SurfaceTexture 的矩阵导致了缩放,因为每个 drawFrame() 都应用了该矩阵。所以我创建了另一个 fbo 并将第一个 fbo 的框架绘制到这个 fbo,然后我将图像保存为 jpg 并且图像按预期转好。看看这个: 在此处输入图像描述

所以结论是2次抽奖就能正确恢复图像。

但是我的华为手机(型号:华为MT7-CL00)图像很奇怪。看它: 在此处输入图像描述

我用华为手机检查了第一个 fbo 的图像,它按预期缩放,但并不奇怪。所以我认为错误发生在第二个 fbo 中。但我无法弄清楚原因。谁能给我一些建议?

一些源代码:

fbo定义:

GlTexture 和 GlFrameBuffer 类源码:

http://www.paste.org/80680

bindFbo 方法:

drawFrame() 中的关键代码:

0 投票
0 回答
1510 浏览

performance - glMapBufferRange() 很慢,映射数据的 memcpy() 在 Android 上也很慢

我设法编写了一个类似于 grafika 的 ContinuousCaptureActivity 的视频录制演示(ContinuousCaptureActivity.java 的源代码)。

不同的是,grafika 使用的是硬件编码,而我使用的是软件编码。对于软件编码,我使用 PBO 从 GPU 获取每个视频帧,速度非常快,并将图像数据复制到 ffmpeg,然后进行 h264 编码。

大多数设备的性能是可以接受的,glMapBufferRange() 用时不到5ms,memcpy() 用时不到10ms

但是在华为mate7的手机上性能较低。glMapBufferRange() 耗时 15~30ms,memcpy() 耗时 25~35ms。

我在 mate7 上测试过正常的 memcpy(),复制正常内存时速度要快得多。

真的很奇怪,谁能帮帮我?

设备信息:

在此处查看详细信息:华为 mate 7

pbo代码如下:

0 投票
1 回答
1856 浏览

android - Android - 高斯模糊效果 - OpenGL

在没有指定的地方,这个问题只是建立在 github 上CameraCaptureActivitygrafika项目之上。

它具有利用 3x3 内核的内置模糊效果

然而这种模糊效果还不够强,我正在寻找类似高斯效应在 iOS 上可以做什么的UIVisualEffectView东西,它看起来像这样:

一个很好的平滑重度模糊效果,但到目前为止,我管理的最好的是:

正如你所看到的,它几乎没有那么平滑而且有点方正。

我通过转换为使用这个方便的工具生成的 5x5 内核来实现这一点,该工具的 sigma 为 30,内核大小为 5。它产生以下结果:

为了在项目中工作,我Grafika必须在课堂上进行修改KERNEL_SIZEmTexOffsetTexture2dProgram

KERNEL_SIZE现在25mTextOffset现在计算如下:

有没有人对我可以修改什么以实现类似模糊的 iOS 有建议(我认为 iOS 也在减轻像素)?我认为我真正出错的地方是 setTextSize() 计算,特别是50.0f值,我刚刚从空气中提取了这个并观察了它的效果

0 投票
1 回答
1651 浏览

android - 使用 Grafika CameraCapture 代码拉伸 Android 相机预览

我正在寻求使用Grafika 的 CameraCaptureActivity代码时遇到的问题的帮助。我想构建一个可以记录相机并显示预览的应用程序,所以这个示例和代码看起来正是我想要的,到目前为止它很棒,这个问题 appart。

GLSurfaceView我遇到的问题是,当相机预览尺寸与我用来显示预览的确切尺寸不匹配时,它会显示拉伸预览。

这是它的外观:

预览拉伸

正如您所看到的,它是水平拉伸的,因为便条纸是一个完美的正方形。

对于三星 Galaxy S4 上的这个精确示例,相机预览大小为(使用API1280x720从可用预览大小中提取),并且将覆盖整个屏幕。Camera2GLSurfaceView1920x1080

什么时候出现?

与相机输出相比,当 SurfaceView 放大时会出现问题,即使我始终确保比率保持正确(1920x1080= 1,5 * 1280x720)。

你用的是什么代码?

我使用 Grafika 的代码,包括:

一些日志?

这是 SurfaceFlinger 转储的样子:

相机预览尺寸代码?

你试过什么?

我首先认为这是一个Camera2问题,所以我尝试只使用旧的 Camera API,但结果是一样的。

然后我认为这是一个比例问题,但正如你所看到的,这里的比例在水平和垂直方向上都可以。

我敢打赌,在调整 Surface 大小时会应用 OpenGL 转换,但我是 OpenGL 中的纯菜鸟,所以我找不到任何可行的方法。我尝试添加这些行,但没有帮助:

另一个来自 Grafika 的例子:

这是另一个来自 Grafika 应用程序的问题示例。

电话:Galaxy S3 Neo ( GT-I9301L) - Android 4.4.2

手机有一个1280x720屏幕,相机以640x480分辨率打开,显示为573x430. 这是它的外观:

在 GS3 Neo 上拉伸

SurfaceFlinger 日志:

Grafika 的应用日志:

所以...

如果你们中的一个人知道如何让它发挥作用,我很想听听他的意见。

谢谢!