如何在CGA中获得1024种颜色?真的有1024个吗?

于2015年推出的翻译版本“新图形模式:1024种颜色的CGA”给我留下了很深刻的印象,但是从那以后,我仍然不明白此技巧的工作原理,因为该文章是由复古计算机图形领域的专业人员撰写的,并提出了建议。读者已经对该领域有所了解。尽管我的第一台计算机(“搜索”是IBM PC / XT的苏联克隆版)具有CGA,但我没有找到带有复合输入的显示器,因此我不得不在Google上搜索并弄清楚复合视频的工作原理。对于那些也对1981年的“内部”技术感兴趣的人(在2015年发现了意外的未记录的机会),我整理了一下我发现的材料。

1.本机CGA功能


对于外行而言,CGA通常与320x200图形和具有令人毛骨悚然的颜色的四色调色板相关联,例如在1983年的Alley CatJ-birdLode RunnerTapper游戏中




但是320x200x2bpp的限制仅取决于适配器上可用的视频内存量(16 Kb) ,实际上,它能够产生640x200x4bpp的图像-像素在垂直方向上强烈拉长。例如,在80x25文本模式下使用此功能,该模式具有16色字符和背景,以及8x8像素的字符矩阵。 (可以计算出,在这种情况下,屏幕缓冲区仅占用80x25x2 = 4000字节。)但是,如果图形以这种“高分辨率” 640x200输出,则16 KB的视频内存仅足够用于黑白图像。例如,Windows直至3.0(包括3.0版)均支持这种图形模式:



在输出端,CGA产生了专门为其发明RGBI接口的数字信号:两条同步线发出信号,指示帧的开始和扫描线的开始,视频信号的四行传输当前像素的四位颜色。但是在1981年,很少有能够在输入端接收RGBI数字信号的监视器。 IBM本身仅在1983年才开始生产这种数字显示器。对于家庭用户而言,CGA得出了第二个结论-演示现场的主人想到的非常复合的视频信号。它可以通过RF调制器连接到美国传统电视的天线输入,再加上一些电视具有特殊的复合输入(例如用于连接VCR),使您可以绕过调谐器输入视频信号并避免不必要的调制/解调。



视频适配器捆绑的一部分由数字输出(这是美国彩色电视标准)形成复合NTSC信号,仅用于过渡阶段,直到所有PC用户都获得数字显示器为止。IBM的下一个视频适配器-EGA(1984)-在RGBI接口中使用一对先前未使用的触点,仅支持数字(已经是6位)输出。此外,不建议将“高分辨率”模式用于复合视频输出,因为扫描线中的640像素超出了NTSC的功能。下一节将说明原因;Wikipedia 演示了如何在复合输入监视器上以80列CGA模式模糊文本:




2.电视功能


黑白电视的布置非常简单:电子束逐行绕过屏幕,视频信号电平直接控制束的功率。在行之间和帧之间的反激期间,光束被关闭,视频信号传输同步脉冲。由于信号是完全模拟的,因此未定义其水平分辨率:亮度可以在整个行中平滑变化。另一方面,垂直分辨率由水平扫描频率(NTSC为243行)硬设置。

在MS Paint中仔细绘制的插图显示了视频信号如何寻找由两个垂直条纹组成的帧:宽暗和窄亮。在顶部,示意性地示出了用于一行的信号,在底部,示意性地示出了用于一系列行的信号。在每行之前发送“比黑黑”的同步脉冲 创建彩色电视时,重要的是现有的黑白电视接受可接受的彩色视频。美国人提出了以下技巧:颜色信息通过副载波谐波信号传输



添加到亮度信号。然后,不知道如何隔离和分析子载波谐波的黑白电视将在像素传输时间内以与平均信号值相对应的亮度突出显示每个像素。如果副载波频率足够大,则附加信号将不会影响平均值,即在显示的亮度上。现在我们同意子载波的相移对应于颜色的色调,其幅度对应于饱和度;颜色分为亮度,色相和饱和度对应于YIQ颜色模型

第二个示意图示意性地显示了由彩色垂直条纹组成的帧的一行的视频信号。在时钟和行开始之间传输了一个附加的色同步信号。,它将接收机设置为将从其测量副载波偏移的相位。现在,信号的平坦部分(即子载波的振幅为零)将对应于灰条(零饱和度);取决于子载波幅度,子载波在色同步相位对应于具有两个不同饱和度值的黄色带的区域;副载波相对于色同步信号处于反相状态的曲线图-蓝色条。由于所有区域的平均信号电平相同,因此黑白电视接收机以相同的灰色阴影显示所有频段。 NTSC要求辅助信号为正弦波,但这并不那么重要:图中所示的方波(曲折


)由具有所需频率和相位的谐波以及电视接收机忽略的高频添加剂组成。该谐波的幅度大于4/π次数,但是由于TV使用的子载波的幅度不是绝对值,而是相对于从色同步信号中提取的幅度,因此彩色显示不受矩形的正弦形添加剂的影响。CGA和其他原始数字设备会精确地生成方波。

为了简化主信号(亮度)和附加信号(颜色)的分离,NTSC标准化了副载波频率,该副载波频率比水平频率高227.5倍-即对于每一行,以及行之间的间隔,共有227.5个子载波周期。因此,美国彩色电视具有一定的水平分辨率:亮度仍然可以在整条线上平稳地变化,但是色相的频率受到子载波频率的限制。如果电视接收到水平分辨率为640像素的视频信号,则子载波周期的大约三分之一对应于每个像素,并且原始硬件滤波器没有时间从每个像素的信号中正确识别子载波的相移和幅度。这会导致意外的结果-由于模糊,如上例所示,创建之前常规适配器无法获得的“伪影”颜色(我真的不喜欢使用“虚假颜色”这个名称SLY_G翻译一篇约1024种颜色的文章;英语单词artifact的主要含义是“人造的,人工创建的”,将这些颜色与CGA的“天然”形成对比,而与寄生无关。)

确切地说,与水平分辨率相关联的是CGA中的硬件错误:在640x200模式下(即h。在80列文本中)复合监视器上的图像原来是黑白的。此错误的解决方法众所周知:您需要在图像周围设置一个棕色框事实是,形成时钟信号的条带以视频适配器的时钟周期设置其持续时间。在640x200模式下,这些时钟的长度是320x200模式下的一半,因此帧线之间的时钟也比NTSC所需的时钟短两倍。结果,色同步只是没有时间被发送。但是,如果图像周围有一个棕色框(棕色几乎具有零相移,低亮度,并且饱和度对应于色同步信号的近似幅度),则监视器将框的左侧作为色同步信号,不将其绘制在屏幕上,并且已正确设置为彩色副载波相位。



3. CGA复合信号装置


尽管CGA产生的数字视频信号的水平分辨率最高可达640像素(即一行中的数字信号电平变化640),但是无论使用哪种视频模式,复合视频信号都可以认为分辨率为1280“子像素”。对于640x200模式下的每个像素,在320x200模式下有两个子像素-四个。视频适配器为当前子像素输出的信号电平(以伏特为单位)由公式计算得出U=0.41+I0.3+C0.75,其中位I(强度)直接取自当前像素的颜色,信号C(色度)由多路复用器根据颜色的其他三位(R,G,B)选择:
[RGC颜色
00000000000…黑色的
001个00001111…蓝色(〜180°)
01个011100001…绿色(〜45°)
01个1个11000011…绿松石(〜90°)
1个0000111100…红色(〜270°)
1个01个00011110…洋红色(〜225°)
1个1个011110000…黄色(〜0°)
1个1个1个11111111…白色
色度颜色对应于色度信号,其周期为八个子像素,并且相移接近45°的倍数,即 到整数个子像素。由于CGA中巧妙的延迟方案,颜色的相移与45°的倍数略有差异(在±10°内),从而更接近标准NTSC颜色

因此,在一行的227.5个子载波周期中,有160个在输出图像中,其余的在行之间的间隔中(时钟,色同步和图像周围的帧)。重要的是,从色同步信号到行的第一个像素必须有非整数个子载波周期:第一个像素开始以45°传输,因此如果行以四个黄色像素开始,则色度信号将在传输相应的八个子像素期间取值11100001

像素亮度(luma),即 子载波周期的信号电平平均值,得到L=0.72Cavg+0.28I哪里 Cavg=RGB+RGB2:0.5(代表彩色),0(代表黑色)和1(代表白色)。这意味着在黑白复合监视器上,第一个CGA(1981)模型只能显示六种灰度。在后来的CGA模型中(自1983年起),副载波的非周期性加法开始依赖于所有四个颜色位,因此亮度对应于一个更复杂的公式L=0.29Cavg+0.1R+0.22G+0.07B+0.32I,这使我们能够在黑白监视器上针对16种颜色值中的每一个显示自己的灰色阴影。改进的结果是,亮度不同且更接近数字显示颜色的颜色也开始显示在彩色复合监视器上: 硬件错误和从数字输出形成复合信号的捆扎缺陷表明CGA开发人员不太担心使用它使用复合监视器,甚至不用担心如何在复合监视器上显示“高分辨率”模式。但是,正是这种不受支持的组合使恶魔大师能够将不可想象的东西从CGA中挤出来!






4.意外的CGA功能...


4a)...在图形模式下


如上所述,在复合视频信号中以一种颜色阴影的线的一部分变成具有八个子像素的周期的曲折。反之亦然:任何以八个子像素为周期重复的复合信号都将显示为线条的单色部分,因为从其中提取的谐波子载波将具有恒定的相移和恒定的振幅。确切地将要使用什么相移更难以预测。关于1024色的文章显示了结果而没有任何解释: Nybble列显示了在640x200x1bpp模式下四个像素重复的顺序,即八个子像素。其中两个序列(



01011010)对应具有四个子像素周期的曲折:在这样的波中根本没有谐波子载波,因此生成的颜色为灰色。另外四个序列(0011, 0110, 1001, 1100)对应于纯副载波-分别偏移135°,225°,45°和315°。这些波中的两个设置了标准的紫色和绿色,其余两个设置为蓝色和橙色,这是常规CGA无法实现的。信号填充率为75%(顺序0111, 1011, 1101, 1110)对应于子载波相移了半个像素,即在一个子像素上但是结果与标准颜色的相位不完全匹配-因为非常延迟的方案将标准CGA颜色“拉”为标准NTSC颜色。因此,获得具有轻微偏移的阴影:绿松石蓝,绿色绿松石,红棕色,紫红色。 75%的填充会增加平均信号电平,即颜色亮度;但不会影响饱和度,因为弯曲的更宽“边缘”是由电视接收机忽略的高频谐波产生的。最后,填充率为25%的信号与75%的色调相同,但亮度较低。

甚至不是从黑白像素而是从彩色像素中预测重复序列时,甚至更难预测出什么颜色。在640x200x1bpp模式下,背景颜色始终为黑色,但是可以从16种标准颜色中选择第二种颜色。相反,在320x200x2bpp模式下,可以从16种标准颜色中选择一种背景颜色,而其他三种颜色则由从四个选项中选择的调色板确定。关于1024色的文章显示了两种这样的组合,再次没有说明。我直接要求reenigne发表评论,他负责8088 MPH中视频输出的技术部分,以及在DOSBox中实现CGA仿真。他建议我cgaart-由他编写的自主CGA仿真器,能够在批处理模式下工作。在cgaart中添加了一个简单的Python绑定,我从所有可能的16色“伪影颜色”集中生成了一个表格:

满桌

每套代码由图形模式的编号(1A对于640x200x1bpp,0A对于320x200x2bpp),调色板的编号(0–3)和自由选择的颜色(0–F)组成。表格的每一行都由16个正方形组成,分别对应一个重复的像素序列。每个方格由五个频段组成-数字输出,复合信号电平以及在具有第一个CGA模型的复合监视器上的输出,在复合监视器上的输出和具有校正CGA模型的复合信号电平。复合信号电平显示为两个子像素的平均值-cgaart仅以这种精度计算它。让我们更详细地考虑与文章中显示的关于1024种颜色两个集合相对应的行-这些是集合1A0C0A01;但在此之前,请考虑一个更简单的集合1A04



集合1A04-黑色背景上的红色像素-对应于信号的填充度为50%,偏移为270°,由四个像素的周期性序列调制。信号的高电平降到第一三个像素序列内,所以它是第四位不影响所产生的颜色:例如,000x001x变成纯黑色,及111x-在纯红色。将第一像素(010x011x)置零的序列对应于一个子像素的相移,即-45度至品红色;可重置的第二个像素(100x101x)-向橙色偏移45°。

1A0C-黑色背景上的浅红色像素-对应于相同的信号,但具有非周期性的加法,因此其低电平现在高于黑色。作为该序列的结果000100100011被转换为相同的颜色(绿色,绿松石,蓝色和biryuzovato蓝色)作为白色像素的情况下,但现在具有低得多的亮度,因为低电平信号源起着一个高电平所得的作用。其余的序列保持原始信号的高电平,并且1A04尽管设置得更高,但由于平均电平较高,因此亮度也较高,从而获得了接近该组的相应色度

最终设定0A01-蓝色背景,绿色-红棕色调色板,每个像素四个子像素,一个重复序列中的两个像素-包含四种标准颜色(序列00, 11, 22, 33不会造成伪影)及其成对混合:如果添加两个曲折,则谐波子载波会在结果信号中移动将在字词转换之间处于中间。但是,结果的亮度和饱和度取决于术语的顺序:例如,红色具有高级别的子像素1-4,绿色具有6-1的子像素,因此该序列12完全切断了红色术语的高级别,而绿色的一半;而顺序21完全保留了较高的红色术语,一半保留了绿色。在这两种情况下,色相都变为黄色,但是对于序列12-饱和和非常暗,而对于21-不饱和和非常亮。

因此,共有80组16种同时可用的颜色。实际分辨率是多少?只能在8个子像素的块之间更改颜色,即 每行160次;但亮度是为每个像素独立设置的。一篇有关1024种颜色的文章警告说,这些模式不能称为“ 16色160x200”,因为“水平分辨率是一个悬而未决的问题,它取决于信号的采样和滤波,并且取决于所用颜色信号的形式”(传递SLY_G)但是,很容易确保即使在色调恒定的情况下,复合监视器也不会在8个子像素块内显示亮度波动:例如,注意0A0A整个表中的设置,并注意序列0110与要点亮的绿色像素相对应的设置。绿色背景。用复合监视器逐块分析颜色的亮度和色相,因此,获得了具有平均亮度水平的单调像素,而不是交替使用两个亮度水平的绿色像素。对于一个序列,10结果的饱和度不及项,因为该序列会切断深绿色项的低电平。因此,我认为,在使用伪影颜色时,完全有理由将160x200视为实际分辨率。

4a)...在文本模式下


如开头所述,CGA支持80x25 16色文本模式和8x8像素字符矩阵,并且在这种模式下仅使用了四分之一的视频内存。工匠发现了一种无证的方式每两行像素将输出切换到新的一行文本,即每个字符仅输出前两行像素。在最终的100行“半文本”模式下,将使用所有16​​ KB的视频内存,图像为16色,分辨率为640x200像素。但是与图形模式相比,在半文本中有相当严格的限制:首先,在每个熟悉的8x2像素中,只能使用两种不同的颜色;其次,每次熟悉时“主要”和“背景”像素的顺序应对应于CGA ROM中闪烁的256个字符之一的两个高行。即使有这些限制,结合了像素艺术和文本伪图形的不便,向导仍可以创建令人难以置信的16色图形:



(在有关1024种颜色的文章中,只显示了这张图片的四分之一,但是其完整版本单独发布的 -直接以视频内存转储的形式发布。)

没有100行破解-即如果每个字符的矩阵都已完全渲染,则图片的中间部分将看起来像这样:



右侧是用ROM缝合的字符表,其中每个字符的上两行(可用于半文本模式)以黄色突出显示。

Macrocom首次决定将100行黑客和文字伪图形结合起来,于1984年发布了分辨率为320x200x4bpp的游戏“ ICON:环的探索”,这对于CGA来说似乎是不可思议的。但是,即使是静态屏保Macrocom比VileR更糟。在游戏过程中,图形使用得更加原始。




(自相矛盾的是,尽管这是一种文本模式,但在其中显示文本是非常琐碎的:您必须从ROM中固件的“草稿”中收集每个字符。)

半文本模式的另一个重要限制是,复合监视器上的图像会模糊到相当难看的外观。例如,VileR绘图将如下所示:



但是您可以从这种模糊中受益-在半文本模式下生成大量的伪像颜色!如上一节所述,周期为8个子像素的任何像素重复序列都将变为纯色 在80列模式下字符宽度的一半。这意味着在半文本模式下-当可以从16种标准颜色中任意选择每个字符的主色和背景色时-要创建伪影颜色,您需要具有以下特征的字符

  1. 前两行像素相同;
  2. 这两条线的左右两半相同。

CGA ROM发现适合于两个周期序列的字符- 11000110。第一个序列可让您获得与320x200模式下任意两个重复像素相对应的伪像颜色,即0Axx整个表格中各行的任何颜色;第二个是1A0x当序列分别0110在黑色背景上显示有彩色符号或在彩色背景上显示有黑色符号,线条中第6号和第9号正方形的颜色。在这种情况下,实际分辨率为80x100:您可以设置颜色的最小区域对应于“修剪”的熟悉程度。

那么,在半文本模式下可以同时显示多少种伪影颜色?提供16种原色,16种背景色和两个匹配字符的所有组合,因此该技巧的作者惊呼:“ 512种颜色!当然,实际上它们很少,有重复项,色调也略有不同。”当主色和背景色重合时,很明显,任何符号的结果都是相同的,因此,在数字输出中,我们有496个不同的周期序列,每个序列八个像素。将此输出转换为复合信号会导致以下事实:某些序列会变成相同的视频信号;例如,0110黑色上的灰色,紫色上的灰色和紫色上的浅绿色-变成相同的深淡紫色阴影:



与全表相比,此处的正方形为清楚起见加倍了,这使我们可以在图上直接在正方形内标记每个带的值。可以看出,该序列0110完全切断了品红色背景的高水平,因此背景与黑色变得无法区分。绿色与品红色的相位差为180°,因此此顺序以相同的方式截断了高水平的绿色字符,浅绿色字符与灰色字符变得难以区分。在色卡上在关于1024种颜色的文章中,您可以看到与黑色和紫色背景相对应的0号和5号线几乎无法区分;与灰色和浅绿色符号相对应的第8列和第10列也几乎无法区分。根据cgaart计算,与三个命名参数组合相对应的深淡紫色阴影完全重合。使用校正后的CGA模型(如在图的正方形底部所示),这三个阴影是不同的。

除了这三种组合,第一个CGA模型同样0110以浅品红色和灰色将序列显示为黑色。浅品红色的灰色给出标准的灰色,品红色的黑色给出标准的黑色。最后,如右图所示,序列1100浅红色的灰色给出相同的(几乎是标准的)灰色阴影,因为序列为0110浅绿色的浅紫色。总的来说,在第一个CGA模型中,可以使用490种不同的颜色,而经过校正的颜色-全部为496

种。该文章的高潮大约是1024种颜色,这是发明的重新填充方式,即在半文本模式下每个字符仅显示一行像素的上一行,但是重复此行两次。很难称之为“新图形模式””,因为它需要在每条扫描线的开头进行恒定的CGA设置更改,该更改完全占用了8088处理器,并且没有机会与显示1024色图像同时进行任何其他操作,例如,准备动画。但由于这一招,变得可以使用序列00100101除了上面所示的两个。使用四个不同的符号,可以在数字输出上获得976个八个像素的不同周期序列。转换为复合视频信号后,将获得多少种不同的颜色?我用第一个CGA计算了950个,固定了一个计算了973个。

最后,我给出了可以在半文本模式下获得的所有颜色的表格。 VileR有类似的表格,但按监视器类型分组,而不是按象我的像素的输出顺序分组。他的桌子对使用特定设备的艺术家很方便。我的是给想要了解该颜色在显示器上如何显示的理论家的。

满桌

All Articles