OpenGL ES - Dashed Lines

前端 未结 3 1705
一整个雨季
一整个雨季 2020-12-11 18:33

I\'m Using OpenGlEs10 for My Android Game Development, I Want to Draw Dashed-lines Now Im Using This Code to Draw My Line:

         


        
相关标签:
3条回答
  • 2020-12-11 18:49

    I recommend to use a 1D texture (performance: use alpha testing instead of blending)

    don't forget to:

    • set texture filter to GL_NEAREST
    • texture wrapping to GL_REPEAT
    0 讨论(0)
  • 2020-12-11 18:50

    In OpenGL ES 1.0 glLineStipple is not supported. 1 dimensional textures are not supported, too. But 2 dimensional texturing is supported and the Alpha test is supported. See OpenGL ES 1.0 Specification.
    A 1 dimensional textures, can be represented by a 2 dimensional Nx1 texture.

    The stipple pattern can be encoded in a texture. Create 2 dimensional 4x1 texture with the internal format GL_ALPHA and the following pattern:

    1 0 0 1
    

    The minifying and magnification function is GL_NEAREST. The wrap parameters are GL_REPEAT (that is default).

    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);
    

    When you draw the lines, the you have to enable the Alpha test and enable 2 dimensional texturing.

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

    Ensure that the texture coordinates which are associated to the vertices are aligned to integral values when you draw the line, that causes the the lines start and end with a dash:

    e.g. a quad with bottom left of (-0.5 -0.5) and to right of (0.5, 0.5) and the texture coordinates in range [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
    

    Since the wrap function is GL_REPEAT and the texture coordinates are in range [0, 5], 5 repetitions of the stipple pattern are wrapped to each edge of the quad.


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

    0 讨论(0)
  • 2020-12-11 18:56

    You don't have to use a texture, you can simply use the function glLineStipple(GLint factor, GLushort pattern) and then call glEnable(GL_LINE_STIPPLE).

    For more information about glLineStipple and its arguments you can have a look at this.

    0 讨论(0)
提交回复
热议问题