如何将像素划分为子像素?

问题描述 投票:0回答:2

我正在开发一个操作系统,我必须将像素细分为子像素,我正在使用 GOP 帧缓冲区 https://wiki.osdev.org/GOP ,

是否可以细分 GOP 帧缓冲区中的像素?

我该怎么做?

我只在互联网上找到这些:

子像素渲染:https://en.wikipedia.org/wiki/Subpixel_rendering

子像素分辨率:https://en.wikipedia.org/wiki/Sub-pixel_resolution

最有用的:https://www.grc.com/ct/ctwhat.htm

如何在我的操作系统中实现它?

c++ operating-system pixel
2个回答
1
投票

如何在我的操作系统中实现它?

第一步是确定像素几何形状(参见 https://en.wikipedia.org/wiki/Pixel_geometry);因为如果您不知道任何子像素渲染的尝试都可能使图像比根本不进行子像素渲染更糟糕。我一直无法找到一种明智的方法来获取这些信息。一种“最不疯狂”的方法是获取显示器的 EDID/E-EDID(扩展显示识别数据 - 请参阅https://en.wikipedia.org/wiki/Extended_Display_Identification_Data),提取制造商和产品代码,然后使用制造商和产品代码以在其他地方查找信息(从文件、数据库等)。遗憾的是,这意味着您必须创建您支持的所有显示器所需的所有信息(对于未知显示器,则退回到“禁用子像素渲染”)。

注意:作为替代方案;您可以让用户设置像素几何形状;但大多数用户不会知道,也不会想要麻烦,而其他用户会设置错误,所以...

第二步是确保您使用的是显示器的首选分辨率;因为如果你不这样做,那么显示器可能会缩放你的图像以使其适合,这将破坏子像素渲染的任何好处。为此,您需要获取并解析显示器的 EDID 或 E-EDID 数据,并尝试确定首选分辨率;然后在设置视频模式时使用首选分辨率。不幸的是,有些显示器(大多是旧显示器)要么不会告诉您首选分辨率,要么没有首选分辨率;如果您可以确定首选分辨率,您可能无法使用 VBE(在 BIOS 上)或 GOP 或 UGA(在 UEFI 上)设置视频模式,并且编写本机视频驱动程序“并非没有进一步的问题”。

第三步,实际渲染;但这取决于你如何渲染内容。

对于高级渲染(能够进行 3D - 纹理多边形等),最容易将其视为渲染单独的单色图像(例如,一张用于红色,一张用于绿色,一张用于蓝色),并稍微移动相机的位置以反映像素几何。例如,如果像素几何形状是“3 个垂直条,像素左侧为红色,中间为绿色,右侧为蓝色”,那么在渲染红色单色图像时,您需要将相机稍微向左移动(大约三分之一像素)。然而,这几乎使渲染成本增加了三倍。

如果您只对字体进行子像素渲染,那么在更有限的设置中(将字体渲染到纹理/位图时,而不是将任何内容渲染到屏幕上时),它的基本原理是相同的。在这种情况下,如果您缓存生成的像素数据并回收它(无论如何您都会想要这样做),那么它可以具有最小的开销。这要求渲染的文本与像素网格对齐(并且不以任何方式缩放,或以任意角度缩放,或粘在旋转的 3D 茶壶的侧面,或类似的东西)。


0
投票

最佳显示模式为“Real True Color Pixels”,这是Yuan Chiu Wong于2016年获得的发明专利技术。

这种“光学真彩像素技术”摆脱了亚像素渲染的问题,使每个像素只能显示一种真实颜色,每种颜色的发光面都是一个完整的像素。与“亚像素渲染技术”的光源相比,每个彩色发光面只能占像素面的1/X,因此必须发出X倍使视觉感受到的彩色眩光。这个无人关注的细节,才是危害视觉系统数十年的“亚像素渲染技术”的真正罪魁祸首。

“亚像素渲染技术”有可能达到“光学真彩像素技术”的舒适度和对视力无损害的程度吗?

© www.soinside.com 2019 - 2024. All rights reserved.