Opengl es 使用OpenGL ES绘制点画线

Opengl es 使用OpenGL ES绘制点画线,opengl-es,opengl-to-opengles,Opengl Es,Opengl To Opengles,我有一个应用程序,绘制三维地图视图标记线,显示各种功能。 我正在将地图移植到OpenGL ES体系结构,但在解决如何显示虚线方面遇到了一些问题 通过大量的谷歌搜索,我发现了很多关于绘制虚线和多边形从OpenGL ES中删除的想法,因为它们可以很容易地使用纹理三角形进行模拟。这很好,但我找不到任何人真正进行这种模拟和/或描述所涉及的步骤 举个例子,我在尝试原型化这个概念时遇到的一个问题是,当线条走向地平线时,透视图会将它们挤压到看不见的位置。使用LINE_STRIP,不会发生这种情况,并且线条在地

我有一个应用程序,绘制三维地图视图标记线,显示各种功能。 我正在将地图移植到OpenGL ES体系结构,但在解决如何显示虚线方面遇到了一些问题

通过大量的谷歌搜索,我发现了很多关于绘制虚线和多边形从OpenGL ES中删除的想法,因为它们可以很容易地使用纹理三角形进行模拟。这很好,但我找不到任何人真正进行这种模拟和/或描述所涉及的步骤

举个例子,我在尝试原型化这个概念时遇到的一个问题是,当线条走向地平线时,透视图会将它们挤压到看不见的位置。使用LINE_STRIP,不会发生这种情况,并且线条在地图中保持恒定宽度


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

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

此解决方案的有效性应该与使用直线还是线条带无关-线条带只是创建顶点较少的线条的一种方法

还有一个问题:当线条离开相机时,纹理图案会变得紧凑。这是因为纹理坐标插值即使对于线也是透视正确的(请参见GL规范第3.5节)

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

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

  • 可以在眼睛空间中投影纹理(例如glTexGen)

  • 纹理坐标生成在GLES 1.1中当然不可用,但如果您使用的是“按数组顶点”,则可以通过以下方式进行伪装:

    • 将纹理坐标数组设置为顶点坐标数组,然后
    • 使用纹理矩阵“变换”顶点

    这种技术的缺点是,纹理图案将位于固定的屏幕空间中,也就是说,纹理不会横穿线条。

    如果您只想画虚线,只需将“GL\u LINE\u STRIP”更改为“GL\u LINE”。这样,OpenGL将连接顶点1和2、3和4、5和6,但不连接3和4或4和5,在那里留下空间。它本质上是一条半/半比率虚线——大致相当于glLineStipple(10101)

    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虚线/空线,因为在我的例子中,它代表每个游戏框架中游戏实体的位置——并且游戏框架不一定都是等长的,因此不一致的线:空间比率

    绘制代码时,代码如下所示:

    公共作废提款(GL10 gl) { gl.glDisable(GL10.gl_纹理_2D)

    }


    另一种创建更有意的图案点画的方法是跳过某些顶点,而使用索引数组(gldrawerelements)进行绘制。然而,我没有一个这样的例子给你看/

    你试过普通线吗?它会使它们在地平线上消失吗?或者只有当你使用它们有纹理的时候?普通线画得正确,但我不能使用它们。我尝试将纹理应用于线条条,但这似乎没有任何作用。在搜索时,我发现了一些建议,表明这是行不通的,而纹理三角形是最好的选择。如果纹理线_条可以工作,那就太好了。PS-我正在使用EGL1.1。谢谢,我会试试看。我以前试过给线条添加纹理,但没有成功——我可能早就放弃了。我希望纹理重复,这样无论线条增长多长,我都能在线条上获得一致的破折号。如果没有着色器,我认为如果不计算每帧的ST coords,就无法做到这一点。使用着色器时,您需要:-在网格上的模型空间中对线的方向进行编码。-在顶点着色器中,将其转换为眼睛空间坐标。-在屏幕空间中生成实际的UV贴图(每像素)-通过变换(和规范化)的线方向向量旋转UV贴图的采样。只要说一句,如果你对矩阵变换和坐标空间不太熟悉的话,这是非常重要的-(另外,你可能想看看这个:看起来很多消费级GPU在各种情况下都不能正确地进行点画。对于水平和垂直点画(它们能正确进行的少数情况之一)简单地投影一个棋盘重复纹理就足够了。它看起来好像我在与这一纹理作斗争,而且在OpenGL ES中实现我想要的效果是不可行的。我追求的效果不值得它看起来需要的复杂程度。绘制淡入地平线的纹理三角形应该是一种可以接受的选择e、 谢谢你的帮助。
      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);