我正在尝试对PenTile显示器上显示的内容进行一些子像素抗锯齿,因此最佳结果我想了解如何设置帧缓冲区中每个像素的值以分别控制子像素。 (注:我知道我要定位的显示器的亚像素布局。)
#1 楼
我不能肯定地说,但是我自己对此很感兴趣,并试图对其进行查找(几乎没有成功)。不过,我确实分析了在此类显示器的网络上可以找到的许多宏观照片。RGB pixels Pentile Subpixels (RGBG Layout)
--+---+-- --+---+--
X | X | X G r G b G
--+---+-- --> --+---+--
X | X | X G b G r G
--+---+-- --+---+--
据我所知,它看起来像绿色的子像素的位置与帧缓冲区像素位置(X)完全匹配,并且强度按1:1传输。红色和蓝色子像素在水平方向上在两个相邻像素之间共享,并且它们的强度似乎是左右两个相邻帧缓冲像素的红色/蓝色通道的平均值,有效地将R和B的水平分辨率减半。 >
即使红色和蓝色子像素向下(或向上)移动了半个像素,该策略似乎也可以延续到钻石Pentile布局中:
RGB Pixels Diamond Pentile subpixels
_________
X X X G | G | G
--> __r___b__
X X X G | G | G
__b___r__
由于此布局中红色和蓝色的附加半像素垂直偏移在驱动红色和蓝色子像素时没有考虑,因此您可能会注意到黑色区域和白色区域之间的水平边缘可能会显示为绿色或洋红色。您可以在钻石Pentile子像素矩阵呈现文本的宏照片中看到此效果。但是实际上并没有一致的转变。在某些照片中,它是向下的;在其他照片中,它是向上的。我不知道显示器的制造方式是不同的,还是只是倒置安装在某些设备中。
所以,是的,您可以轻松控制Pentile显示器的所有子像素。帧缓冲区中的每个颜色通道值仅使用一次且仅用于一个像素。只是对于红色和蓝色子像素,将两个帧缓冲像素的红色和蓝色值进行平均。
知道了这一点,您可以尝试进行更复杂的亚像素渲染。但请记住,典型的色彩空间(如sRGB)是非线性的。过滤应在线性域中进行。例如,交替为0和255的棋盘将具有与平坦区域相同的亮度,其值约为185(如果我没记错的话),而不是128。
最后,我要指出可能会为非矩形采样格子提出抗混叠滤波器。例如,对于您拥有红色和蓝色子像素的棋盘采样点阵,理想的低通滤波器在光谱域中将具有菱形形状的通带。如果尝试通过以棋盘格方式丢弃每个第二个样本来降低分辨率,则合理的抗锯齿过滤器将是这些5x5和3x3内核,而5x5版本保留了更多详细信息:
0 -1 0 -1 0
-1 0 10 0 -1 0 1 0
0 10 32 10 0 1 4 1
-1 0 10 0 -1 0 1 0
0 -1 0 -1 0
由于零的位置,这些可以就地应用。
您可能还希望在其中包含一两个或两个维度的半像素位移,以说明相对位置红色的蓝色和绿色子像素。例如,对于菱形菱形布局,您可能需要使用以下滤镜之一:
3 0 0 0 0 3
0 -25 0 0 -25 0 -1 0 0 -1
0 0 150 150 0 0 0 9 9 0
0 0 150 150 0 0 0 9 9 0
0 -25 0 0 -25 0 -1 0 0 -1
3 0 0 0 0 3
得出正确的红色/蓝色子像素,而不是平均四个值。
RGBG(非菱形)Pentile图案仅需要水平移动半个像素,从而导致如下所示的滤镜:
-3 3 3 -3
2 30 30 2
-3 3 3 -3
由于滤波器系数为负值,因此必须特别注意削波。例如,您可以尝试将残差重新分配给周围的像素,以保持平均亮度。
评论
不知道细节,但在PenTile中,子像素在帧缓冲像素之间共享,因此您无法单独控制它们。例如可能是如果您有3x3 PenTile子像素,它们将映射到2x2帧缓冲像素,并且子像素的强度由重叠和帧缓冲RGB值确定。虽然这纯粹是一个猜测@JarkkoL这就是我的问题。我知道子像素是共享的,但是我需要知道哪个函数确定每个子像素的强度,以便可以预测从某些帧缓冲区值中得到的结果。
您的问题另有说明,因此可以澄清。如果您知道原始分辨率与子像素分辨率之间的关系,则可能会对变换有所了解