Android OpenGL多重采样/抗锯齿问题
我正在开发一款Android应用程序,它允许用户点击屏幕绘制颜色。我的所有绘图代码都在OpenGL下运行良好(在Android 4.0.4、Galaxy Nexus上进行测试,尽管我正在尽可能使其向后兼容;我的SDK针对API 14,但minSDK为8) 我遇到的问题是抗锯齿;我希望我所有的多边形和线条都是抗锯齿的,但它们都是锯齿状的。我肯定Galaxy Nexus支持抗锯齿(我在其他应用程序中也看到过),所以我肯定我做错了什么。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,我找到了一些答案
我在谷歌上下搜索了一个多小时,通过几个Q/a,我找到了一些答案:
我以不同的顺序添加了一些或所有这些行,但没有效果。(这些是在onSurfaceCreated中添加的。)
我觉得这个有点帮助。。。但那可能是我的思想在捉弄我。即使在使用它时,仍然会发现锯齿状的线条。(还添加到onSurfaceCreated中。)
这似乎是最常见的答案。但当这样做的时候,一切都是看不见的;也就是说,当以黑色背景开始时,一切都是黑色的,永远都是。(我知道由于LogCat中的内存刷新消息,它仍在绘制中。)我还尝试了与上面所有其他方法相结合的方法。(这也是在onSurfaceCreated中添加的。)
总而言之:我在Android 4+上使用OpenGL,没有任何多采样方法可以工作;虽然大多数都没有效果,但使用glBlendFunc似乎完全破坏了渲染 所以,我很困惑。我愿意接受任何建议。。。他们肯定会帮助更多的防御我的电脑!
提前感谢所有有足够耐心阅读本文的人。如果您没有要求在EGL上下文中进行多重采样,则不能仅使用GL函数打开多重采样。请参见此处的操作方法:
可以在C++(Android NDK)上启用多采样ESEI 如果你不能用C++ SRY编程。p>
android-ndk-r8b/samples/android原生egl示例/jni/renderer.cpp
EGL/EGL.h
GLES/gl.h
GLES2/gl2.h
GLES2/gl2ext.h
文件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 };