C++ 不透明背景上的亚像素光栅化

C++ 不透明背景上的亚像素光栅化,c++,rendering,blending,subpixel,C++,Rendering,Blending,Subpixel,我在做亚像素光栅器。输出将在不透明位图上渲染。我已经正确地将文本呈现为黑白相间(因为我基本上可以忽略位图的内容) 问题在于混合。由于低通滤波技术(我使用的是5-tap fir-1/9、2/9、3/9等),每个实际渲染的像素也会影响其邻域的强度级别,另外还有待渲染像素的alpha级别。然后,必须将此结果混合到目标图像上,这就是问题发生的地方 像素交互的结果必须加在一起,以获得正确的亮度-并且字母混合到目的地-但是如果我一次光栅化一个像素,我会“丢失”先前像素的信息,因此,进一步添加可能会导致溢出

我在做亚像素光栅器。输出将在不透明位图上渲染。我已经正确地将文本呈现为黑白相间(因为我基本上可以忽略位图的内容)

问题在于混合。由于低通滤波技术(我使用的是5-tap fir-1/9、2/9、3/9等),每个实际渲染的像素也会影响其邻域的强度级别,另外还有待渲染像素的alpha级别。然后,必须将此结果混合到目标图像上,这就是问题发生的地方

像素交互的结果必须加在一起,以获得正确的亮度-并且字母混合到目的地-但是如果我一次光栅化一个像素,我会“丢失”先前像素的信息,因此,进一步添加可能会导致溢出

这应该怎么做?我能想象的唯一可行的解决方案是,用每个颜色的alpha通道渲染一个单独的图像,然后使用一些复杂的混合算法,最后将其alpha混合到目标。。不知怎么的


然而,除了lcd亚像素渲染的基本概念和监视器像素的漂亮特写图像之外,我找不到任何关于如何实际操作的资源。如果有人能在路上帮助我,我将不胜感激。

今晚我醒来,再也睡不着了。 我不能让所有的脑力浪费掉,在同样的问题上绊倒

我提出了两种不同的解决方案,都没有经过验证

  • 您必须使用3通道alpha遮罩,每个子像素一个,将每个颜色与自己的alpha混合
  • 如果仅渲染灰色/BW字体(如果在浅色背景色上绘制深色文本,则为1-color_值),则可以使用每个颜色通道作为alpha遮罩,再次单独应用每种颜色。在这种情况下,颜色值本身应视为1
希望这对我有点帮助,我用它填充了2小时的失眠


~Jan

谢谢你的评论!我解决了这个问题,因为我总是从左到右,逐行渲染。因此,我只需要存储上一个和下一个N/2子像素(其中N是用于抗锯齿的过滤器内核的大小),这些子像素直接映射到显示器。我称之为alphaMap,在其中我混合了内核、gamma和像素的b/w强度。无论何时移动到下一个像素,我都会栅格化前面的点,将alphaMap映射到当前颜色,并将alphablend映射到目标曲面。这里可以看到早期版本: