从根本上讲,二维位图是如何渲染的?


9

假设我们有一台64位的可字寻址的计算机,我们想对其进行编程,以将存储为二进制图像位图(例如下面的一个)的5x7字符输出到内存映射的显示器。

在此处输入图片说明 在此处输入图片说明

由于每个字符有5 x 7 = 35像素,因此我们可以在单个单词中使用35位存储字符。最低有效位从单词的左侧开始,并且图像中的每个像素由第n位表示,如上所示,数字“ 3”将在内存中存储为:011101000100001001100000100011000101110,后跟29个未使用位设置为0。

这是在旧/现代计算机中存储字符的方式吗?还是每个像素使用单个字节/字?

如果以这种方式存储它们,汇编/机器代码中的例程(仅使用基本指令,例如计算机指令集体系结构中的位,算术和数据传输操作)将用来将这些数据转换为图像显示器是什么样的?会是这样吗?

  1. 将要更新的当前像素的x和y显示坐标存储在某个寄存器中。
  2. 将两个选定的RGB值(在这种情况下,绿色为0,255,0,黑色为0,0,0)存储在其他两个单独的寄存器中。
  3. 还有两个寄存器用作初始化为5和7的计数器,以跟踪正在渲染的图像的当前行和列。
  4. 测试列寄存器是否不为0。如果不是,则测试位图的LSB是否设置为1,然后根据结果将相应的RGB值寄存器与x和y坐标寄存器进行“与”运算,然后对结果进行MOV到显示输出寄存器。
  5. 将行计数器寄存器减1,测试是否为0。如果为0,则将其设置回5,并将y坐标增加1,并将列计数器减少1。
  6. 将持有位图的寄存器向左移动1位。
  7. JMP到指令4。

有没有更简单或更有效的方法来做到这一点?看起来像渲染单个小文本字符这样的简单操作也需要大量的操作,并且大约需要200个CPU周期。

最后,在机器级代码方面是否有任何不错的书籍或资源可用于从头开始显示图像,因为我找不到任何东西,因为它们掩盖了这个特定主题,或者代码是用高级语言编写的,或者是使用宏的汇编程序,所有这些都是“作弊的”,并且没有说明最低层的基本情况。


3
图形编程黑皮书无疑是一个经典值得一读。很多老式的黑魔法;)
glampert

是的,我是迈克尔·阿布拉什(Michael Abrash)的第二本书。这是一个伟大的阅读。本书中所写的内容还有很多技巧,但其背后的哲学很重要(即使到今天!)
Romain Piquois

Answers:


7

您必须区分机器图形板的文本和图形模式。

在过去,大多数情况下都支持文本模式。在这种模式下,开发板负责存储字符的位图定义,并在当前光标位置显示它们。您要做的就是在一个小的文本缓冲区中提供字符的ASCII码(每个字符一个字节)。

如今,提供了一个高分辨率的光栅缓冲区,该像素可以访问像素,并且可以使用某种受支持的格式(在“最高”模式下,每像素3字节(RGB),百万像素或更多)来写入颜色信息。

最初,使用了不同大小的简单(打包)二进制位图,并通过对设备驱动程序的请求将其“ 钝化 ”到光栅存储器,并进行了可能的格式转换。

如今,字符大多被定义为矢量绘图矢量绘图是轮廓的与分辨率无关的描述,并且需要进行复杂的渲染过程,其中包括抗锯齿以实现平滑结果。

再次通过blitting,可以将渲染的输出缓存起来以便快速显示。

整个过程很复杂,可以通过硬件加速,并且由操作系统(GUI管理)以透明方式与其他图形基元绘制操作一起处理。


1

简短的回答是“是”,如果您的格式需要它,您将不可避免地进行大量位操作。

绘制位图基本上意味着将像素从源复制到目标,并且您必须执行此操作。(引用上尉队长)

更长的答案是,如果您编写软件光栅化程序,则可以使用某种算法和技巧来节省CPU时间(通过知道源像素格式相同,从而知道不需要绘制的部分(透明度优化))作为目标(直接或以缓存的形式),以最佳方式执行内存复制,等等...基本上考虑光栅化器的绘制循环,并了解如何重组它们以节省CPU时间。(例如:您可以在运行时生成a一段专门用于打印字母A或在源位图信息中包含meta的汇编代码,以告诉您如何跳过透明区域等。)根据CPU指令集,缓冲区格式,渲染原语的算法(旋转?拉伸位图?什么样的过滤?等...),CPU寄存器和缓存等...

因此,无论如何,在过去,当编码和小内存成为常态时,写入单个像素会占用大量CPU周期。:-)但是它不禁止具有8 MHZ CPU的16/32位计算机执行类似的操作:https : //www.youtube.com/watch?v=GWwPJU6pp30(而且还占用了大量CPU资源音乐)

对于HW渲染,HW将执行从源格式到目标格式的转换,尽管它不会使用SW光栅化器可用的许多技巧,但其在HW中的通用实现很可能会击败大多数SW实现。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.