有没有关于如何编写在Linux中使用framebuffer设备的软件的文档?我已经看到几个简单的例子,基本上说:"打开它,mmap它,将像素写入映射区域." 但没有关于如何使用不同的IOCTLS的全面文档.我已经看到了对"平移"和其他功能的引用,但"谷歌搜索"给出了太多无用信息.
编辑:从编程角度来看,这是唯一的文档,而不是"用户如何配置系统以使用fb",文档代码?
我想将场景渲染到最初为空的纹理.为此,我使用一个Framebuffer对象,我附加一个空的2d纹理和一个深度缓冲区.设置完成后,为了测试,我在场景中绘制了一个简单的四边形.每个顶点都有不同的颜色,所以我最终期望纹理中有一个颜色插值的四边形.然后我使用包含四边形的纹理并将其映射到另一个四边形.所以,我在默认的Framebuffer中有一个四边形,它有一个包含彩色四边形的纹理.我希望这不会太混乱......
无论如何,我必须在这里遗漏一些东西,因为我得到的只不过是灰色的纹理.我基本上遵循了这些非常简单的指示.但是,我无法弄清楚我在这里缺少什么.如果有人能给我一些线索,我将不胜感激.
谢谢沃尔特
这是我到目前为止的代码://创建帧缓冲对象glGenFramebuffers(1,&frameBufferObject);
// create depth buffer
glGenRenderbuffers(1, &depthAttachment);
// create empty texture
int width = 512;
int height = 512;
int numberOfChannels = 3;
GLuint internalFormat = GL_RGB;
GLuint format = GL_RGB;
unsigned char* texels = new unsigned char[width * height * numberOfChannels];
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, width, height, 0, format, GL_UNSIGNED_BYTE, texels);
glGenerateMipmap(GL_TEXTURE_2D);
delete[] texels;
texels = NULL;
// activate …Run Code Online (Sandbox Code Playgroud) 我想在一个线程中渲染我的场景,然后在另一个线程拥有的窗口中将结果blit.为了避免将帧缓冲区读回到cpu内存,我想使用framebuffer对象.到目前为止,我还没有能够使这个工作(白色纹理),这让我相信opengl不支持这个.
如果有人能指出我在文档中描述的位置,那将是一个奖励.
我们试图弄清楚为什么我们在iphone 4和ipad 1上的FPS相对较慢.我们在开放式GL分析中看到了这类警告:逻辑缓冲区负载.摘要是"慢帧缓冲加载".建议说在渲染之前必须由GPU加载帧缓冲.它建议我们无法在每帧的开头执行全屏清除操作.但是,我们正在使用glClear.
[EAGLContext setCurrentContext:_context];
glBindFramebuffer(GL_FRAMEBUFFER, _defaultFramebuffer);
glClear(GL_COLOR_BUFFER_BIT);
// Our OpenGL Drawing Occurs here
Run Code Online (Sandbox Code Playgroud)
...... ......
// hint to opengl to not bother with this buffer
const GLenum discards[] = {GL_DEPTH_ATTACHMENT};
glBindFramebuffer(GL_FRAMEBUFFER, _defaultFramebuffer);
glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discards);
// present render
[_context presentRenderbuffer:GL_RENDERBUFFER];
Run Code Online (Sandbox Code Playgroud)
我们实际上并没有使用深度或模板缓冲区.
当我们将纹理渲染为切片时会发生这种情况,并且每次加载新切片时都会发生这种情况.它指向我们的glDrawArrays命令.
关于我们如何摆脱这种警告的任何建议?
如果它有帮助,这就是我们设置图层的方式:
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking,
kEAGLColorFormatRGB565, kEAGLDrawablePropertyColorFormat,
nil];
Run Code Online (Sandbox Code Playgroud) 哪里可以找到关于实现用于计算"脏矩形"的算法的参考,以最小化帧缓冲器更新?一种显示模型,允许任意编辑并计算更新显示所需的最小"位blit"操作集.
我正在尝试为嵌入式平台开发GUI应用程序,没有任何窗口,我正在使用DirectFB,这非常适合我的需求.
由于我开发的嵌入式功能并不强大,我真的想尝试在我自己的Ubuntu桌面上进行开发.问题是Framebuffer与X.org冲突导致我离开整个桌面,并关闭X.org只是为了查看我的更改结果.
有一个适合我需要的好的帧缓冲模拟器吗?Qt有一个名为QVFb,但它只适用于开发Qt应用程序,而DirectFB的VNC后端总是崩溃.
那么,有什么想法吗?
我可以使用像素缓冲区对象(PBO)直接从FBO读取像素值(即使用glReadPixels)(即FBO仍然连接时)?
如是,
{
//DATA_SIZE = WIDTH * HEIGHT * 3 (BECAUSE I AM USING 3 CHANNELS ONLY)
// FBO and PBO status is good
.
.
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);
//Draw the objects
Run Code Online (Sandbox Code Playgroud)
以下glReadPixels工作正常
glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, (uchar*)cvimg->imageData);
Run Code Online (Sandbox Code Playgroud)
以下glReadPixels不工作:(
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pboId);
//yes glWriteBuffer has also same target and I also checked with every possible values
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, (uchar*)cvimg->imageData);
.
.
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); //back to window framebuffer
Run Code Online (Sandbox Code Playgroud) 从我年轻的时候起,我一直在"黑客攻击"我最喜欢的游戏之一,并且我已经设法能够拦截OpenGL调用并使用opengl32.dll包装器注入C++代码.我已经能够为此提出一些很酷的用途,但我目前的目标是在这款旧游戏中实现后处理glsl着色器,使其看起来更现代.该游戏最初是在90年代后期发布的,因此它对OpenGL及其渲染代码的使用是有限/原始/过时的.
我已经能够通过注入代码来初始化和使用glsl着色器程序来成功生成顶点和片段着色器,但我的问题在于生成一个帧缓冲区/将我的场景渲染到纹理以作为采样器发送到我的片段着色器.据我所知,我生产的纹理通常都是黑色的.
很难找到与我正在做的事情相关的资源并检查原始的opengl调用(我一直在尝试通过读取单帧游戏玩法的opengl跟踪来确定插入代码的位置),所以我没有去过能够绕过我做错的事情.
我已经尝试将代码放在很多地方,但是目前,我在游戏调用后绑定了framebuffer,wglSwapBuffers()并且在下一个glFlush()调用之前我立即解除绑定,但是我不确定是否有多个视口设置,或矩阵运算,或在这些时间之间创建的任何其他东西都会以某种方式搞乱帧缓冲.
这是初始化帧缓冲区的代码:
void initFB()
{
/* Texture */
glActiveTexture(GL_TEXTURE0);
glGenTextures(1, &fbo_texture);
glBindTexture(GL_TEXTURE_2D, fbo_texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1920, 1080, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBindTexture(GL_TEXTURE_2D, 0);
/* Depth buffer */
glGenRenderbuffers(1, &fbo_depth);
glBindRenderbuffer(GL_RENDERBUFFER, fbo_depth);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 1920, 1080);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fbo_depth);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
/* Framebuffer to link everything together */
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbo_texture, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, …Run Code Online (Sandbox Code Playgroud) 我有一个程序,有大约3个不同大小的帧缓冲区.我在开始时初始化它们,为它们提供适当的渲染目标并更改每个渲染目标的视口大小.
我原本以为你只glViewport需要在初始化帧缓冲区时调用,但这会在我的程序中产生问题所以我认为这是错的?因为它们的分辨率都不同,所以当我在每个帧中渲染时,我绑定第一个帧缓冲区,更改视口大小以适合该帧缓冲区,绑定第二个帧缓冲区,更改视口大小以适应第二个帧缓冲区的分辨率,绑定第三个帧缓冲区,更改视口大小以适合它,然后绑定窗口帧缓冲区并将视口大小更改为窗口的分辨率.
这是必要的,还是程序中的其他东西应该归咎于什么?这是每一帧完成的,所以我担心如果我不必这样做会有一点点不必要的开销.
我知道framebuffer是渲染管道的最终目的地,而swapchain包含许多图像.那么这两件事之间的关系是什么?哪一个是实际的渲染目标?帧缓冲区后来是否会在图像视图中附加当前帧的最终图片?如果是这样,它将如何转移?
通过油漆或图表描述这一点会很高兴.
framebuffer ×10
opengl ×5
linux ×2
bounding-box ×1
c++ ×1
directfb ×1
fbo ×1
glreadpixels ×1
graphics ×1
image ×1
ios ×1
opengl-es ×1
pbo ×1
render ×1
rendering ×1
resolution ×1
viewport ×1
vulkan ×1
windows ×1