【问题标题】:Drawing procedural lines on top of a texture avoiding aliasing in glsl在纹理顶部绘制程序线,避免 glsl 中的混叠
【发布时间】:2022-04-30 01:00:53
【问题描述】:

我的目标是在柏油路上画白线。由于道路的特性发生了变化,不可能只有一个纹理同时代表沥青和白线。 当前的方法是应用沥青纹理并在其他两个纹理坐标中编码一些信息。在像素着色器中,读取这些坐标,我决定该片段是否应该是白色的。

这会导致高水平的混叠。这就是我想尝试解决的问题。

我一直在应用平滑步长或线性插值来更改线条的“白度”。我还根据与相机的距离更改了宽度和颜色。这有点帮助,但在很远的距离,仍然有难看的锯齿线。

您将如何继续这样做?有一个表示平滑白线并访问纹素的纹理会更好吗?我应该实现一个访问相邻纹素的双线性过滤器吗?

【问题讨论】:

  • 您能否详细说明“道路的特性发生了变化,因此我不能使用表示沥青和白线的纹理”位?为什么你不能从预渲染的集合中选择正确的纹理并将它们缝合在一起?也许我们可以建议一种方法来克服您在该领域遇到的问题,将“绘制白线”问题默认为普通纹理。
  • 至于实际问题,您可以尝试使用 Humus (humus.name/index.php?page=3D&ID=84) 绘制的贴花技术,但仅将其应用于白线(因为您已经覆盖了沥青位)。
  • 谢谢@Paul-Jan 我会彻底检查那个链接,看起来很有希望。至于另一个问题:用户可以在运行时编辑道路(宽度、车道数、交叉点、彩绘标志……)。必须有一种方法可以只创建一堆纹理并将它们正确附加到几何图形上,但我认为更改编码(通过额外的纹理坐标)会更容易和更灵活。我可能在那里采取了错误的方法,但到目前为止,除了混叠之外,我已经取得了很好的结果。

标签: opengl graphics 3d glsl antialiasing


【解决方案1】:

您应该简单地使用具有 2 个坐标的 2 个纹理。

  1. 道路多边形上平铺的小无缝沥青纹理。
  2. 使用 Alpha 标记纹理,您将放置在此多边形的中间(带有纹理坐标偏移)

或者您可以在道路中间创建额外的多边形作为标记以避免任何锯齿。

为了让这一切看起来真实,您可以使用带有污垢和裂缝的Texture Bombing

【讨论】:

  • 谢谢@JAre,这几乎是我认为我可以实现的标准方法,但这意味着重做道路绘图的大部分代码(仍然有可能)。这样我就可以进一步探索在着色器上绘图:有没有一种方法可以通过对纹理进行采样来获取沥青颜色,然后计算该片段是否是白线的一部分,并将该结果应用于反色中的最终颜色别名方式?这有可能吗?如果是这样,你会说值得吗?应用后处理 AA 有帮助吗?或者使用纹理重做整个事情可能会更好?
  • @user1854147 对于后期处理 AA,您需要边缘(正常\深度斜率),对吗?您可以尝试通过后期处理使其看起来更清晰。但通常它是通过标准纹理映射完成的。您可以通过程序方式使用着色器来完成它,但它很难编写,甚至更难扩展。例如,您可以测试片段(在片段着色器中),如果它距离两侧足够远(基于纹理坐标值),那么它是白色的。但是通过这种方式,你的着色器可能会变得太胖,特别是如果你使用分支。您还可以将条纹实现为与道路的小偏移量的单独几何体
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
相关资源
最近更新 更多