有没有人成功地做到了这一点?似乎我在模板渲染缓冲区中使用的索引格式glCheckFramebufferStatus(...)返回GL_FRAMEBUFFER_UNSUPPORTED.我已经成功地绑定了深度\颜色渲染缓冲区,但每当我尝试用我的模板缓冲区做同样的事情时(我说)GL_FRAMEBUFFER_UNSUPPORTED.
这是我的代码的片段:
// Create frame buffer
GLuint fb;
glGenFramebuffers(1, &fb);
// Create stencil render buffer (note that I create depth buffer the exact same way, and It works.
GLuint sb;
glGenRenderbuffers(1, &sb);
glBindRenderbuffer(GL_RENDERBUFFER, sb);
glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, w, h);
// Attach color
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, cb, 0);
// Attach stencil buffer
glBindFramebuffer(GL_FRAMEBUFFER, fb);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rb);
// And here I get an GL_FRAMEBUFFER_UNSUPPORTED when doing glCheckFramebufferStatus()
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
注意:颜色附件是纹理而不是渲染缓冲
我想使用 glClear 和 glClearColor 用包括 alpha 透明度的颜色填充帧缓冲区。然而,当绑定到渲染到屏幕的纹理时,帧缓冲区总是渲染为不透明的。
我希望渲染到帧缓冲区的所有内容都保持其透明度。我只是想改变背景。
请参阅以下代码:
def create_texture(surface):
surface.texture = glGenTextures(1)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity() #Loads model matrix
glBindTexture(GL_TEXTURE_2D, surface.texture) #Binds the current 2D texture to the texture to be drawn
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) #Required to be set for maping the pixel data
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) #Similar as above
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, surface.surface_size[0], surface.surface_size[1], 0, GL_RGBA,GL_UNSIGNED_BYTE, surface.data) #Put surface pixel data into texture
if surface.data == None:
setup_framebuffer(surface)
c = [float(sc)/255.0 for sc in surface.colour] #Divide colours by 255 …Run Code Online (Sandbox Code Playgroud) 根据我的理解,它们是不同的。Linux 帧缓冲区是一个软件对象,GPU 的内存是映射到 GPU 设备的物理内存。
我的问题如下:
1)我的理解正确吗?
2)如果是这样,以某种方式将两个东西合并成一个看起来可能会提高性能(我猜还有更多的技术细节为什么这是不可能的等等......)
3)如果没有,你能解释一下 Linux 帧缓冲区和 GPU 是如何协同工作的吗?
我想在未连接到任何物理显示器的帧缓冲区设备上测试一些文本绘制功能。有没有办法实时查看我正在绘制到 /dev/fb0 的内容?
如何使用 Gstreamer 读取帧缓冲区 (/dev/fb0)?
我正在尝试使用 RP 上的硬件 h264 编码器读取 Raspberry PI 上的帧缓冲区并将其流式传输到我的笔记本电脑。
首先我尝试了这个链接:https : //www.raspberrypi.org/forums/viewtopic.php?t=43227&p=486061
并使用了命令:
gst-launch-1.0 -v multifilesrc location=/dev/fb0 ! videoparse format=29 framerate=30/1 ! decodebin ! videoconvert ! omxh264enc ! rtph264pay ! gdppay ! tcpserversink host=192.168.11.100 port=5000
Run Code Online (Sandbox Code Playgroud)
但是视频没有垂直同步。
然后我在 Qt 中找到了这个Render OpenGL 场景并将其流式传输到 HTML5 界面
并尝试:
gst-launch-1.0 -v filesrc location=/dev/fb0 blocksize=1920000 ! video/x-raw,format=BGRA,width=800,height=600,framerate=1/1 ! videoconvert ! video/x-raw,format=RGB,framerate=1/1 ! videoflip method=vertical-flip ! videoscale ! video/x-raw,width=400,height=300 ! imagefreeze ! video/x-raw,format=RGB,framerate=30/2 ! clockoverlay shaded-background=true font-desc="Sans 38" ! omxh264enc …Run Code Online (Sandbox Code Playgroud) 我正在编写一个小型库来与 Linux 的帧缓冲区抽象接口。我的所有显卡都使用相同的像素格式(每个通道一个八位字节,四个通道,BGRA 排序),因此到目前为止,库仅采用这种格式。但是,如果我希望该库在任何 Linux 帧缓冲区上工作,帧缓冲区 API 提供了我必须使用的像素格式数据。你不需要知道帧缓冲区是如何工作的来回答这个问题(我希望),只需要一些我不熟悉的小技巧。这是我的标题中提供的像素格式信息:
/* Interpretation of offset for color fields: All offsets are from the right,
* inside a "pixel" value, which is exactly 'bits_per_pixel' wide (means: you
* can use the offset as right argument to <<). A pixel afterwards is a bit
* stream and is written to video memory as that unmodified.
*
* For pseudocolor: offset and length should be the same for all color
* components. Offset specifies the position …Run Code Online (Sandbox Code Playgroud) 我有一个系统,可以使用 C++ 中的 OpenGL 将不同的对象渲染成不同的 RGBA 纹理。我想将这些纹理叠加在一起,但我的问题是每个纹理都有 glClearColor 渲染到其中。
如何告诉 OpenGL 将纹理的 ClearColor 部分设为透明(0.0f alpha),以便我仍然可以看到其他图层后面的图层部分?
我正在使用 OpenCL 进行一些图像处理,并希望使用它将 RGBA 图像直接写入帧缓冲区。工作流程如下图所示:
1) 将帧缓冲区映射到用户空间。
2) 使用 clCreateBuffer 创建 OpenCL 缓冲区,标志为“CL_MEM_ALLOC_HOST_PTR”
3)使用clEnqueueMapBuffer将结果映射到framebuffer。
然而,这不起作用。屏幕上什么也没有。然后我发现帧缓冲区映射的虚拟地址与映射OpenCL的虚拟地址不同。有没有人做过从 GPU 到帧缓冲区的数据零复制移动?我应该使用什么方法来实现此目的有任何帮助吗?
一些关键代码:
if ((fd_fb = open("/dev/fb0", O_RDWR, 0)) < 0) {
printf("Unable to open /dev/fb0\n");
return -1;
}
fb0 = (unsigned char *)mmap(0, fb0_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);
...
cmDevSrc4 = clCreateBuffer(cxGPUContext, CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, sizeof(cl_uchar) * imagesize * 4, NULL, &status);
...
fb0 = (unsigned char*)clEnqueueMapBuffer(cqCommandQueue, cmDevSrc4, CL_TRUE, CL_MAP_READ, 0, sizeof(cl_uchar) * imagesize * 4, 0, NULL, NULL, &ciErr);
Run Code Online (Sandbox Code Playgroud) 尝试在延迟着色之上实现抗锯齿,我尝试使用多重采样渲染缓冲区,然后使用缓冲区位块传输传递解析样本。
按照延迟着色的传统做法,我使用发出 3 个颜色输出的专用着色器来渲染场景:
然后将它们用于照明计算通道,从而产生最终的场景纹理
使用简单的着色器将场景纹理渲染到全屏四边形的屏幕上
正如您可能猜到的,渲染到屏幕时,屏幕上的 MSAA 不会应用于场景纹理的内容:为了实现抗锯齿,我因此选择在步骤 1) 中使用多重采样渲染缓冲区,并引入了额外的步骤1.1) 分辨率。当然,多重采样仅对彩色图是必要的/有用的,对其他两张图来说不是必需的/有用的。
我的问题是,显然,具有多个渲染缓冲区/颜色附件的帧缓冲区只能为相同类型的附件定义;这意味着如果一个附件经过多次采样,那么所有其他附件也必须经过多次采样。
这成为分辨率期间位置和法线缓冲区的一个问题,因为几何体和照明会因抗锯齿而受到影响。
// Create the frame buffer for deferred shading: 3 color attachments and a depth buffer
glGenFramebuffers(1, &gBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, gBuffer);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
{
// - Position color buffer
glGenRenderbuffers(1, &gPosition);
glBindRenderbuffer(GL_RENDERBUFFER, gPosition);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 8, GL_RGBA16F, w, h);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, gPosition);
// - Normal color buffer
glGenRenderbuffers(1, &gNormal);
glBindRenderbuffer(GL_RENDERBUFFER, gNormal);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 8, GL_RGBA16F, w, h);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_RENDERBUFFER, gNormal);
// …Run Code Online (Sandbox Code Playgroud) opengl multisampling framebuffer deferred-rendering deferred-shading
我需要使用,但由于帧缓冲区驱动程序pygame的权限,它无法作为普通用户初始化屏幕。root 可以做,但用户不能做。用户位于“视频”组中,可以在 上书写。用户缺少什么权限才能工作。
遇到错误:pygame.display.init()/dev/fb0pygame.display.init()pygame.error: Unable to open a console terminal
所以,我尝试使用pygame来在帧缓冲区上显示内容/dev/fb0。要使用某些功能,我需要(例如pygame.Surface.convert)必须初始化显示器。但是,当调用时pygame.display.init()我遇到错误,但仅当不以 root 身份执行此操作时才会出现错误。
根据@Nodraak (参考),它与帧缓冲区驱动程序的权限有关 。
回答晚了,但我希望我能早点尝试一下:
您可能需要成为 root 才能使用帧缓冲区驱动程序。
(这对我的情况有帮助:RaspberryPi 2 没有运行 X,但连接了屏幕。我现在可以通过 SSH 或直接在 RPi 上打开显示器)
Atree -fupg / | grep fb | grep rwx 似乎没有显示任何可以由 root 执行但不能由其他人执行的二进制文件。我非常确定将我的用户添加到组中,或在某处调整文件权限就足以解决问题。
注意:出于安全原因,不能以 root 身份运行软件。
我正在尝试转换具有功能的表面pygame.Surface.convert(...)。但收到以下错误:
pygame.error: cannot convert without pygame.display initialized
Run Code Online (Sandbox Code Playgroud)
然而,初始化 …
framebuffer ×10
opengl ×4
linux ×3
python ×2
raspberry-pi ×2
c ×1
gpu ×1
gstreamer ×1
opencl ×1
pixelformat ×1
pygame ×1
pyopengl ×1
sdl-2 ×1
transparency ×1
zero-copy ×1