我想使用 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) 我正在设备上使用其他人的代码,该设备可以将图像输出/dev/fb/0并显示在视频上或通过网络发送到客户端应用程序.
我无法访问客户端应用程序的旧源代码,但我知道以下有关数据的信息:
cat-能够 /dev/fb/0如何为此标题或将其转换为JPEG,BMP或RAW类型,然后我可以在桌面应用程序中查看?
最终,我希望它在浏览器中是jpeg和可见的,但是我能用眼睛看到的任何东西现在都可以使用.
(见下面的评论)
ffmpeg \
-vcodec rawvideo \
-f rawvideo \
-pix_fmt rgb565 \
-s 720x480 \
-i in-buffer.raw \
\
-f image2 \
-vcodec mjpeg \
out-buffer.jpg
Run Code Online (Sandbox Code Playgroud)
在宽度方向上三次显示图像,几乎没有颜色,并垂直压扁:
rawtoppm -rgb -interpixel 720 480 fb.raw > fb.ppm
Run Code Online (Sandbox Code Playgroud)
显示图像,但条纹和垂直压扁和颜色不好:
rawtoppm -rgb -interrow 720 480 fb.raw > fb.ppm
Run Code Online (Sandbox Code Playgroud)
与上述类似
convert -depth 16 -size 720x480 frame_buffer.rgb fb.jpeg
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用帧缓冲区来创建使用 Java 和 JOGL 的发光效果,但是我遇到了问题。目前,我的目标是将带有照明纹理的飞船模型渲染为帧缓冲纹理,然后将帧缓冲纹理绘制为三角形扇形四边形。我正在运行 OpenGL 2.1 和/或 2.0 这是我生成帧缓冲区及其纹理的代码:
private int createFrameBuffer(GL2GL3 gl) {
_frameBufferTextureId = GLHelper.makeTextureBuffer(gl, GL2GL3.GL_RGBA, _width / 2, _height / 2, 0, GL2GL3.GL_RGBA,
GL2GL3.GL_UNSIGNED_BYTE, GL2GL3.GL_TEXTURE_MIN_FILTER, GL2GL3.GL_TEXTURE_MIN_FILTER, GL2GL3.GL_REPEAT, null);
int frameBufferId = GLHelper.makeFrameBuffer(gl, _frameBufferTextureId, _width / 2, _height / 2);
return frameBufferId;
}
public static int makeTextureBuffer(GL2GL3 gl, int glEnumInternalFormat, int width, int height, int border,
int glEnumPixelFormat, int glEnumPixelType, int glEnumMinFilter, int glEnumMagFilter, int glEnumWrapMode,
File textureFile) {
ByteBuffer textureDataBuffer = null;
if (textureFile != null) …Run Code Online (Sandbox Code Playgroud) 存在一类使用opengl来提供硬件加速但不基于GUI的应用程序.但是,在默认情况下,使用opengl似乎必须运行带有GLX的X服务器(在同一个虚拟终端上)才能使这些应用程序正常运行.
我的具体案例是试图在无头机器上使用gstreamer的gl插件,但我问的是一个更普遍的问题.
我一直在尝试使用framebuffer内核模块进行研究,但不是很远.
我试图(徒劳地)使用OpenGL和NVIDIA的Cg着色器系统设置MRT,最终目的是推迟渲染。我已经成功为单个目标同时使用了着色器和“渲染到纹理”,但是当我尝试将一个对象渲染到多个渲染目标时,它在任何一个中都无法显示。
我以以下方式设置帧缓冲区对象:
// Initialize textures
// (I'll spare you the code since I've done that without issues)
// Initialize the FBO
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glGenRenderbuffers(1, &depthBuff);
glBindRenderbuffer(GL_RENDERBUFFER, depthBuff);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
GL_RENDERBUFFER, depthBuff);
// -snip-
// Bind each texture we want to use to the FBO at rtNum
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + rtNum,
GL_TEXTURE_2D, tex->getID(), 0);
// Check to make sure we're good to go
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
throw Exceptions::GLException("Frame buffer object is not complete.", …Run Code Online (Sandbox Code Playgroud) 现在,这是一种非常奇怪的行为。
TL;DR——在渲染到纹理设置中,在调整窗口(帧缓冲区 0)大小时,只有下一次调用glClear(GL_COLOR_BUFFER_BIT)绑定帧缓冲区 0(窗口的客户区)会给出GL_OUT_OF_MEMORY,仅在两个中的一个GPU,但是渲染仍然正确且正确地进行。
现在,所有重要的细节:
所以这是在带有两个 GPU 的 Vaio Z 上(可以通过机器上的物理切换按钮切换到):
OpenGL 4.2.0 @ NVIDIA Corporation GeForce GT 640M LE/PCIe/SSE2(GLSL:4.20 NVIDIA 通过 Cg 编译器)
OpenGL 4.0.0 - Build 9.17.10.2867 @ Intel Intel(R) HD Graphics 4000 (GLSL: 4.00 - Build 9.17.10.2867)
我的程序在使用 GLFW 64 位的 Win 7 64 位下的 Go 1.0.3 64 位。
我有一个相当简单直接的渲染到纹理“迷你管道”。首先,普通 3D 几何体使用最简单的着色器(没有照明,什么都没有,只有纹理三角形网格,它们只是一些立方体和平面)渲染到具有深度/模板渲染缓冲区作为深度/模板附件和texture2D 作为颜色附件。对于纹理,所有过滤都被禁用,mip-maps 也是如此。
然后我渲染一个全屏四边形(实际上是一个“超大”全屏三边形),只是从带有 texelFetch(tex, gl_FragCoord.xy, 0) 的所述帧缓冲区纹理(颜色附件)中采样,因此不使用包装。
两个 GPU 都可以很好地呈现这一点,无论是在我强制执行核心配置文件还是不执行核心配置文件时。没有为此报告任何 GL 错误,所有渲染也按预期进行。除非我在使用 Intel HD 4000 GPU 的 GL 4.0 渲染器(在 Core …
我正在GPU上生成纹理并将其渲染到我自己的帧缓冲对象.它工作正常,纹理呈现为WebGLTexture,我可以传递给其他着色器.但是我想在javascript中访问WebGLTexture像素.有没有办法实现这一目标?
目前我正在使用gl.ReadPixels在我将纹理绘制到我的帧缓冲区后读取像素.这工作正常,但如果我可以直接访问WebGLTextureObject中的像素会不会更好?
我想要实现的是:我有GLSL perlin噪声着色器,可以在GPU上渲染高清高度图和法线贴图.我想将高度图传递给CPU,以便我可以为网格生成顶点.我当然可以将顶点定位在顶点着色器中,但我需要在CPU中进行碰撞检测.
我希望我的问题很明确.欢迎任何反馈!
谢谢!
我有一个带 GPIO 显示的 Raspberry Pi。我目前将它设置为 /dev/fb1 中的帧缓冲设备。有没有办法让它成为 X 窗口的默认或主要显示?我最终试图为它绘制图形,我最初计划使用 DirectFB 和 SDL,但 DirectFB 是 pi 的 alpha。我也尝试过使用 SDL1.2,因为它支持帧缓冲,但我不知道如何让 SDL 选择要绘制的帧缓冲设备而不使用 DirectFB。
我考虑使用 SDL 将我的简单 GUI 的每一帧准备为原始图像,并使用 mmap 将其 blit 到 /dev/fb1 而不是使用 SDL 的内置绘图函数,但我觉得这是实现我的目标的一种糟糕方式。
我认为如果我可以让 xorg 使用我的帧缓冲设备作为主监视器,我就不必担心做任何特殊的事情来让 SDL 绘制我的图像文件。但我不太确定 xorg 是如何工作的,以及这是否可能。
任何人的任何见解或帮助都会有很大帮助!一个星期以来,我一直在解决这个问题,寻找不同的可能性。
如何使用 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) 我在使用python读取相机的帧缓冲区时遇到问题。相机(Xenics)通过USB连接,相机随附一个dll。我使用ctypes访问此dll。我使用的代码主要受lantz的python模块(lantz_drivers_xenics)启发。
dll提供了XC_CopyFrameBuffer我用来将帧缓冲区复制到numpy数组的功能。
虽然原则上采集工作正常,但麻烦在于以中等或高速连续读取帧缓冲区。相机随附的已编译软件能够以24 fps的速度读出相机。在我的程序中,我想读取5到25 fps之间的帧缓冲区。但是,我无法达到此值,因为调用XC_CopyFrameBuffer函数所需的时间在0到〜0.5秒之间;它通常很低,但是大约每三帧大约需要0.5秒。
我的真实程序更复杂,使用线程并处理获取的图像。但是我将代码简化为一个重现问题并已附加的最小示例。它的文本和图形输出如下所示。我的问题是:
这是我正在使用的代码:
import time
import ctypes
import threading
import numpy as np
from numpy.ctypeslib import ndpointer
calibration_file = r"C:\Path\to\some\calibrationfile.xca"
dll = "C:\\Programme\\X-Control\\xcamera.dll"
lib = ctypes.WinDLL(dll) #for xcamera we need ctypes.WinDLL
exposure_time = 300 #microseconds (us)
readlock = threading.Lock()
#add types
lib.XC_OpenCamera.argtypes = [ctypes.c_uint]
lib.XC_CloseCamera.argtypes = [ctypes.c_uint]
lib.XC_IsInitialised.argtypes = [ctypes.c_uint]
lib.XC_LoadFromFile.argtypes = [ctypes.c_uint, ctypes.c_char_p]
lib.XC_LoadCalibrationPack.argtypes = [ctypes.c_uint, ctypes.c_char_p]
lib.XC_SetGainCamera.argtypes = [ctypes.c_uint, ctypes.c_double]
lib.XC_SetIntegrationTime.argtypes …Run Code Online (Sandbox Code Playgroud) framebuffer ×10
opengl ×5
python ×2
raspberry-pi ×2
textures ×2
c ×1
camera ×1
cg ×1
command-line ×1
ctypes ×1
driver ×1
ffmpeg ×1
go ×1
gstreamer ×1
imagemagick ×1
java ×1
javascript ×1
jogl ×1
linux ×1
pyopengl ×1
rgb ×1
shader ×1
webgl ×1
xorg ×1