【问题标题】:OpenGL ES - Dashed LinesOpenGL ES - 虚线
【发布时间】:2016-06-22 18:23:28
【问题描述】:

我正在使用 OpenGLEs10 进行 Android 游戏开发,我想绘制虚线 现在我用这段代码来画我的线:

gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
// gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glLineWidth(4.0f);
gl.glVertexPointer(2, GL10.GL_FLOAT, 0, mBufDestVertices);
gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, mDesPoly.getNumPoints());

我应该如何改变它? 我必须纹理线条吗?如果是,怎么做?

【问题讨论】:

    标签: android opengl-es


    【解决方案1】:

    我建议使用一维纹理(性能:使用 alpha 测试而不是混合)

    别忘了:

    • 将纹理过滤器设置为GL_NEAREST
    • 纹理环绕到GL_REPEAT

    【讨论】:

    • glLineStipple 不是核心功能
    • 这需要更多解释才能有用。如何在 2D 或 3D 线条上使用 1D 纹理?必须有一些公式,这个答案中缺少。 (This link 显示了可能相关的结果,尽管我没有详细查看那里的代码。)
    【解决方案2】:

    在 OpenGL ES 1.0 中 glLineStipple 不受支持。也不支持一维纹理。但支持二维纹理,支持Alpha test。见OpenGL ES 1.0 Specification
    一维纹理,可以用二维Nx1纹理来表示。

    点画图案可以在纹理中编码。使用内部格式GL_ALPHA 和以下模式创建二维 4x1 纹理:

    1 0 0 1
    

    缩小和放大功能是GL_NEAREST。换行参数为GL_REPEAT(默认)。

    byte arr[] = new byte[] { 255, 0, 0, 255 };
    ByteBuffer textureBuffer = ByteBuffer.wrap(arr);
    
    gl.glGenTextures(1, texture_id_, stippleTexObj);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, stippleTexObj);
    gl.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
    gl.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);
    gl.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
    gl.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);
    gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_ALPHA, 4, 1, 0,
                    GL10.GL_ALPHA, GL10.GL_UNSIGNED_BYTE, textureBuffer);
    

    绘制线条时,您必须启用Alpha test 并启用二维纹理。

    gl.glAlphaFunc(GL10.GL_GEQUAL, 0.5f);
    gl.glEnable(GL10.GL_ALPHA_TEST);
    gl.glEnable(GL10.GL_TEXTURE_2D);
    

    确保在绘制线条时与顶点关联的纹理坐标与整数值对齐,这会导致线条以破折号开始和结束:

    例如一个四边形,左下角为 (-0.5 -0.5),右下角为 (0.5, 0.5),纹理坐标在 [0, 5] 范围内:

     x     y       u   
    -0.5f -0.5f    0.0f
     0.5f -0.5f    5.0f
     0.5f  0.5f    0.0f
    -0.5f  0.5f    5.0f
    

    由于 wrap 函数为 GL_REPEAT 且纹理坐标在 [0, 5] 范围内,因此 5 次重复的点画图案被包裹到四边形的每个边缘。


    Draw a simple dotted line or dashed line in OpenGL GLES20 android using fragment shader and GL_LINE_STRIP

    【讨论】:

      【解决方案3】:

      您不必使用纹理,只需使用函数glLineStipple(GLint factor, GLushort pattern),然后调用glEnable(GL_LINE_STIPPLE)

      有关glLineStipple 及其参数的更多信息,您可以查看this

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 2013-01-08
      相关资源
      最近更新 更多