如何捕获 Cell Linux 上的 Linux 帧缓冲区以获得屏幕截图或电影?
是否有工具可以为正在运行的程序执行此操作,或者写入帧缓冲区并可能控制帧缓冲区的程序还必须处理捕获和记录?如果是这样,程序将如何执行?
我有一个简单的一个通道(8位)的位图仅亮度数据,我想与现有framebufer混合它像屏幕混合模式做它在Photoshop.
因此,源的白色像素(255)应该是白色,源的50%灰色像素(128)应该使帧缓冲像素亮起50%,而源的黑色像素应该单独留下结果.我是否也必须设置glColor4f?
有些glBlendFunc专家可以帮助我吗?
在iOS设备(iPad)上,我决定通过glRenderbufferStorage将CABAGLLayer中的渲染缓冲区的存储更改为显式存储.遗憾的是,以下代码无法生成有效的FBO.有人可以告诉我我错过了什么吗?:
glGenFramebuffers(1, &m_framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer);
glGenRenderbuffers(1, &m_colorbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, m_colorbuffer);
GLsizei width = (GLsizei)layer.bounds.size.width;
GLsizei height = (GLsizei)layer.bounds.size.height;
glRenderbufferStorage(m_colorbuffer, GL_RGBA8_OES, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_colorbuffer);
Run Code Online (Sandbox Code Playgroud)
注意:
图层大小有效且正确.这是可靠的生产工作渲染代码.我所做的唯一改变就是这条线:
glRenderbufferStorage(...)
Run Code Online (Sandbox Code Playgroud)
以前我做过:
[m_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:layer]
Run Code Online (Sandbox Code Playgroud) 在基于帧缓冲区的控制台中渲染字符的最快方法是什么?我正在使用XNUiso_font.h的字体。
现在我正在使用这段代码来渲染一个角色,但它似乎不太有效:
px = px* ISO_CHAR_WIDTH;
py = py* (ISO_CHAR_HEIGHT-1);
for (int i = 0; i < 15; i += 1)
{
int sym = iso_font[c*16+i];
int x = px;
int y = py + i;
for (int ii =0; ii < 8; ii++)
{
x+=1;
if ((sym & (1 << ii)))
{
fb_set_px(x,y,fg);
}
else
{
fb_set_px(x,y,bg);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我还想知道这段代码是否可以简化:
void fb_set_px(x,y,hex){
void*ptr = ((_base + (_bpr*y) + (_bpe*x)));
unsigned int *p = …Run Code Online (Sandbox Code Playgroud) 我正在使用 opengl ES 2.0 我正在使用链接到纹理的帧缓冲区来编译屏幕外渲染(一些简单的元球),然后我将该纹理渲染到主后台缓冲区。
除了纹理看起来被剪裁外,一切看起来都很棒,即。它不是完整的窗口尺寸(在一个轴上短约 128 个像素)。这是屏幕截图:http : //tinypic.com/r/9telwg/7
任何想法可能导致这种情况?我在这里读到将 glViewport 设置为纹理的大小,但这给了我不同的纵横比,因为纹理 metaballsTexture 是方形(1024x1024)而我的窗口是 768x1024。它仍然有点被剪裁,因为似乎我无法让帧缓冲区足够大,即使纹理大于我的窗口大小。下面是我的代码。当我准备好时,我在渲染期间调用 PrepareToAddMetaballs(),然后连续调用 AddMetaball,现在渲染到我的屏幕外 FBO,然后在我完成后调用 FinishedAddingMetaballs,然后调用 Render() 以显示链接到 FBO 的屏幕外纹理到主后台缓冲区。
#include "Metaballs.h"
#include "s3e.h"
#include "IwGL.h"
#include "Render.h"
#include "vsml.h"
#include <vector>
#include <string>
#include <iostream>
#include "1013Maths.h"
#define GL_RGBA8 0x8058
MetaBalls::MetaBalls() : metaballsTexture(NULL), metaballsShader(NULL) {
glGenFramebuffers(1, &myFBO);
metaballTexture[0] = NULL;
metaballTexture[1] = NULL;
metaballTexture[2] = NULL;
CRender::Instance()->CreateTexture("WaterCanvas.png", &metaballsTexture);
CRender::Instance()->CreateTexture("metaball.pvr", &metaballTexture[0]);
CRender::Instance()->CreateTexture("metaball-1.png", &metaballTexture[1]);
CRender::Instance()->CreateTexture("metaball-2.png", &metaballTexture[2]);
CRender::Instance()->CreateShader("Shaders/metaballs.fs", "Shaders/metaballs.vs", &metaballsShader);
glBindFramebuffer(GL_FRAMEBUFFER, myFBO);
// Attach texture …Run Code Online (Sandbox Code Playgroud) 我正在我的OpenGL ES 1.1 iOS应用程序中为屏幕外渲染创建一个额外的帧缓冲区和渲染缓冲区.当我渲染到额外的渲染缓冲区时,我开始在XCode控制台中看到内存警告.什么是"释放","清除"等这些额外缓冲区的正确方法?
我试验过,glClear(GL_COLOR_BUFFER_BIT)但记忆警告仍在继续.注释掉渲染代码会导致警告消失.
我需要从后台运行的服务中截取屏幕截图.屏幕截图可以是前景中的应用程序,即使它不是我的应用程序,这就是我无法使用DrawingCache的原因.我四处寻找并找到了这个
process = Runtime.getRuntime().exec("su -c cat /dev/graphics/fb0");
InputStream is = process.getInputStream();
但我不知道如何处理流.如何将其添加到位图中?我不需要将它保存到文件中我只需要将其保存在变量中.这适用于root手机.
任何帮助深表感谢.
我的理解:有一种所谓的帧缓冲.它是缓冲对象的指针数组.缓冲区对象可以是例如渲染缓冲区,纹理缓冲区或其他.如果我想画一些东西,我将渲染缓冲区附加到帧缓冲区,绘制到它,最后调用一个方法将其发送到屏幕.
1)到目前为止这是正确的吗?
我不明白的是:
2)我想我在某处读到了在创建上下文时创建帧缓冲区.唉,我看不到我看到的地方了.但是,如果帧缓冲区真的被创建,为什么我要打电话glGenFramebuffersOES(1, &framebuffer)和glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer)?据我所知,第一个创建一个新的帧缓冲区,其中一个空间用于附件,第二行设置上下文的帧缓冲区指针framebuffer.但假设我已经在上下文中有一个帧缓冲区为什么我无法检索它并将我的渲染缓冲区附加到那个?
3)什么是"默认帧缓冲区"?它是一个名为0的帧缓冲区.如果已经有一个默认的帧缓冲区,为什么我要绘制时必须创建一个新缓冲区?
假设我遇到这样的问题:现在我有一个帧缓冲区,并且纹理只包含一个颜色组件(例如,GL_RED)已经绑定到它.片段着色器会是什么样的?我想答案是:
......浮出ex_color;
ex_color = ...;
我的问题出现了:着色器会自动检测帧缓冲区的格式并将值写入吗?如果片段着色器输出浮点值但帧缓冲格式是GL_RGBA怎么办?
那么,创建纹理的正确方法是什么只有一个组件?我从g-truc中读到了一些例子:
glTexImage2D(GL_TEXTURE_2D,0,GL_RED,GLsizei(Texture.dimensions().x),GLsizei(Texture.dimensions().y),0,GL_RGB,GL_UNSIGNED_BYTE,0);
将GL_RGB指定为像素数据格式的含义是什么?
我目前正在研究嵌入式 linux 帧缓冲区。我知道如何通过键入以下内容来显示系统的可用分辨率:
cat /sys/class/graphics/fb0/modes
Run Code Online (Sandbox Code Playgroud)
这给了我一个决议列表,例如:
U:720x576p-50
D:1920x1080p-50
D:1280x720p-50
D:1920x1080i-60
D:1920x1080i-50
U:1440x900p-60
S:1280x1024p-60
V:1024x768p-60
V:800x600p-60
V:640x480p-60
D:1280x720p-60
D:1920x1080p-60
Run Code Online (Sandbox Code Playgroud)
我想知道每行的第一个字符是什么意思(S、U、V 或 D)。是否有列出所有可能字符的标准/文档?