【发布时间】:2011-01-06 00:32:14
【问题描述】:
据我所知,渲染图像并决定要在显示器上显示的像素值是 GPU 的工作。如果我有一个连接到 GPU 的显示器并且我想尝试使用软件渲染器,
GPU 和软件渲染器之间的工作是如何划分的?我问这个是因为我的显示器仍然连接到 GPU,所以 GPU 必须传输软件渲染器计算的像素值。但这就是 GPU 的全部功能吗?是否有一种特定的方式告诉 GPU“只将这些值传递给监视器”。
我是新手,但我想了解详情。
【问题讨论】:
据我所知,渲染图像并决定要在显示器上显示的像素值是 GPU 的工作。如果我有一个连接到 GPU 的显示器并且我想尝试使用软件渲染器,
GPU 和软件渲染器之间的工作是如何划分的?我问这个是因为我的显示器仍然连接到 GPU,所以 GPU 必须传输软件渲染器计算的像素值。但这就是 GPU 的全部功能吗?是否有一种特定的方式告诉 GPU“只将这些值传递给监视器”。
我是新手,但我想了解详情。
【问题讨论】:
我相信你有一些概念混淆了。 GPU(图形处理单元)就像 CPU。如果您正在构建软件渲染器,您仍将与显卡接口以设置分辨率和绘制/位 blit 像素到屏幕。
这是硬件和软件渲染之间的高级差异。由于存在顶点/像素着色器等,我已经过度简化了。GPU 还可以为程序执行数学运算,只需查看 OpenCL。
软件
我想画一个三角形。鉴于它的三个点,我需要找出边缘的斜率以及要在屏幕上填充的 x,y 坐标。这将涉及循环遍历三角形的每个像素并将其绘制到屏幕上。
硬件
我想画一个三角形。向 GPU 发送 3 个坐标并告诉它进行绘制。 GPU 计算出要填充的像素等。
请理解这过于简化了流程。
【讨论】:
GPU 或多或少是一种硬件设备,与 CPU 相比,它可以很好地执行某些类型的矢量数学运算。 GPU 的功能远比 CPU 受限,但它可以快速完成。
除非您使用 DirectX 或 OpenGL,否则您很可能正在执行软件渲染。如果您使用的是 DirectX 或 OpenGL,那么您可能正在使用硬件渲染(尽管两者都有纯软件实现)。
硬件和软件渲染最终都输出到称为framebuffer的可寻址内存(它保存要渲染到屏幕的输出位图),唯一的区别是设置该内存的硬件(例如CPU或GPU)。
framebuffer 中寻址的物理内存通常是 GPU 的一部分(我不确定它是否真的必须在 GPU 上,欢迎输入)。
【讨论】:
在旧的 Windows 和 DirectX 版本中,您可以调用 DirectDraw 表面的 Lock() 方法来获取指向帧缓冲区的临时直接指针,您可以像访问 RAM 中的任何其他位图一样几乎访问它。同样可以通过 VESA 驱动程序/其他 API 在 DOS 中完成,也可以通过 Pocket PC/Windows mobile 上的 GX 驱动程序完成。不确定其他操作系统。
帧缓冲区是内存中的一个区域,由显示硬件直接流式传输到输出设备。通常它在显卡上,但可以映射到您的应用程序的地址空间并像普通 RAM 一样直接访问。但是,很明显,读/写速度是不同的。读取速度通常非常低,写入速度非常好,但前提是您只存储连续的、对齐的 32/64/128 位字。通常最好在 RAM 的屏幕外缓冲区中渲染所有内容,然后将其内容 memcpy 到帧缓冲区中。一些显卡支持从 RAM 表面到帧缓冲区的独立于硬件 CPU 的 blitting,但它可能有问题和/或速度很慢。
【讨论】:
这取决于您在哪个级别执行此“软件渲染”。除非您正在编写自己的窗口系统,否则操作系统仍将使用 GPU 来帮助它对所有窗口进行 blit。
如果你想编写一个软件渲染器,实现它的最简单方法是渲染到内存中的位图,然后调用操作系统说“哦,嘿,你能把这个图像绘制到屏幕给我?”。
【讨论】: