背景
使用gluTess从GDI+ DrawString(..)路径构建三角形列表以在Direct3D9中绘制:
然后使用像素着色器(v3.0)填充形状。当使用不透明值绘制时,一切看起来都很好:
问题
在某些字体大小下,如果颜色有一个alpha分量(即Argb #55FFFFFF),我们开始看到这些讨厌的镶嵌工艺品,其中三角形可能会略微重叠:
在较大的字体大小下,该问题有时不存在:
使用英特尔出色的GPA Frame Analyzer Pixel History工具,我们可以看到在出现工件的区域,像素已经从单个Erg"触摸"了3次。
我正在努力找出如何阻止我的像素着色器多次接触同一像素。
其他与遮盖预防相关的解决方案似乎都关注于z缓冲器策略,然而这个问题更多是关于在单个像素着色器通道中绘制单个2D三角形列表的问题。
我在尝试想出一个解决方案时有点迷茫。我希望HLSL可能有类似于“每个像素只触摸一次”的标志,但我找不到任何类似的东西。我找到的最接近的东西是将BLENDOP设置为MAX而不是ADD。但当在场景中混合其他颜色时,输出是不正确的。
我还设置了SRCBLEND = ONE和DSTBLEND = INVSRCALPHA。唯一一组标志组合会产生正确的输出(虽然有过度绘制工件)。
我已经使用GPAframe analyzer中的SEPARATEALPHABLENDENABLE进行了调整,听起来几乎正是我需要的——将混合设置为MAX,但仅在"alpha"通道上,然而从我所能确定的情况来看,那种设置(以及相应的BLENDOPALPHA)根本不会影响任何东西。
我最后想到的是将文本作为不透明的烘焙到纹理中,然后使用适当的alpha值将该纹理重新绘制到场景中,但是这在这个项目中实际上并不起作用,因为我还支持渐变刷子,其中停止值可能包含alpha,这意味着无论如何都会看到工件,或者如果我们在烘焙到纹理之前剥离了停止值中的alpha,最终输出就完全错误。此外,整个过程将非常昂贵。
任何提示或指针将不胜感激。谢谢你的阅读。