Sic*_*hbo 5 direct3d hlsl pixel-shader tessellation
使用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从终止值中剥离,则最终输出只是完全错误.此外,整个努力将是非常昂贵的.
任何提示或指示将不胜感激.谢谢阅读.
您所看到的问题不应该发生。
如果两个三角形重叠,那是因为您放置顶点的方式使得绘制相邻三角形时它们会重叠。可能发生的情况是,这两个相邻的三角形共享两个顶点,但每个三角形都有自己的每个顶点的副本,计算出这些顶点的位置非常非常轻微。
问题的解决方案不是尝试让像素着色器仅在使用索引缓冲区(如果您还没有)时才接触像素,并且让每个三角形之间的共享顶点实际上共享相同的顶点而不是使用与相邻三角形使用的位置稍有不同。
如果您无法控制所使用的曲面细分算法,则可能必须在生成顶点缓冲区后对其运行一次传递,以检测并合并彼此之间存在很小公差的顶点。即使没有索引缓冲区,一个简单的解决方案也是这样:
对于顶点缓冲区中的每个顶点,将其位置与顶点缓冲区其余部分中的每个其他顶点进行比较。
如果两个顶点在另一个顶点之间的某个小公差范围内,请将第二个顶点的位置替换为要与之比较的顶点的位置。
如果两个顶点的位置足够接近,您认为它们是相同的,那么这应该具有将两个顶点的位置配对的效果。
现在您应该不会遇到重叠三角形的任何问题。在日常渲染中,两个三角形始终彼此共享边缘,并且您永远不会获得它们看起来稍微重叠的效果。硬件保证采样点要么在线的一侧,要么在线的另一侧,但永远不会同时位于在线的一侧,无论该点距离线有多近(即使它在数学上在线上,它仍然会失败)一侧或另一侧)。
| 归档时间: |
|
| 查看次数: |
226 次 |
| 最近记录: |