Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SDL 1.3:如何在不显示视频的情况下渲染视频?_C++_Opengl_Rendering_Sdl_Shader - Fatal编程技术网

C++ SDL 1.3:如何在不显示视频的情况下渲染视频?

C++ SDL 1.3:如何在不显示视频的情况下渲染视频?,c++,opengl,rendering,sdl,shader,C++,Opengl,Rendering,Sdl,Shader,所以我需要的很简单:假设我们根本没有gui——ssh访问我们要构建和托管应用程序的linux。该应用程序将生成视频流。我们有一些带有OpenGL着色器的SDL应用程序。我们所要做的就是以char*(大小为W*H*3)的形式进行渲染(通常我们在SDL窗口中会这样做),怎么做?如何使SDL呈现的东西不是在gui窗口上,而是在一些可交换的指针上?在OpenGL中不能直接呈现到字节数组 有两种方法可以解决这个问题。第一种方法是最简单的,不需要上下文噱头,第二种方法需要 首先,简单的方法 为了让OpenG

所以我需要的很简单:假设我们根本没有gui——ssh访问我们要构建和托管应用程序的linux。该应用程序将生成视频流。我们有一些带有OpenGL着色器的SDL应用程序。我们所要做的就是以char*(大小为W*H*3)的形式进行渲染(通常我们在SDL窗口中会这样做),怎么做?如何使SDL呈现的东西不是在gui窗口上,而是在一些可交换的指针上?

在OpenGL中不能直接呈现到字节数组

有两种方法可以解决这个问题。第一种方法是最简单的,不需要上下文噱头,第二种方法需要

首先,简单的方法

为了让OpenGL工作,您需要有一个窗口。这并不意味着窗口需要可见,但您需要创建一个窗口以获得有效的OpenGL上下文。因此步骤1:创建一个窗口并最小化它。

现在,为了获得有效的渲染,帧缓冲区中的像素必须通过“像素所有权测试”。当渲染到保存屏幕本身的帧缓冲区时,屏幕上实际不可见的窗口像素无法通过像素所有权测试。因此,如果使用glReadPixels,这些像素的值是未定义的

但是,这仅适用于与窗口关联的默认帧缓冲区。帧缓冲区对象始终通过像素所有权测试。因此,第2步:根据需要创建帧缓冲区对象和关联的renderbuffers。

从这里开始,这很简单。当你想要得到数据的时候,只需要渲染为普通的,然后做一个glReadPixels。可以用于异步传输像素数据,如果性能是一个问题步骤3:渲染并使用glReadPixels获取数据。


第二种方法更广泛(FBO需要扩展支持或OpenGL 3.0),但更特定于平台

您没有在步骤2中创建FBO,而是使用步骤2:用于创建pbuffer。pbuffer是一个屏幕外渲染目标,其作用类似于默认帧缓冲区。您需要告诉OpenGL渲染到pbuffer而不是默认的帧缓冲区


第1步和第3步与上述步骤相同。

要想发挥任何作用,OpenGL应该是硬件加速的,因此首先检查您的服务器是否有符合您要求的GPU。如果您在租用的虚拟服务器或标准根服务器上,那么您很可能没有GPU

如果您有GPU,则有两种可能的方法:


方法1——简单的方法

不幸的是,您必须为其配置并启动X服务器此X服务器也必须是当前虚拟终端(即,它必须是图形卡上的活动对象)。然后,让运行该视频生成器的用户访问该X显示(读取
manxauth
及其引用内容)

下一步独立于SDL,这是一个OpenGL思想:创建一个帧缓冲区对象,在该对象上渲染所需的图形;PBuffer也可以,实际上我更喜欢这种情况,不过我发现在当前的Linux及其驱动程序上,帧缓冲区对象比PBuffer更可靠

然后像往常一样渲染到此帧缓冲区对象或PBuffer,并使用
glReadPixels


方法2——灵活的方法

在底层,这与方法1非常相似,但是事情变得抽象了:让VirtualGL在GPU上执行实际的OpenGL渲染。您不需要在辅助X服务器上启动应用程序,而是直接使用提供的VirtualGL服务器发送GLX流并返回JPEG图像流。您还可以使用运行虚拟帧缓冲区的辅助X服务器,并对其进行连续截屏。或者可能是最优雅的:编写自己的X.Org视频驱动程序,直接将视频传输到视频流