【问题标题】:Dotted back edges of object对象的虚线后边缘
【发布时间】:2012-10-29 21:15:23
【问题描述】:

在我的 Android 应用程序中,我需要显示一个 3D 对象(这没问题),但前边缘应该是实心的,后边缘应该是点状的。我需要在图片上有类似的东西。如何使用 OpenGL ES 1 或 2 实现它?

我已经尝试过 Tim 的想法(使用深度缓冲区)。它可以工作,但有一些像图片上的人工制品,虚线(紫色)线与实线(红色)线重叠:

这是因为虚线(紫色(GL_GREATER))是在红线(GL_LEQUAL)之后绘制的。 有什么办法可以预防吗?

感谢大家的帮助。现在看起来很棒!

【问题讨论】:

  • 那是我第一次接触 OpenGL。我不知道。
  • 我不能给你一个完整的答案,但我认为你需要做的是使用 gles2.0 并剔除对象以便渲染所有面,然后使用着色器你可以执行与此类似的方法(在 Google 搜索中找到),让您绘制虚线。有了这些信息,也许有人可以帮你拼凑起来。 if (step(sin(scale * input.param), 0.5f)) 丢弃;

标签: android opengl-es


【解决方案1】:

这是我将要做什么的大致轮廓。您需要一个网格用于对象本身,而另一个 GL_LINES 网格用于您要绘制的“边缘线”。

  1. 将实体网格绘制到深度缓冲区中。
  2. 使用标准着色器绘制“边缘网格”,以得到实线,但将深度测试设置为 GL_LEQUAL(仅绘制比深度值更近的对象。
  3. 第二次绘制边缘网格,深度测试为 GL_GREATER。在此通道中,使用点画着色器来获得虚线效果(下文将进一步解释)。

这可能会出现问题,具体取决于场景中的其他对象,因为在立方体被其他东西遮挡的情况下,您可能会绘制虚线,但这对您来说可能不是问题,或者您可以以某种方式剔除如果它被遮挡,则网格。

对于点画着色器,您可以将线条的一个顶点的纹理坐标设置为零,将线条的另一个端点设置为一。然后在您的着色器中,您可以使用类似于 tencent 建议的阶梯函数来拒绝片段以创建点画图案。

如果您想自己计算对象后面有哪些线,您也可以跳过深度缓冲区的混乱,尽管除了立方体之外的任何东西都可能需要大量工作。

如果您想使用 OpenGLES 1 而不是 OpenGLES 2,请将点画着色器替换为点画图案的 1D 纹理,并用它来纹理背面线条。但是我不能 100% 确定你可以在 OpenGL 中对线条进行纹理处理,所以这可能行不通。

【讨论】:

  • 谢谢,很清楚。唯一的一个问题:如何绘制到深度缓冲区中?
  • 您绘制的所有内容都会进入深度缓冲区。如果您想在深度缓冲区中绘制而不在屏幕上绘制任何颜色,则使用glColorMask 屏蔽颜色写入。
  • 蒂姆,你对我上面描述的问题有什么想法吗?
  • @agent-10 也许只是先画后面的线,然后画前面的线?它应该以相同的方式工作,然后前线将覆盖在后线之上。
猜你喜欢
  • 2022-01-17
  • 2019-03-21
  • 2013-02-11
  • 1970-01-01
  • 2019-12-10
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
相关资源
最近更新 更多