C++ SDL 1.3:如何在不显示视频的情况下渲染视频?
所以我需要的很简单:假设我们根本没有gui——ssh访问我们要构建和托管应用程序的linux。该应用程序将生成视频流。我们有一些带有OpenGL着色器的SDL应用程序。我们所要做的就是以char*(大小为W*H*3)的形式进行渲染(通常我们在SDL窗口中会这样做),怎么做?如何使SDL呈现的东西不是在gui窗口上,而是在一些可交换的指针上?在OpenGL中不能直接呈现到字节数组 有两种方法可以解决这个问题。第一种方法是最简单的,不需要上下文噱头,第二种方法需要 首先,简单的方法 为了让OpenGL工作,您需要有一个窗口。这并不意味着窗口需要可见,但您需要创建一个窗口以获得有效的OpenGL上下文。因此步骤1:创建一个窗口并最小化它。 现在,为了获得有效的渲染,帧缓冲区中的像素必须通过“像素所有权测试”。当渲染到保存屏幕本身的帧缓冲区时,屏幕上实际不可见的窗口像素无法通过像素所有权测试。因此,如果使用glReadPixels,这些像素的值是未定义的 但是,这仅适用于与窗口关联的默认帧缓冲区。帧缓冲区对象始终通过像素所有权测试。因此,第2步:根据需要创建帧缓冲区对象和关联的renderbuffers。 从这里开始,这很简单。当你想要得到数据的时候,只需要渲染为普通的,然后做一个glReadPixels。可以用于异步传输像素数据,如果性能是一个问题步骤3:渲染并使用glReadPixels获取数据。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
第二种方法更广泛(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视频驱动程序,直接将视频传输到视频流