在 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