【问题标题】:Pixel level manipulation windows像素级操作窗口
【发布时间】:2012-10-11 21:27:06
【问题描述】:

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

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

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

【问题讨论】:

  • 当你问“这些程序做到了”时,“这些程序”是什么,它们的“它”是什么?
  • SDL 和 OpenGL 渲染图形。显然他们以某种方式与操作系统对话。我想知道他们在说什么。
  • 您遇到的具体问题是什么?像 »X 是如何工作的?«这样纯粹的好奇心问题很少成为话题。
  • 是的,“X 是如何工作的”。不要告诉我 Stack Overflow 出于好奇而反对提问。
  • 为了好奇而提出的问题并没有什么仇杀,但你的问题太宽泛太模糊了。 “渲染图形”涵盖了从将单点绘制到屏幕到 BRDF、体积阴影、卷积、颜色校正、扭曲等所有内容。请更具体地说明您想了解的内容。此外,在某些情况下,对于那些没有操作系统或驱动程序来源的人来说,具体的答案可能是不知道的。 (例如,OpenGL 最终会调用供应商的驱动程序在您机器的特定硬件上运行代码。)

标签: windows graphics sdl pixel


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 当您告诉显卡渲染视频、绘制一些多边形、进行一些像素着色或其他操作时,显卡是直接将其渲染到显存,还是操作系统占用所有把图片的点点滴滴,在一个窗口中粘贴到另一个窗口上,然后将所有这些都粘贴到视频内存中?
  • @BigEndian:现代操作系统会安排显卡在可行的情况下直接渲染到显存。将数据通过图形总线移动到系统内存,然后再返回到视频内存将非常昂贵。图形总线现在非常快,但它们仍然很容易成为瓶颈。
  • 谢谢 :) 现在我要去看看 BitBlt!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 2012-10-31
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
相关资源
最近更新 更多