Linux GPU如何渲染到正确的窗口?
我不懂opengl窗口的渲染。假设我想让我的图形卡在屏幕上画一个场景。我的opengl窗口位于位置,比如50、50、100、100(x、y、宽度、高度)。GPU知道在这个位置绘制场景。这称为视口,GPU以矩阵的形式获取视口信息Linux GPU如何渲染到正确的窗口?,linux,opengl,window,viewport,Linux,Opengl,Window,Viewport,我不懂opengl窗口的渲染。假设我想让我的图形卡在屏幕上画一个场景。我的opengl窗口位于位置,比如50、50、100、100(x、y、宽度、高度)。GPU知道在这个位置绘制场景。这称为视口,GPU以矩阵的形式获取视口信息 当我将opengl窗口从位置50、50、100、100移动到位置150、150、100、100时会发生什么。GPU如何在渲染场景的同时获取新的视口信息(可能现在处于fragmentshader阶段)。它将在位置50、50、100、100绘制错误的像素。请解释。我不知道图形
当我将opengl窗口从位置50、50、100、100移动到位置150、150、100、100时会发生什么。GPU如何在渲染场景的同时获取新的视口信息(可能现在处于fragmentshader阶段)。它将在位置50、50、100、100绘制错误的像素。请解释。我不知道图形堆栈的整个内部结构,但当您请求视口时,您将从
显示服务器(如X服务器或wayland)获得像素缓冲区。GPU进行计算,用颜色填充帧缓冲区。然后,显示服务器将帧缓冲区抛出到窗口。这太简单了,我有些细节弄错了。在linux上,从退出的用户空间到进入内核,直到最终在屏幕上看到帧缓冲区,都会发生一系列复杂的事件。我不知道图形堆栈的整个内部结构,但当您请求一个视口时,您正在从显示服务器(如X服务器或wayland)获取像素缓冲区。GPU进行计算,用颜色填充帧缓冲区。然后,显示服务器将帧缓冲区抛出到窗口。这太简单了,我有些细节弄错了。在linux上,有一个复杂的事件管道,从退出的用户空间开始,进入内核,最后在屏幕上看到帧缓冲区
我的opengl窗口位于位置,比如50、50、100、100(x、y、宽度、高度)。GPU知道在这个位置绘制场景
是吗?您正在对渲染系统、操作系统和GPU的内部工作的具体性质进行假设
在许多基于合成的渲染系统中,在执行OpenGL命令时生成的渲染操作将渲染到内存中的一些图像数据。当您执行交换缓冲区调用时,该图像将被复制到您看到的实际屏幕区域。因此,当移动窗口时,所发生的只是将渲染到的图像复制到不同的位置。虽然复制确实是由GPU执行的,但您直接导致的渲染操作并不知道它们的结果最终会出现在什么位置
即使在直接渲染以显示内存的渲染系统中,谁说可以设置为“视口”的内容不受内部OpenGL驱动程序的操纵?当您将窗口从一个位置移动到另一个位置时,驱动程序只需偏移您的视口设置,您就不会知道了
基本上,有很多方法可以实现,选择哪种方法完全取决于OpenGL实现(以及附带的OS/渲染系统)如何选择处理屏幕位置
我的opengl窗口位于位置,比如50、50、100、100(x、y、宽度、高度)。GPU知道在这个位置绘制场景
是吗?您正在对渲染系统、操作系统和GPU的内部工作的具体性质进行假设
在许多基于合成的渲染系统中,在执行OpenGL命令时生成的渲染操作将渲染到内存中的一些图像数据。当您执行交换缓冲区调用时,该图像将被复制到您看到的实际屏幕区域。因此,当移动窗口时,所发生的只是将渲染到的图像复制到不同的位置。虽然复制确实是由GPU执行的,但您直接导致的渲染操作并不知道它们的结果最终会出现在什么位置
即使在直接渲染以显示内存的渲染系统中,谁说可以设置为“视口”的内容不受内部OpenGL驱动程序的操纵?当您将窗口从一个位置移动到另一个位置时,驱动程序只需偏移您的视口设置,您就不会知道了
基本上,有很多方法可以实现,选择哪种方法完全取决于OpenGL实现(以及附带的OS/渲染系统)如何选择处理屏幕位置