设置场景:
我正在绘制一个高度地图(巨大的不透明的表面),上面有大量的广告牌(通常是草、花等)。
这样,广告牌就有了一个几乎透明的彩色地图,只有几个像素的颜色来产生草或叶子的形状等等。请注意,这些形状的边缘使用一些透明梯度,以使它们看起来更平滑,但我也尝试了基本的,二元颜色/透明纹理。
伪呈现代码如下所示:
map->render();
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
wildGrass->render();
glDisable(GL_BLEND);其中,wildGrass呈现指令在单个OGL调用中呈现不同位置的多个广告牌。
我所经历的问题与透明度有关,而且广告牌显然彼此隐藏,甚至在它们的透明区域也是如此。然而,这些透明的部分正确地显示了高度地图的实心背景。
,这里是小故障:

根据我对OGL混合和一些阅读的理解,解决方案似乎是有一个有控制的呈现顺序,从最遥远的对象开始到最近的对象,这样最后才能正确地填充颜色缓冲区。
我非常希望还有别的办法..。这里的排序通常会根据不同的观点而变化,这意味着它必须实时地应用于每个帧。另外,这些特别的广告牌的性质是生产一个-very大号.性能警报!
有什么建议吗?还是我的方法错了?
发布于 2019-10-01 22:56:47
没有为我工作:
@http摘要关于禁用深度缓冲区写入的建议:
它基本上适用于具有相同纹理的广告牌(可能还有一种特定的纹理,比如野草),因为深度不一致在视觉上并不明显--不过,引入另一种纹理,比如颜色迥异的花,会立即突显出这些错误。
解决方案:
@拉比德76建议使用非半透明纹理与多采样和反混叠:我相信这是获得最佳的视觉效果,在性能上相当低的成本。
替代解决方案:
我找到了一个中间解决方案,这可能是最便宜的性能,牺牲了质量。我仍然使用渐变透明边缘的纹理,但我没有丢弃完全透明的像素,而是引入了一定的容忍度,例如,任何α< 0.6的像素都会被丢弃--通过实验可以找到合适的平衡值。
采用这一办法:
correct
下面的捕捉。
因此得出结论:

https://stackoverflow.com/questions/58174499
复制相似问题