在OpenGLES android

时间:2018-06-22 11:38:02

标签: android opengl-es-2.0 android-custom-view glsurfaceview

我正在使用Open GLES 2.0构建我的GLSurfaceView变体,我想画直线,所以我用下面的代码画线(其他所有东西都已经设置好了)

GLES20.glDrawArrays(GL_LINES,offset,no_of_coordinates)

我在上面的代码行中遇到的问题是这些行不平滑,相反,它看起来有很多中断。看起来好像是曲折的小线条排列在一起。您可以在下面看到

enter image description here

然后我读了此内容(https://www.codeproject.com/Articles/199525/Drawing-nearly-perfect-D-line-segments-in-OpenGL)并添加了以下代码

 glHint(GL_LINES,  GL_NICEST);

但是仍然没有任何改变。您能指导我如何获得平滑的直线吗?

1 个答案:

答案 0 :(得分: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()); 

这应该为您提供很好的抗锯齿功能,但是折衷会影响性能,尽管当今大多数设备都应该能够在不大幅下降的情况下进行管理。

希望这会有所帮助。