如何划分子像素中的像素?
How to divide Pixels in Subpixels?
我正在开发 OS,我必须将像素细分为子像素,我正在使用 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
如何在我的 OS 中实现它?
How can I Implement It in My OS?
第一步是确定像素几何形状(参见 https://en.wikipedia.org/wiki/Pixel_geometry ); because if you don't know that any attempt at sub-pixel rendering is likely to just make the image worse than not doing sub-pixel rendering at all. I've never been able to find a sane way to obtain this information. A "least insane" way is to get the monitor's EDID/E-EDID (Extended Display Identification Data - see https://en.wikipedia.org/wiki/Extended_Display_Identification_Data ),提取制造商和产品代码,然后使用制造商和产品代码在其他地方(从文件、从数据库,..)。遗憾的是,这意味着您必须为您支持的所有显示器创建所需的所有信息(并且对于未知显示器退回到“禁用亚像素渲染”)。
注:作为替代;您可以让用户设置像素几何;但大多数用户不会知道也不想麻烦,其余用户会设置错误,所以...
第二步是确保您使用的是显示器的首选分辨率;因为如果你不这样做,那么显示器可能会缩放你的图像以使其适合,这将破坏子像素渲染的任何好处。为此,您需要获取并解析显示器的 EDID 或 E-EDID 数据,并尝试确定首选分辨率;然后在设置视频模式时使用首选分辨率。不幸的是,有些显示器(大部分是旧的)要么不会告诉您首选分辨率,要么没有首选分辨率;如果您可以确定首选分辨率,您可能无法使用 VBE(在 BIOS 上)或 GOP 或 UGA(在 UEFI 上)设置该视频模式,并且编写本机视频驱动程序“并非没有进一步的问题”。
第三步是实际渲染;但这取决于你如何渲染什么。
对于高级渲染(能够进行 3D - 带纹理的多边形等),最容易将其视为渲染单独的单色图像(例如,一张用于红色,一张用于绿色,一张用于蓝色),并稍微改变相机的反映像素几何的位置。例如,如果像素几何形状是“3 个垂直条,像素左侧为红色,中间为绿色,右侧为蓝色”,那么在渲染红色单色图像时,您需要将相机稍微向左移动(大约三分之一像素)。然而,这几乎是渲染成本的三倍。
如果您只是对字体进行子像素渲染,那么在更有限的设置中(将字体渲染为 texture/bitmap 而不是将任何内容渲染到屏幕时),它是相同的基本原理。在这种情况下,如果您缓存生成的像素数据并回收它(无论如何您都想这样做),它可以有最小的开销。这要求渲染的文本与像素网格对齐(并且不以任何方式缩放,或以任意角度,或粘在旋转的 3D 茶壶的侧面,或类似的东西)。
我正在开发 OS,我必须将像素细分为子像素,我正在使用 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
如何在我的 OS 中实现它?
How can I Implement It in My OS?
第一步是确定像素几何形状(参见 https://en.wikipedia.org/wiki/Pixel_geometry ); because if you don't know that any attempt at sub-pixel rendering is likely to just make the image worse than not doing sub-pixel rendering at all. I've never been able to find a sane way to obtain this information. A "least insane" way is to get the monitor's EDID/E-EDID (Extended Display Identification Data - see https://en.wikipedia.org/wiki/Extended_Display_Identification_Data ),提取制造商和产品代码,然后使用制造商和产品代码在其他地方(从文件、从数据库,..)。遗憾的是,这意味着您必须为您支持的所有显示器创建所需的所有信息(并且对于未知显示器退回到“禁用亚像素渲染”)。
注:作为替代;您可以让用户设置像素几何;但大多数用户不会知道也不想麻烦,其余用户会设置错误,所以...
第二步是确保您使用的是显示器的首选分辨率;因为如果你不这样做,那么显示器可能会缩放你的图像以使其适合,这将破坏子像素渲染的任何好处。为此,您需要获取并解析显示器的 EDID 或 E-EDID 数据,并尝试确定首选分辨率;然后在设置视频模式时使用首选分辨率。不幸的是,有些显示器(大部分是旧的)要么不会告诉您首选分辨率,要么没有首选分辨率;如果您可以确定首选分辨率,您可能无法使用 VBE(在 BIOS 上)或 GOP 或 UGA(在 UEFI 上)设置该视频模式,并且编写本机视频驱动程序“并非没有进一步的问题”。
第三步是实际渲染;但这取决于你如何渲染什么。
对于高级渲染(能够进行 3D - 带纹理的多边形等),最容易将其视为渲染单独的单色图像(例如,一张用于红色,一张用于绿色,一张用于蓝色),并稍微改变相机的反映像素几何的位置。例如,如果像素几何形状是“3 个垂直条,像素左侧为红色,中间为绿色,右侧为蓝色”,那么在渲染红色单色图像时,您需要将相机稍微向左移动(大约三分之一像素)。然而,这几乎是渲染成本的三倍。
如果您只是对字体进行子像素渲染,那么在更有限的设置中(将字体渲染为 texture/bitmap 而不是将任何内容渲染到屏幕时),它是相同的基本原理。在这种情况下,如果您缓存生成的像素数据并回收它(无论如何您都想这样做),它可以有最小的开销。这要求渲染的文本与像素网格对齐(并且不以任何方式缩放,或以任意角度,或粘在旋转的 3D 茶壶的侧面,或类似的东西)。