我一直在使用SDL在C中渲染图形。我知道有几种选择可以在Windows上的像素级创建图形,包括SDL和OpenGL。但是这些程序是如何做到的呢?好吧,我可以使用SDL。但是我想知道SDL在做什么,所以我不觉得自己是个无知的傻瓜。我是唯一一个对现代计算机上不透明的结霜层感到沮丧的人吗?
关于如何在其他操作系统上执行此操作的简短说明也很有意思,但我最关心的是Windows。
编辑:由于这个问题似乎有点不清楚,这正是我想要的: 我想知道像素级图形处理(在屏幕上逐像素绘制)如何在Windows上运行。像SDL这样的库对操作系统做了什么来实现这一点。我可以使用SDL逐个像素地操作屏幕,那么SDL中有什么神奇之处让我这么做呢?
答案 0 :(得分:1)
Windows有许多图形API。有些层是在其他层之上构建的(例如,GDI +在GDI之上),而其他层是完全独立的堆栈(如Direct3D系列)。
在像GDI这样的API中,有SetPixel这样的函数可以让你更改屏幕上(或者你有权访问的屏幕区域内)单个像素的值。但是使用SetPixel设置大量像素通常很慢。
如果您要构建逼真的渲染器(如光线跟踪器),那么您可能会在内存中逐个像素地构建位图,并使用像BitBlt这样的API将整个位图发送到屏幕一下子。这要快得多。
但它仍然可能不足以呈现像视频这样的东西。将所有数据从系统内存移动到视频卡内存需要时间。对于视频,使用更接近低级图形驱动程序和硬件的图形堆栈是很常见的。如果显卡可以直接进行视频解压缩,那么将压缩视频流发送到卡将比将解压缩数据从系统内存发送到视频卡更有效 - 而这通常是限制因素。
但从概念上讲,它是一样的:你正在操纵一个位图(或纹理或表面或光栅或......),但该位图存在于图形内存中,而你正在向GPU发出命令来设置像素的方式,然后在屏幕的某个部分显示该位图(通常进行某种转换)。
现代图形处理器实际上运行的程序很少 - 称为着色器 - 可以(除其他外)进行计算以确定像素值。 GPU经过优化,可以进行这些类型的计算,并且可以并行执行其中的许多计算。但最终,归结为将像素值放入视频内存中的某种位图。