3

我正在开发一款适用于 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 似乎完全破坏了渲染。

所以,我很困惑。我对任何建议都持开放态度……它们肯定会比拆开我的电脑更有帮助!

在此先感谢所有耐心阅读本文的人。

4

2 回答 2

1

如果您没有在 EGL 上下文中请求多重采样,则不能仅使用 GL 函数将其打开。在这里查看如何做到这一点:

于 2012-06-06T07:02:10.350 回答
1


如果你不能用 c++ srry 编程,你可以 在 c++ (android ndk) 上启用多重采样。

  1. 安装android-ndk(我的android ndk版本是r8b)
  2. 打开 android-ndk-r8b/samples/android-native-egl-example/jni/renderer.cpp
  3. 更改添加到包含EGL/egl.h GLES/gl.h GLES2/gl2.h GLES2/gl2ext.h文件
  4. 在布尔Renderer::initialize() function :

改变

   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_SAMPLES这个参数改变样本数很重要

于 2014-02-17T12:29:51.060 回答