Рисование прямоугольника с пунктирной границей в openGL android - PullRequest
0 голосов
/ 12 февраля 2020

Я новичок в 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

1 Ответ

0 голосов
/ 12 февраля 2020

В OpenGL ES 1.1 вы не можете использовать glLineStipple и не можете использовать шейдер. Но вы можете использовать одномерную текстуру и Альфа-тест . См. Полная спецификация OpenGL ES 1.1 . OpenGL ES 1.1 также не поддерживает одномерные текстуры. Но это может быть легко заменено 2-мерной текстурой Nx1.

Создание 2D (4x1) текстуры с внутренним форматом GL_ALPHA и следующим шаблоном:

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

При рисовании линий необходимо включить Альфа-тест и включить двухмерное текстурирование.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...