GPU 如何渲染到正确的 window?

How does the GPU render to the correct window?

我不明白 opengl 的渲染window。所以假设我想让我的显卡在屏幕上绘制一个场景。我的 opengl window 位于位置,比方说 50、50、100、100(x、y、宽度、高度)。 GPU 知道在这个位置绘制场景。这称为视口,GPU 以矩阵的形式获取此视口信息。

当我将我的 opengl window 从位置 50、50、100、100 移动到位置 150、150、100、100 时会发生什么。GPU 如何在渲染场景的同时获取这个新的视口信息(也许它现在处于片段着色器阶段)。它会在位置 50、50、100、100 绘制错误的像素。请解释。

我不了解图形堆栈的全部内部结构,但是当您请求视口时,您会从 display server(例如 X 服务器或 Wayland)获取像素缓冲区。 GPU 进行计算以用颜色填充帧缓冲区。然后显示服务器将帧缓冲区扔到 window。这太简单了,我有一些细节错误。在 linux,从退出用户 space,进入内核到最终在屏幕上看到您的帧缓冲区,发生了复杂的事件管道。

My opengl window is at location, lets say 50, 50, 100, 100 (x, y , width, height). The GPU knows to draw the scene at this location.

是吗?您正在假设渲染系统内部结构 OS 和 GPU 正在执行的操作的具体性质。

在许多基于合成的渲染系统中,您在执行OpenGL 命令时生成的渲染操作会渲染到一块内存中,一些图像数据。当您执行交换缓冲区调用时,该图像将被复制到您看到的实际屏幕区域中。因此,当您四处移动 window 时,所发生的只是您渲染的图像被复制到不同的位置。虽然复制确实是由 GPU 执行的,但您直接导致的渲染操作并不知道它们的结果最终会出现在什么位置。

即使在直接渲染到显示内存的渲染系统中,谁能说您可以设置为 "viewport" 的内容不受内部 OpenGL 驱动程序的操作?当您将 window 从一个位置移动到另一个位置时,驱动程序可以简单地偏移您的视口设置,您将 none 变得更聪明。

基本上,有很多种实现方式,选择哪种方式完全取决于 OpenGL 实现(以及随之而来的 OS/rendering 系统)如何选择处理屏幕位置。