8

我有一个应用程序绘制 3-d 地图视图标记线,显示各种功能。我正在将地图移植到 OpenGL-ES 架构,但在弄清楚如何显示虚线时遇到了一些麻烦。

进行大量谷歌搜索后,我发现许多关于从 OpenGL-ES 中删除绘制虚线和多边形的想法的参考资料,因为它们可以使用纹理三角形轻松模拟。太好了,但我找不到任何人真正进行此仿真和/或对所涉及的步骤进行描述。

一个例子,我在尝试制作这个概念的原型时遇到的一个问题是透视将我的线条挤压到不可见,因为它们朝向地平线。使用 LINE_STRIP,这不会发生,并且线条在地图中保持恒定宽度。

任何关于如何在透视图中实现等宽虚线的建议将不胜感激。

4

2 回答 2

5

我相信您可以将纹理应用于线条,而不仅仅是三角形。您需要为线的每一端设置纹理坐标;纹理将沿线线性插值。

无论您使用线还是线带,此解决方案的有效性都应该是不变的 - 线带只是创建具有较少顶点的线的一种方式。

还有另一个问题:随着线条远离相机,纹理图案趋于变得紧凑。发生这种情况是因为纹理坐标插值即使对于线条也是透视正确的(参见 GL 规范的第 3.5 节)。

有两种方法可以解决这个问题:

  1. 如果您可以计算撤消透视的纹理的“q”坐标,则可以恢复屏幕空间纹理。这种技术可能过于昂贵。

  2. 您可以在眼睛空间中投影纹理(例如 glTexGen)。

纹理坐标生成当然在 GLES 1.1 中不可用,但如果您按数组使用顶点,您可以通过以下方式伪造它:

  • 将您的纹理坐标数组设置为您的顶点坐标数组和
  • 使用纹理矩阵“变换”顶点。

这种技术的缺点是纹理图案将在固定的屏幕空间中——也就是说,纹理不会跨越线条。

于 2010-01-28T22:48:42.277 回答
3

如果您只想绘制虚线,只需将 GL_LINE_STRIP 更改为 GL_LINES。这样,open GL 将连接顶点 1&2、3&4、5&6,但不连接 3&4 或 4&5,并在那里留出空间。它本质上是一条半/半比例的虚线——glLineStipple(1, 0101) 的粗略等价物;

IE:在顶点数组中

[0,0,1,1,2,2,3,3,4,4,5,5,6,6]

OpenGL 会将 (0,0) 连接到 (1,1),但不会将 (1,1) 连接到 (2,2) [与 GL_LINE_STRIP 相同]。然后它将 (3,3) 连接到 (4,4),但不将 (4,4) 连接到 (5,5)。最终的连接将是 (5,5) 到 (6,6)。

这是我做的时候的样子:

Android 上的虚线

这条线不是 50/50 虚线/空线,因为在我的例子中,它代表每个游戏帧的游戏实体的位置——并且游戏帧不一定都等长,因此线:空间比率不一致。

绘制它的代码如下所示:

公共无效绘制(GL10 gl){ gl.glDisable(GL10.GL_TEXTURE_2D);

  gl.glColor4f(color[0], color[1], color[2], color[3] / fade);
          //pointsBuffer holds the points on the line
  gl.glVertexPointer(2, GL10.GL_FLOAT, 0, pointsBuffer); 

  gl.glDrawArrays(GL10.GL_LINES, 0, points.length/2);

  gl.glEnable(GL10.GL_TEXTURE_2D);

}

创建更有意图案化点画的另一种想法是通过使用索引数组(glDrawElements)进行绘制来跳过某些顶点。但是,我没有可以向您展示的示例。:/

于 2014-02-19T21:37:04.060 回答