1

我一直在使用 SDL 在 C 中渲染图形。我知道在 Windows 上创建像素级别的图形有多种选择,包括 SDL 和 OpenGL。但是这些程序是如何做到的呢?好吧,我可以使用 SDL。但我想知道 SDL 在做什么,所以我不觉得自己是个无知的傻瓜。我是唯一一个对现代计算机上不透明的结霜层感到沮丧的人吗?

关于如何在其他操作系统上完成此操作的简短解释也很有趣,但我最关心的是 Windows。

编辑:由于这个问题似乎有点不清楚,这正是我想要的:我想知道像素级图形操作(在屏幕上逐个像素地绘制)如何在 Windows 上工作。像 SDL 这样的库对操作系统做了什么来允许这种情况发生。我可以使用 SDL 逐个像素地操作屏幕,那么 SDL 中发生了什么神奇的事情让我这样做呢?

4

1 回答 1

1

Windows 有许多图形 API。有些是建立在其他层之上的层(例如,GDI+ 位于 GDI 之上),而另一些则是完全独立的堆栈(如 Direct3D 系列)。

在像 GDI 这样的 API 中,有像SetPixel这样的函数,可以让您更改屏幕上(或您可以访问的屏幕区域内)单个像素的值。但是使用 SetPixel 设置大量像素通常很慢。

如果您要构建一个逼真的渲染器,如光线追踪器,那么您可能会在内存中构建一个位图(逐个像素),并使用像BitBlt这样的 API 将整个位图一次发送到屏幕。这要快得多。

但它仍然可能不够快,无法渲染视频之类的东西。将所有数据从系统内存移动到视频卡内存需要时间。对于视频,通常使用更接近低级图形驱动程序和硬件的图形堆栈。如果显卡可以直接进行视频解压,那么将压缩后的视频流发送到显卡将比将解压后的数据从系统内存发送到显卡效率更高——这通常是限制因素。

但从概念上讲,这是一回事:您正在操作一个位图(或纹理、表面或光栅或......),但该位图存在于图形内存中,并且您正在向 GPU 发出命令以设置像素的方式你想要,然后在屏幕的某个部分显示该位图(通常带有某种转换)。

现代图形处理器实际上运行小程序——称为着色器——可以(除其他外)进行计算以确定像素值。GPU 已针对执行这些类型的计算进行了优化,并且可以并行执行其中的许多计算。但归根结底,它归结为将像素值放入视频内存中的某种位图中。

于 2012-10-23T16:43:13.517 回答