6

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

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

How Should I Change It? Does I have to Texture The line? And if so, How?

Rabbid76
  • 202,892
  • 27
  • 131
  • 174
Alireza Pir
  • 878
  • 1
  • 16
  • 41

2 Answers2

1

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
Szabolcs Dombi
  • 5,493
  • 3
  • 39
  • 71
  • 2
    glLineStipple is not a core function – Szabolcs Dombi Jul 06 '16 at 18:25
  • This needs more explanation to be useful. How use 1D texture on a line that is in 2D or 3D? There must be some formula, that is missing from this answer. ([This link](https://developer.tizen.org/zh-hans/forums/native-application-development/gllinestipple-deprecated-opengl-es-2.0?langswitch=zh-hans) shows results that might be relevant, though I haven't looked at the code there in detail.) – ToolmakerSteve Aug 27 '19 at 15:08
1

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

Rabbid76
  • 202,892
  • 27
  • 131
  • 174