小编Sic*_*hbo的帖子

防止像素着色器过度绘制单个ERG

背景

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

镶嵌文字

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

不透明的输出

问题

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

透明输出

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

更大的字体测试

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

Erg分析

我试图找出如何阻止我的像素着色器不止一次触摸同一个像素.

与过度绘制预防相关的其他解决方案似乎都与zbuffer策略有关,但是这个问题更多地与在单个像素着色器通道内绘制单个2D三角形列表有关.

我试图想出一个解决方案,我有点失落.我希望HLSL可能有某种"触摸每个像素只有一次"的标志,但我一直无法找到类似的东西.我发现最接近的是将BLENDOP设置为MAX而不是ADD.但是在场景中混合其他颜色时输出不正确.

我也有SRCBLEND = ONE,DSTBLEND = INVSRCALPHA.产生正确输出的唯一标志组合(尽管有过度绘制工件.)

我在GPA帧分析器中使用了SEPARATEALPHABLENDENABLE,听起来几乎就像我在这里所需要的那样 - 将混合设置为MAX但仅限于"alpha"通道,但是根据我的判断,该设置(以及相应的BLENDOPALPHA)会影响什么都没有.

我想到的最后一件事是将文本烘焙到纹理上不透明,然后将该纹理重新涂抹到场景中并应用适当的alpha值,但是这实际上并不适用于此项目,因为我还支持渐变画笔,其中停止值可能包含alpha,意味着仍然可以看到伪影,或者如果我们在烘焙到纹理之前将alpha从终止值中剥离,则最终输出只是完全错误.此外,整个努力将是非常昂贵的.

任何提示或指示将不胜感激.谢谢阅读.

direct3d hlsl pixel-shader tessellation

5
推荐指数
1
解决办法
226
查看次数

标签 统计

direct3d ×1

hlsl ×1

pixel-shader ×1

tessellation ×1