我有一个应用程序可以绘制三维地图视图标记的行,显示各种功能。 我正在将地图移植到OpenGL-ES架构,但在解决如何显示虚线方面遇到了一些麻烦。
做了大量的谷歌搜索,我发现许多人提到了从OpenGL-ES中删除绘制虚线和多边形的想法,因为它们可以使用纹理三角形轻松模拟。这很好,但我找不到任何实际进行此仿真和/或描述所涉及步骤的人。
我尝试对这个概念进行原型设计时遇到的一个问题就是透视,当我们走向地平线时,透视会挤压我的线条。使用LINE_STRIP,这不会发生,并且线条在地图中保持恒定的宽度。
关于如何在透视图中实现虚线恒定宽度线的任何建议都将非常受欢迎。
答案 0 :(得分:5)
我相信你可以将纹理应用于线条,而不仅仅是三角形。您需要为线的每一端设置纹理坐标;纹理将沿着线线性插值。
此解决方案的有效性应该是使用线条还是线条不变 - 线条只是创建具有较少顶点的线条的方法。
另外还有一个问题:当线条远离相机时,纹理图案变得紧凑的趋势。发生这种情况是因为即使对于线条,纹理坐标插值也是透视校正的(参见GL规范的第3.5节)。
有两种方法可以解决这个问题:
如果您可以计算撤消透视的纹理的“q”坐标,则可以恢复屏幕空间纹理。这种技术可能性能太高。
您可以在眼睛空间中投影纹理(例如glTexGen)。
纹理坐标生成当然在GLES 1.1中不可用,但如果你按数组使用顶点,你可以伪造它:
这种技术的缺点是纹理图案将位于固定的屏幕空间中 - 也就是说,纹理不会跨越线条。
答案 1 :(得分:3)
如果您想要绘制虚线,只需从GL_LINE_STRIP更改为GL_LINES即可。这样,打开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)。
这就是我做的时候的样子:
这条线不是50/50点/空,因为在我的情况下,它代表每个游戏帧的游戏实体的位置 - 并且游戏帧不一定都是相等的长度,因此不一致的线:空间比。
代码看起来像这样绘制它:
public void draw(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)绘制来跳过某些顶点。但是,我没有向你展示这方面的例子。 :/