对象的虚线后边缘

时间:2012-10-18 17:47:51

标签: android opengl-es

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

我尝试了Tim的想法(使用Depth缓冲区)。它的工作原理但是在图片上有一些人工制品,点缀(紫色)线重叠实线(红色):

enter image description here enter image description here

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

谢谢大家的帮助。现在它看起来很棒!! enter image description here

1 个答案:

答案 0 :(得分:2)

这是我要做的大致概述。对于对象本身,您需要一个网格,而对于要绘制的“边线”,需要另一个GL_LINES网格。

  1. 将实体网格绘制到深度缓冲区中。
  2. 使用标准着色器绘制“边缘网格”,以获得实线,但将深度测试设置为GL_LEQUAL(仅绘制比深度值更近的对象。
  3. 使用GL_GREATER的深度测试第二次绘制边缘网格。在此过程中使用点画着色器来获得虚线效果(在下面进一步说明)。
  4. 这可能会出现问题,具体取决于场景中的其他对象,因为在多维数据集被其他东西遮挡的情况下,您可能会得到虚线,但也许这对您来说不是问题,或者您可以以某种方式剔除网格是否被遮挡。

    对于点画着色器,您可以将该行的一个顶点的texcoord设置为零,并将该行的另一个端点设置为1。然后在着色器中,您可以使用类似于腾讯建议的步进函数来拒绝片段以创建点画图案。

    如果你想自己计算对象后面的哪一行,你也可以跳过深度缓冲区的混乱,尽管它可能是一个比立方体更多的工作。

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