如何直接写入linux framebuffer?
我一直在努力解决这个问题,而且这个代码对我来说不明原因崩溃了.我正在创建一个FBO,绑定一个纹理,然后第一个glDrawArrays()在我的iPhone模拟器上崩溃了"EXC_BAD_ACCESS".
这是我用来创建FBO的代码(并绑定纹理和......)
glGenFramebuffers(1, &lastFrameBuffer);
glGenRenderbuffers(1, &lastFrameDepthBuffer);
glGenTextures(1, &lastFrameTexture);
glBindTexture(GL_TEXTURE1, lastFrameTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 768, 1029, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_6_5, NULL);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
//Bind/alloc depthbuf
glBindRenderbuffer(GL_RENDERBUFFER, lastFrameDepthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 768, 1029);
glBindFramebuffer(GL_FRAMEBUFFER, lastFrameBuffer);
//binding the texture to the FBO :D
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, lastFrameTexture, 0);
// attach the renderbuffer to depth attachment point
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, lastFrameDepthBuffer);
[self checkFramebufferStatus];
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它参与了一个对象,checkFrameBufferStatus如下所示:
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
switch(status)
{
case GL_FRAMEBUFFER_COMPLETE:
JNLogString(@"Framebuffer complete.");
return TRUE; …Run Code Online (Sandbox Code Playgroud) 每次打完电话后glClear(GL_COLOR_BUFFER_BIT);,我都会收到OpenGL错误"无效的帧缓冲操作".
电话似乎工作正常,似乎没有错.我glClear(GL_COLOR_BUFFER_BIT);在::paintGL()方法中首先调用.
咦?我应该忽略这个错误吗?
我正在寻找一个可以直接显示jpg或png归档的python模块/dev/fb0.
我希望模块可以调用并在屏幕上显示图片,如下所示:
show_photo(path_to_jpg, x, y, dev='/dev/fb0')
Run Code Online (Sandbox Code Playgroud)
我在google上搜索了这样的python模块好几天了,我找到了链接:[Module] Python Frame Buffer,但找不到网站.
现在,我正在使用C程序并按os.system()函数调用,而且速度太慢.是否有一个python模块可以直接将图片显示到帧缓冲区,并支持静态图片,字幕?如果模块也支持播放视频文件会更好mplayer.
我开始在Mono框架下为Linux编写一个小应用程序,该应用程序本质上是一个小型的kiosk前端,用户交互非常少.这是为了替换基于100%文本/控制台的同一应用程序的先前版本.
由于这将在Raspberry Pi上运行,我想避免运行X并让我的应用程序直接与Framebuffer通信.我开始使用Mono框架和C#作为我的开发语言,因为我非常了解C#.在这种情况下,可移植性不是问题.
我在查找适当的库和绑定时遇到了一些麻烦,让我从Mono访问Framebuffer.这些GTK#库都明确绑定到X11接口,无论如何,在Debian Wheezy中似乎没有为ARM Soft-Float(armel)架构预构建的GtkFB库.
该Mono.Cairo库公开了一个DirectFBSurface类型,但是该表面的构造函数有两个IntPtr参数而没有记录,因此我不知道应该将什么传递给构造函数以正确初始化Framebuffer作为Cairo Surface.
有没有人使用Mono和C#与Linux Framebuffer交谈,如果是这样,你能提供基本的例子来初始化并开始绘制到FB,或者指向在线文档来提供帮助吗?
更新1
我想我会尝试null使用以下代码为两个构造函数参数实例化DirectFBSurface :
public static void Main(string[] args)
{
// ...
DirectFBSurface surface = new DirectFBSurface(((IntPtr)null), ((IntPtr)null));
// ...
}
Run Code Online (Sandbox Code Playgroud)
我希望这会生成一个异常,表明null不允许参数值,但是看起来好像DirectFBSurface没有实现Mono.Cairo或没有编译到Debian Wheezy(armel)附带的库中:
Unhandled Exception: System.EntryPointNotFoundException: cairo_directfb_surface_create
at (wrapper managed-to-native) Cairo.NativeMethods:cairo_directfb_surface_create (intptr,intptr)
at Cairo.DirectFBSurface..ctor (IntPtr dfb, IntPtr dfb_surface) [0x00000] in <filename unknown>:0
at Info.Insch.SandBox.TestCairo.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0
Run Code Online (Sandbox Code Playgroud)
所以看起来这种Mono.Cairo方法可能无法满足我的需求,如上所述,GTK#Framebuffer库似乎不是Armel的Debian Wheezy的一部分.是否有另一组库可用于从Mono访问Linux Framebuffer?
我想在嵌入式Linux应用程序中快速移动一个矩形到帧缓冲区.我发现这个功能cfb_copyarea可能很有用.但我无法在/ dev/fb设备上找到任何ioctl来调用该函数.或者可以直接调用此函数吗?
我正在使用opengl es 2.0编写Android 2d游戏.在我将精灵绘制到后备缓冲区后,我将灯光绘制到FBO并尝试将其再次混合到后台缓冲区.当我将FBO绘制到帧缓冲区时,即使没有任何颜色也没有任何颜色,帧率在三星Galaxy w上从60降到30(它有一个adreno 205作为gpu).我到处搜索并尝试了一切,即使我在场景中绘制了一个精灵并将一个透明的FBO纹理混合到帧速率下降的屏幕上.我在手机上尝试了其他带有灯光效果的游戏,它们运行良好,几乎所有游戏都可以在手机上运行,我相信它们也使用了帧缓冲.在Galaxy SII(mali 400 gpu)运行正常,我对opengl很新,所以我相信我在某个地方犯了错误,我分享了我的代码.
// Create a framebuffer and renderbuffer
GLES20.glGenFramebuffers(1, fb, offset);
GLES20.glGenRenderbuffers(1, depthRb, offset);
// Create a texture to hold the frame buffer
GLES20.glGenTextures(1, renderTex, offset);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, renderTex[offset]);
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA,
screenWidth, screenHeight, 0,
GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE,
null);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,
GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,
GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER,
GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,
GLES20.GL_LINEAR);
//bind renderbuffer
GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, depthRb[offset]);
GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_DEPTH_COMPONENT16,
screenWidth, screenHeight);
// bind the framebuffer
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fb[offset]);
// specify texture as color attachment
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0,
GLES20.GL_TEXTURE_2D, renderTex[offset], …Run Code Online (Sandbox Code Playgroud) 我正在开发一个OpenGL应用程序,我需要找到支持多少帧缓冲颜色附件.有没有办法查询OpenGL的值?
我有一个使用 GLUT 开发的小型 OpenGL 应用程序。在没有 X-Server 的情况下,使用 OpenGL 直接渲染到 Linux 帧缓冲区 (fbdev) 的最佳选择是什么?我知道 GLUT 需要 X,所以我不是在寻找在没有 X 的情况下使用 GLUT 的方法。
我打算使用的帧缓冲设备已确认与fbi和一起使用mplayer。
我已经完成(或者我认为我已经完成了)一项非常详尽的研究,并找到了一些可能有用的资源和库。但大部分信息都有些过时,我不确定该相信什么。
因此,虽然很多 SO 答案都提到 DirectFB 和 Mesa 作为解决方案,但我无法让自己对这些选项充满信心,因为可以找到的材料很少。
所以,如果你能在这里指出我正确的方向,给我任何例子,我将不胜感激。我错过了什么?
由于问题被标记为重复而进行编辑:
相关问题的答案建议使用 DRM。我打算在尚不支持主线 Linux 内核的基于 Allwinner H3 的嵌入式计算机上运行我的代码。目前,它在内核版本 3.14 上运行,我认为它不支持 DRM。
那么,有没有其他选择?
我有一个直接在linux帧缓冲区(没有x-Windows)上运行的嵌入式linux应用程序。现在,我们必须将显示器物理旋转180度。如何使我的Qt应用程序旋转以使其不会倒挂?我看到了使用以下选项的参考:
-platform linuxfb:fb=/dev/fb0:rotation:180
Run Code Online (Sandbox Code Playgroud)
但是,旋转选项似乎被忽略了。
在Ubuntu服务器16.04.6上使用Qt 5.9.2