首页 > 解决方案 > 在openGL android中绘制带有虚线边界的矩形

问题描述

我是openGL的新手。我想在 GLES11 画布上绘制一个带有虚线边界的矩形。我可以使用drawRect()此处提供的方法绘制一个普通矩形:

@Override
public void drawRect(float x, float y, float width, float height, GLPaint paint) {
    GL11 gl = mGL;

    mGLState.setColorMode(paint.getColor(), mAlpha);
    mGLState.setLineWidth(paint.getLineWidth());

    saveTransform();
    translate(x, y);
    scale(width, height, 1);

    gl.glLoadMatrixf(mMatrixValues, 0);
    gl.glDrawArrays(GL11.GL_LINE_LOOP, OFFSET_DRAW_RECT, 4);

    restoreTransform();
    mCountDrawLine++;
}

完整的课程可以在这里找到。

https://github.com/classified/Android-Work/blob/master/android_packages_apps_Gallery2-cm-10.2/src/com/android/gallery3d/glrenderer/GLES11Canvas.java

有人可以帮我吗?

注意 GLES 11 不支持GL_LINE_STIPPLE

标签: androidopengl-es

解决方案


在 OpenGL ES 1.1 中glLineStipple,您不能使用也不能使用着色器。但是您可以使用一维纹理和Alpha 测试。请参阅OpenGL ES 1.1 完整规范。OpenGL ES 1.1 也不支持一维纹理。但这可以很容易地用二维 Nx1 纹理代替。

使用内部格式GL_ALPHA和以下模式创建 2D (4x1) 纹理:

1 0 0 1

缩小和放大功能是GL_NEAREST。包装参数是GL_REPEAT(这是默认值)。

byte arr[] = new byte[] { 255, 0, 0, 255 };
ByteBuffer textureBuffer = ByteBuffer.wrap(arr);

gl2.glGenTextures(1, texture_id_, stippleTexObj);
gl.glBindTexture(GL.GL_TEXTURE_2D, stippleTexObj);
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST);
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST);
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_REPEAT);
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_REPEAT);
gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_ALPHA, 4, 1, 0, GL.GL_ALPHA, GL.GL_UNSIGNED_BYTE, textureBuffer);

绘制线条时,您必须启用Alpha 测试并启用 2 维纹理。

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

gl.glEnable(GL11.GL_TEXTURE_2D);

确保在 ypu 绘制线时与顶点关联的纹理坐标与整数值对齐:

例如,左下角为 (-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


推荐阅读