我正在开发一款适用于 Android 的应用程序,允许用户点击屏幕来绘制颜色。我已经让所有绘图代码在 OpenGL 下运行良好(在 Android 4.0.4、Galaxy Nexus 上进行测试,尽管我试图尽可能向后兼容;我的 SDK 以 API 14 为目标,但 minSDK 为 8 )。
我遇到的问题是抗锯齿;我希望我的所有多边形和线条都经过抗锯齿处理,但它们出现锯齿状。我很肯定 Galaxy Nexus 支持抗锯齿(我在其他应用程序中看到过),所以我确定我做错了什么。
我已经在谷歌上下了一个多小时,通过几个 StackOverflow Q/As,我找到了一些答案:
gl.glEnable(GL10.GL_BLEND);
gl.glEnable(GL10.GL_ALPHA_BITS);
gl.glEnable(GL10.GL_MULTISAMPLE);
gl.glEnable(GL10.GL_SMOOTH);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glHint(GL10.GL_POLYGON_SMOOTH_HINT, GL10.GL_NICEST);
gl.glHint(GL10.GL_POINT_SMOOTH_HINT, GL10.GL_NICEST);
我以不同的顺序添加了部分或全部这些行,但没有任何效果。(这些是在 onSurfaceCreated 中添加的。)
gl.glEnable(GL10.GL_DITHER);
我认为这个有点帮助......但这可能是我的想法在欺骗我。但是,即使在使用它时,仍然可以找到锯齿状的线条。(也在 onSurfaceCreated 中添加。)
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
这似乎是最常见的答案。但是这样做时,一切都被画成不可见的;也就是说,当从黑色背景开始时,一切都是黑色的,总是。(由于 LogCat 中的内存刷新消息,我知道它仍在绘制中。)我还结合上述所有其他方法尝试了此方法。(这也是在 onSurfaceCreated 中添加的。)
回顾一下:我在 Android 4+ 上使用 OpenGL,似乎没有多重采样方法有效;虽然大多数都没有效果,但使用 glBlendFunc 似乎完全破坏了渲染。
所以,我很困惑。我对任何建议都持开放态度……它们肯定会比拆开我的电脑更有帮助!
在此先感谢所有耐心阅读本文的人。