我是这个linux framebuffer的新手,所以有人引导我在framebuffer中绘制线图.我有代码在turbo c中绘制图形但现在在linux中.所以请帮帮我.
谢谢你,拉胡尔
有没有一种方法来读取当前屏幕的帧缓冲区?我搜索了一些关于帧缓冲区的数据.有人使用glReadPixels方法,但信息不够.有谁知道如何详细阅读当前帧缓冲区?
谢谢你的帮助.
我是一个开发人员,从事一个非常大的内存密集型32位应用程序.耗尽虚拟地址空间(内存)对我们来说是个问题.在我调查一些最近的问题时,我注意到IOKit(512MB)保留了大量内存.此内存未分配,但仅保留.进一步调查显示,大多数应用程序(Safari,iTunes等)都保留了这块内存.它似乎保持未分配状态.我正在使用vmmap进行测试.例如,这是使用默认模板使用XCode制作的Cocoa应用程序:
REGION TYPE VIRTUAL
=========== =======
CG backing stores 1008K
CG image 4K
CG raster data 64K
CG shared images 2252K
Carbon 7264K
CoreGraphics 16K
IOKit (reserved) 512.0M reserved VM address space (unallocated)
MALLOC 59.0M see MALLOC ZONE table below
MALLOC guard page 48K
MALLOC metadata 348K
Memory tag=242 12K
STACK GUARD 56.0M
Stack 8712K
VM_ALLOCATE 16.2M
__DATA 8296K
__IMAGE 1240K
__LINKEDIT 31.5M
__TEXT 76.7M
__UNICODE 536K
mapped file 27.4M
shared memory 1320K
=========== =======
TOTAL 809.2M
TOTAL, minus reserved …Run Code Online (Sandbox Code Playgroud) 我想在运行XBMC时获得屏幕内容的平均颜色,以更改电视环境光的颜色.XBMC运行在一个小型HTPC上,OpenGL ES 2.0硬件(Raspberry Pi)运行Debian派生的发行版.我想我必须从XBMC使用OpenGL绘制的屏幕帧缓冲区中读取.(至少,我认为并希望XBMC使用OpenGL呈现所有内容.)
是否可以读取代表整个屏幕输出的OpenGL帧缓冲区?我需要访问它什么?我是否还需要一个自己的渲染上下文来访问屏幕的帧缓冲区?(我不会自己渲染任何东西到屏幕上,我只想阅读).
有效地计算平均颜色是下一个任务.我正在考虑每行/每列读取第8或第16个像素(足够,我们正在讨论1080p高清电影),然后计算CPU上的平均值.欢迎任何有关更好解决方案的想法.
我试图在iPhone上进行一些图像处理,基于Apple的GLImageProcessing示例.
最后,我想要做的是将图像加载到纹理中,执行示例代码中的一个或多个操作(色调,饱和度,亮度等),然后将结果图像读回以供以后处理/保存.在大多数情况下,这永远不需要触摸屏幕,所以我认为FBO可能是要走的路.
首先,我拼凑了一个小例子,创建一个屏幕外FBO,绘制它,然后将数据作为图像读回.当它在模拟器中完美运行时我感到很兴奋,然后因为我意识到我在实际设备上只有一个黑屏而感到沮丧.
免责声明:我的OpenGL已经足够老了,我已经对OpenGL ES有了相当多的学习曲线,而且我从来都不是一个纹理向导.我知道该设备在帧缓冲访问方面具有与模拟器不同的特性(强制性的屏幕外FBO和设备上的交换,模拟器上的直接访问),但我无法找到我做错了什么,即使经过相当广泛的搜索.
有什么建议?
// set up the offscreen FBO sizes
int renderBufferWidth = 1280;
int renderBufferHeight = 720;
// now the FBO
GLuint fbo = 0;
glGenFramebuffersOES(1, &fbo);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, fbo);
GLuint renderBuffer = 0;
glGenRenderbuffersOES(1, &renderBuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, renderBuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES,
GL_RGBA8_OES,
renderBufferWidth,
renderBufferHeight);
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES,
GL_COLOR_ATTACHMENT0_OES,
GL_RENDERBUFFER_OES,
renderBuffer);
GLenum status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES);
if (status != GL_FRAMEBUFFER_COMPLETE_OES) {
NSLog(@"Problem with OpenGL framebuffer after specifying color render buffer: %x", status);
}
// throw in a test drawing
glClearColor(0.5f, 0.5f, 0.5f, 1.0f); …Run Code Online (Sandbox Code Playgroud) iphone opengl-es framebuffer render-to-texture ios-simulator
我试过了 :
process = Runtime.getRuntime().exec("su -c cat /dev/graphics/fb0 > /sdcard/frame.raw");
process.waitFor();
Run Code Online (Sandbox Code Playgroud)
但它不起作用.我的设备扎根了.
我看到许多答案需要root访问,但没有实际的代码来获取帧缓冲.
我也试过glReadPixels()但没有运气.
public void TakeScreen() {
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels;
int height = dm.heightPixels;
int screenshotSize = width * height;
ByteBuffer bb = ByteBuffer.allocateDirect(screenshotSize * 4);
bb.order(ByteOrder.nativeOrder());
gl.glReadPixels(0, 0, width, height, GL10.GL_RGBA,
GL10.GL_UNSIGNED_BYTE, bb);
int pixelsBuffer[] = new int[screenshotSize];
bb.asIntBuffer().get(pixelsBuffer);
bb = null;
Bitmap bitmap = Bitmap.createBitmap(width, height,
Bitmap.Config.RGB_565);
bitmap.setPixels(pixelsBuffer, screenshotSize - width, -width, 0, 0,
width, height);
pixelsBuffer = null;
short …Run Code Online (Sandbox Code Playgroud) [iPad-3] - [iOS 5.0] - [Objective-C] - [XCode 4.3.3] - [Cocos2D] - [openGL | ES 2.0]
我正在学习如何使用openGL | ES 2.0并且偶然发现帧缓冲对象(FBO)
信息: 我正在使用Cocos2D,它有很多超凡的绘图处理能力.我想这可能与这个问题有关.如果cocos的'default'帧缓冲区与绘制到屏幕的实际默认帧缓冲区不同,则可能导致错误绘制
我的问题: 在我的"helloworld.m"类的init函数中,如果我放置"glBindFrameBuffer(GL_FRAMEBUFFER,0);" 在任何地方,我只是得到一个空白屏幕!
-(id) init
{
if( (self=[super init]))
{
CGSize winSize = [CCDirector sharedDirector].winSize;
glBindFramebuffer(GL_FRAMEBUFFER, 0);
CCSprite * spriteBG = [[CCSprite alloc] initWithFile:@"cocos_retina.png"];
spriteBG.position = ccp(512,384);
//[self addChild:spriteBG z:1];
[self scheduleUpdate];
_mTouchDown = NO;
_mSprite = [CCSprite spriteWithTexture:_mMainTexture];
_mSprite.position = ccp(512,384);
[self addChild:_mSprite];
self.isTouchEnabled = YES;
} return self;}
Run Code Online (Sandbox Code Playgroud)
我错过了一些基本而明显的东西吗?
据我所知,函数"glBindFramebuffer(GL_FRAMEBUFFER,0);" 只需将Framebuffer设置为0即可应用绘制到屏幕的默认帧缓冲区.
我的Android程序必须使用glBlitFrameBuffer()函数来复制FrameBuffer对象.但glBlitFrameBuffer()功能仅在OpenGL ES 3.0+设备上受支持.我想支持OpenGL ES 2.0+设备.
这个功能有什么解决方案/替代方案吗?
我注意到现在有GL_DRAW/READ_FRAMEBUFFER扩展.目前我只是使用GL_FRAMEBUFFER和glTextureBarrierNV.但是,我没有发现很多关于READ/WRITE扩展的内容,因此有一些问题.
他们介绍了什么OpenGL版本?使用简单的GL_FRAMEBUFFER进行读写操作有什么好处?我在哪里可以找到更多关于此的信息?
我想编写一个Android应用程序,它使用framebuffer在屏幕上显示内容.这将仅在特定的root设备上运行,因此权限等不是问题.相同的应用程序(无论如何简单的测试版本)已经在PC/Linux上正常运行.
问题:
如何避免Android操作系统访问帧缓冲区?我希望,在我的应用程序运行时,操作系统永远不会触摸帧缓冲区,没有写入和没有ioctl.我需要做什么才能独占使用framebuffer,然后(当我的应用程序退出时)将其返回给操作系统?
Android framebuffer和Linux framebuffer之间有什么区别需要注意吗?
PS我想将我的应用程序作为常规Android应用程序(带有一些本机代码)启动,它除了用于接管整个屏幕的帧缓冲区绘制外,没有可见的UI.能够从操作系统获取事件会很高兴.
另见:http: //www.kandroid.org/online-pdk/guide/display_drivers.html