使用gluTess从GDI + DrawString(..)路径在Direct3D9中构建三角形列表:

然后使用像素着色器(v3.0)填充形状.使用不透明值绘制时,一切看起来都很好:

在某些字体大小的情况下,如果颜色具有alpha分量(即Argb#55FFFFFF),我们就会开始看到这些令人讨厌的镶嵌瑕疵,其中三角形可能会稍微重叠:

在较大的字体大小时,问题有时不存在:

使用英特尔出色的GPA帧分析器像素历史工具,我们可以看到出现伪像的区域,像素已从单个Erg"触摸"了3次.

我试图找出如何阻止我的像素着色器不止一次触摸同一个像素.
与过度绘制预防相关的其他解决方案似乎都与zbuffer策略有关,但是这个问题更多地与在单个像素着色器通道内绘制单个2D三角形列表有关.
我试图想出一个解决方案,我有点失落.我希望HLSL可能有某种"触摸每个像素只有一次"的标志,但我一直无法找到类似的东西.我发现最接近的是将BLENDOP设置为MAX而不是ADD.但是在场景中混合其他颜色时输出不正确.
我也有SRCBLEND = ONE,DSTBLEND = INVSRCALPHA.产生正确输出的唯一标志组合(尽管有过度绘制工件.)
我在GPA帧分析器中使用了SEPARATEALPHABLENDENABLE,听起来几乎就像我在这里所需要的那样 - 将混合设置为MAX但仅限于"alpha"通道,但是根据我的判断,该设置(以及相应的BLENDOPALPHA)会影响什么都没有.
我想到的最后一件事是将文本烘焙到纹理上不透明,然后将该纹理重新涂抹到场景中并应用适当的alpha值,但是这实际上并不适用于此项目,因为我还支持渐变画笔,其中停止值可能包含alpha,意味着仍然可以看到伪影,或者如果我们在烘焙到纹理之前将alpha从终止值中剥离,则最终输出只是完全错误.此外,整个努力将是非常昂贵的.
任何提示或指示将不胜感激.谢谢阅读.