首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免大比例尺广告牌透明渲染中的距离排序

如何避免大比例尺广告牌透明渲染中的距离排序
EN

Stack Overflow用户
提问于 2019-09-30 19:56:58
回答 1查看 475关注 0票数 2

设置场景:

我正在绘制一个高度地图(巨大的不透明的表面),上面有大量的广告牌(通常是草、花等)。

这样,广告牌就有了一个几乎透明的彩色地图,只有几个像素的颜色来产生草或叶子的形状等等。请注意,这些形状的边缘使用一些透明梯度,以使它们看起来更平滑,但我也尝试了基本的,二元颜色/透明纹理。

伪呈现代码如下所示:

代码语言:javascript
复制
map->render();
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
wildGrass->render();
glDisable(GL_BLEND);

其中,wildGrass呈现指令在单个OGL调用中呈现不同位置的多个广告牌。

我所经历的问题与透明度有关,而且广告牌显然彼此隐藏,甚至在它们的透明区域也是如此。然而,这些透明的部分正确地显示了高度地图的实心背景。

,这里是小故障:

  • Left是在完全透明的像素上使用显式片段着色器丢弃的,
  • 右边没有丢弃,清楚地显示了广告牌的平面四边形

根据我对OGL混合和一些阅读的理解,解决方案似乎是有一个有控制的呈现顺序,从最遥远的对象开始到最近的对象,这样最后才能正确地填充颜色缓冲区。

我非常希望还有别的办法..。这里的排序通常会根据不同的观点而变化,这意味着它必须实时地应用于每个帧。另外,这些特别的广告牌的性质是生产一个-very大号.性能警报!

有什么建议吗?还是我的方法错了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-01 22:56:47

没有为我工作:

@http摘要关于禁用深度缓冲区写入的建议:

它基本上适用于具有相同纹理的广告牌(可能还有一种特定的纹理,比如野草),因为深度不一致在视觉上并不明显--不过,引入另一种纹理,比如颜色迥异的花,会立即突显出这些错误。

解决方案:

@拉比德76建议使用非半透明纹理与多采样和反混叠:我相信这是获得最佳的视觉效果,在性能上相当低的成本。

替代解决方案:

我找到了一个中间解决方案,这可能是最便宜的性能,牺牲了质量。我仍然使用渐变透明边缘的纹理,但我没有丢弃完全透明的像素,而是引入了一定的容忍度,例如,任何α< 0.6的像素都会被丢弃--通过实验可以找到合适的平衡值。

采用这一办法:

correct

  • Textures
  • I仍在进行深度测试,因此输出质量下降/看起来不太平滑,但合理地说,
  • 半透明像素上的小故障仍然出现,但几乎没有明显的
  • ,见

下面的捕捉。

因此得出结论:

  • My的解决方案是一种廉价而简单的近似,通过将所有的广告牌渲染成一个多采样的纹理解析和反混叠,最终将结果输出到一个全屏四角体中,从而获得不太光滑的视觉效果
  • 。可能有一些方法可以做到这一点:
    • 要么先绘制地图,然后在呈现广告牌
    • 时使用产生的深度缓冲区,要么在多采样的
    • 上同时呈现地图和广告牌。

  • 注意到,上述两种方法都是为了避免对大量广告牌进行距离排序,但这仍然是一种有效的选择,我已经阅读过将广告牌位置存储在四叉树中以便快速访问。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58174499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档