Рисование совершенно прямых линий в OpenGLES android

Я использую Open GLES 2.0 для создания своего варианта GLSurfaceView, я хотел рисовать прямые линии, поэтому я использовал приведенный ниже код для рисования линий (все остальное уже настроено)

GLES20.glDrawArrays(GL_LINES,offset,no_of_coordinates)

Проблема, с которой я сталкиваюсь с приведенной выше строкой кода, состоит в том, что строки не являются гладкими, вместо этого, похоже, что у них так много разрывов. Похоже, что маленькие линии зигзага были помещены вместе. Вы можете увидеть ниже

Затем я прочитал это ( https://www.codeproject.com/Articles/199525/Drawing-nearly-perfect-D-line-segments-in-OpenGL) и добавил приведенный ниже код

 glHint(GL_LINES,  GL_NICEST);

Но все равно ничего не изменилось. Можете ли вы указать мне, как получить плавные прямые линии?

1 ответ

Вы должны предоставить EGLConfigChooser экземпляр для рендера, и определите его с помощью 4xMSAA (4 мультисэмпла для сглаживания).

Вот как вы это делаете:

Сначала определите класс с нужными вам определениями:

class MyConfigChooser implements WLGLSurfaceView.EGLConfigChooser {
        @Override
        public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) {
            int attribs[] = {
                EGL10.EGL_LEVEL, 0,
                EGL10.EGL_RENDERABLE_TYPE, 4,  
                EGL10.EGL_COLOR_BUFFER_TYPE, EGL10.EGL_RGB_BUFFER,
                EGL10.EGL_RED_SIZE, 8,
                EGL10.EGL_GREEN_SIZE, 8,
                EGL10.EGL_BLUE_SIZE, 8,
                EGL10.EGL_ALPHA_SIZE, 8,
                EGL10.EGL_DEPTH_SIZE, 16,
                EGL10.EGL_SAMPLE_BUFFERS, 1, 
                EGL10.EGL_SAMPLES, 4,  // This is for 4x MSAA.
                EGL10.EGL_NONE
            };

            EGLConfig[] configs = new EGLConfig[1];
            int[] configCounts = new int[1];
            egl.eglChooseConfig(display, attribs, configs, 1, configCounts);

            if (configCounts[0] == 0) {
                Log.i("OGLES20", "Config with 4MSAA failed");
                // Failed! Error handling.
                return null;
            } else {
                Log.i("OGLES20", "Config with 4MSAA succeeded");
                return configs[0];
            }
        }
    }

Затем добавьте в свой вид поверхности следующий вызов:

mySufaceView.setEGLConfigChooser(new MyConfigChooser()); 

Это должно дать вам очень хорошее сглаживание, но компромисс является ударом по производительности, хотя большинство современных устройств должно иметь возможность управлять без значительного падения.

Надеюсь это поможет.

Другие вопросы по тегам