Android OpenGL多重采样/抗锯齿问题

Android OpenGL多重采样/抗锯齿问题,android,opengl-es,antialiasing,multisampling,Android,Opengl Es,Antialiasing,Multisampling,我正在开发一款Android应用程序,它允许用户点击屏幕绘制颜色。我的所有绘图代码都在OpenGL下运行良好(在Android 4.0.4、Galaxy Nexus上进行测试,尽管我正在尽可能使其向后兼容;我的SDK针对API 14,但minSDK为8) 我遇到的问题是抗锯齿;我希望我所有的多边形和线条都是抗锯齿的,但它们都是锯齿状的。我肯定Galaxy Nexus支持抗锯齿(我在其他应用程序中也看到过),所以我肯定我做错了什么。 我在谷歌上下搜索了一个多小时,通过几个Q/a,我找到了一些答案

我正在开发一款Android应用程序,它允许用户点击屏幕绘制颜色。我的所有绘图代码都在OpenGL下运行良好(在Android 4.0.4、Galaxy Nexus上进行测试,尽管我正在尽可能使其向后兼容;我的SDK针对API 14,但minSDK为8)

我遇到的问题是抗锯齿;我希望我所有的多边形和线条都是抗锯齿的,但它们都是锯齿状的。我肯定Galaxy Nexus支持抗锯齿(我在其他应用程序中也看到过),所以我肯定我做错了什么。

我在谷歌上下搜索了一个多小时,通过几个Q/a,我找到了一些答案:

我以不同的顺序添加了一些或所有这些行,但没有效果。(这些是在onSurfaceCreated中添加的。)

我觉得这个有点帮助。。。但那可能是我的思想在捉弄我。即使在使用它时,仍然会发现锯齿状的线条。(还添加到onSurfaceCreated中。)

这似乎是最常见的答案。但当这样做的时候,一切都是看不见的;也就是说,当以黑色背景开始时,一切都是黑色的,永远都是。(我知道由于LogCat中的内存刷新消息,它仍在绘制中。)我还尝试了与上面所有其他方法相结合的方法。(这也是在onSurfaceCreated中添加的。)

总而言之:我在Android 4+上使用OpenGL,没有任何多采样方法可以工作;虽然大多数都没有效果,但使用glBlendFunc似乎完全破坏了渲染

所以,我很困惑。我愿意接受任何建议。。。他们肯定会帮助更多的防御我的电脑!


提前感谢所有有足够耐心阅读本文的人。

如果您没有要求在EGL上下文中进行多重采样,则不能仅使用GL函数打开多重采样。请参见此处的操作方法:


可以在C++(Android NDK)上启用多采样ESEI 如果你不能用C++ SRY编程。p>

  • 安装android ndk(我的android ndk版本是r8b)
  • 打开
    android-ndk-r8b/samples/android原生egl示例/jni/renderer.cpp
  • 将添加更改为包括
    EGL/EGL.h
    GLES/gl.h
    GLES2/gl2.h
    GLES2/gl2ext.h
    文件
  • 在bool
    Renderer::initialize()函数中:
  • 改变

       const EGLint attribs to {
                    EGL_RED_SIZE, 5,  
                    EGL_GREEN_SIZE, 6,  
                    EGL_BLUE_SIZE, 5,  
                    EGL_DEPTH_SIZE, 16,  
                    // Requires that setEGLContextClientVersion(2) is called on the view.
                    EGL_RENDERABLE_TYPE, 4 /* EGL_OPENGL_ES2_BIT */,
                    EGL_SAMPLE_BUFFERS, 1 /* true */,
                    EGL_SAMPLES, 2,
                    EGL_NONE  };
    

    EGL_样本
    很重要此参数更改样本数

    您是否正在使用明确请求的多重采样创建EGL上下文?当我从C代码中这样做的时候,它对我是有效的。我并没有特别要求对EGL进行多重采样,我知道。我调用了
    setEGLConfigChooser(8,8,8,8,0,0)创建渲染器时,但除此之外,我不触摸它(只触摸GL10对象)。使用MultisampleConfigChooser时,我可能会在创建曲面后收到此错误:
    06-06 12:35:00.744:E/AndroidRuntime(14717):java.lang.RuntimeException:createContext失败:EGL\u BAD\u CONFIG
    。你知道为什么它会在这个配置上崩溃吗?似乎多采样需要OpenGL ES 2.0。奇怪的是,将manifest和setEGLContextClientVersion设置为使用2.0根本不起作用,因此应用程序只是抛出了“未实现的API”错误。因此,我认为多重采样的好处不足以让这个应用程序担心。马丁斯,我已经把你的答案标记为正确,因为你确实有正确的答案;应用程序不支持这样的解决方案。谢谢你的帮助!以下是我的EGLConfigChooser版本,它在很大程度上基于上面的MultisampleConfigChooser,但有几个关键的修复:
    gl.glEnable(GL10.GL_DITHER);
    
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
    
       const EGLint attribs to {
                    EGL_RED_SIZE, 5,  
                    EGL_GREEN_SIZE, 6,  
                    EGL_BLUE_SIZE, 5,  
                    EGL_DEPTH_SIZE, 16,  
                    // Requires that setEGLContextClientVersion(2) is called on the view.
                    EGL_RENDERABLE_TYPE, 4 /* EGL_OPENGL_ES2_BIT */,
                    EGL_SAMPLE_BUFFERS, 1 /* true */,
                    EGL_SAMPLES, 2,
                    EGL_NONE  };