标签: framebuffer

帧缓冲文档

有没有关于如何编写在Linux中使用framebuffer设备的软件的文档?我已经看到几个简单的例子,基本上说:"打开它,mmap它,将像素写入映射区域." 但没有关于如何使用不同的IOCTLS的全面文档.我已经看到了对"平移"和其他功能的引用,但"谷歌搜索"给出了太多无用信息.

编辑:从编程角度来看,这是唯一的文档,而不是"用户如何配置系统以使用fb",文档代码?

linux framebuffer

15
推荐指数
2
解决办法
7072
查看次数

OpenGL:渲染到纹理和帧缓冲对象的麻烦

我想将场景渲染到最初为空的纹理.为此,我使用一个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)

opengl rendering render framebuffer texture-mapping

15
推荐指数
2
解决办法
3万
查看次数

是否可以在上下文/线程之间共享一个opengl帧缓冲对象?

我想在一个线程中渲染我的场景,然后在另一个线程拥有的窗口中将结果blit.为了避免将帧缓冲区读回到cpu内存,我想使用framebuffer对象.到目前为止,我还没有能够使这个工作(白色纹理),这让我相信opengl不支持这个.

  1. 是否可以在不同的上下文之间共享帧缓冲对象?
  2. 是否有可能在不同的线程之间共享一个帧缓冲对象,因为该对象一次只能绑定一个线程?

如果有人能指出我在文档中描述的位置,那将是一个奖励.

windows opengl multithreading framebuffer openglcontext

14
推荐指数
1
解决办法
5413
查看次数

逻辑缓冲区加载 - 慢帧缓冲加载 - ios

我们试图弄清楚为什么我们在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)

opengl-es framebuffer ios opengl-es-2.0

13
推荐指数
1
解决办法
2332
查看次数

脏的矩形

哪里可以找到关于实现用于计算"脏矩形"的算法的参考,以最小化帧缓冲器更新?一种显示模型,允许任意编辑并计算更新显示所需的最小"位blit"操作集.

graphics dirtyrectangle framebuffer bounding-box

12
推荐指数
1
解决办法
1万
查看次数

如何在不离开X.11环境的情况下开发DirectFB应用程序

我正在尝试为嵌入式平台开发GUI应用程序,没有任何窗口,我正在使用DirectFB,这非常适合我的需求.

由于我开发的嵌入式功能并不强大,我真的想尝试在我自己的Ubuntu桌面上进行开发.问题是Framebuffer与X.org冲突导致我离开整个桌面,并关闭X.org只是为了查看我的更改结果.

有一个适合我需要的好的帧缓冲模拟器吗?Qt有一个名为QVFb,但它只适用于开发Qt应用程序,而DirectFB的VNC后端总是崩溃.

那么,有什么想法吗?

c++ linux user-interface framebuffer directfb

12
推荐指数
1
解决办法
1万
查看次数

使用像素缓冲对象(PBO)从帧缓冲对象(FBO)读取像素值

我可以使用像素缓冲区对象(PBO)直接从FBO读取像素值(即使用glReadPixels)(即FBO仍然连接时)?

如是,

  1. 使用PBO和FBO有什么优缺点?
  2. 以下代码有什么问题

{

//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 fbo framebuffer glreadpixels pbo

12
推荐指数
2
解决办法
2万
查看次数

注入帧缓冲区

从我年轻的时候起,我一直在"黑客攻击"我最喜欢的游戏之一,并且我已经设法能够拦截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)

opengl framebuffer code-injection

12
推荐指数
1
解决办法
2220
查看次数

每次绑定具有不同分辨率的帧缓冲区时,是否必须调用glViewport?

我有一个程序,有大约3个不同大小的帧缓冲区.我在开始时初始化它们,为它们提供适当的渲染目标并更改每个渲染目标的视口大小.

我原本以为你只glViewport需要在初始化帧缓冲区时调用,但这会在我的程序中产生问题所以我认为这是错的?因为它们的分辨率都不同,所以当我在每个帧中渲染时,我绑定第一个帧缓冲区,更改视口大小以适合该帧缓冲区,绑定第二个帧缓冲区,更改视口大小以适应第二个帧缓冲区的分辨率,绑定第三个帧缓冲区,更改视口大小以适合它,然后绑定窗口帧缓冲区并将视口大小更改为窗口的分辨率.

这是必要的,还是程序中的其他东西应该归咎于什么?这是每一帧完成的,所以我担心如果我不必这样做会有一点点不必要的开销.

opengl resolution framebuffer viewport

12
推荐指数
2
解决办法
3909
查看次数

Vulkan中帧缓冲和图像有什么区别?

我知道framebuffer是渲染管道的最终目的地,而swapchain包含许多图像.那么这两件事之间的关系是什么?哪一个是实际的渲染目标?帧缓冲区后来是否会在图像视图中附加当前帧的最终图片?如果是这样,它将如何转移?

通过油漆或图表描述这一点会很高兴.

image framebuffer vulkan

12
推荐指数
2
解决办法
3005
查看次数