OpenGL ES - 虚线

时间:2016-06-22 18:23:29

标签: android opengl-es

即时通讯使用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());

我该如何改变它? 我必须纹理线吗?如果是这样,怎么样?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

在OpenGL ES 1.0中,glLineStipple不被支持。也不支持1维纹理。但是支持二维纹理化,并且支持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

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


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

答案 2 :(得分:0)

我建议使用一维纹理(性能:使用alpha测试代替混合)

不要忘记:

  • 将纹理过滤器设置为GL_NEAREST
  • 纹理包装到GL_REPEAT