如何消除Android OpenGL ES中的锯齿状边缘?

时间:2011-02-08 14:40:14

标签: android opengl-es

我有以下代码:

public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
    gl.glShadeModel(GL10.GL_SMOOTH);
    gl.glClearDepthf(1.0f);
    gl.glEnable(GL10.GL_DEPTH_TEST);
    gl.glDepthFunc(GL10.GL_LEQUAL);
    //gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
    gl.glHint(GL10.GL_POLYGON_SMOOTH_HINT, GL10.GL_NICEST);
}

public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glLoadIdentity();

但Android模拟器中的边缘仍然是严重的锯齿状。解决方案是什么?

5 个答案:

答案 0 :(得分:11)

http://code.google.com/p/gdc2011-android-opengl/包含多重采样的示例代码。

答案 1 :(得分:4)

最好的方法是使用多重采样(Antialiasing)。由于您使用模拟器,因此不适合您。 (OpenGL ES 2.0支持多图表,但模拟器不支持2.0) 根据OpenGL规范,设备可以忽略您设置的glHint,因此不要期望太多。 GL_DITHER是一种从16位颜色深度“伪造”24位颜色深度的方法,基本上它与边缘无关。

虽然有一种古老的方法来“伪造”抗锯齿,它与我从未使用过的方法相同,所以我无法告诉你如何,但你可以在网上找到一些提示。

来自OpenGL docs

  

混合函数(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)对于以任意顺序渲染抗锯齿点和线也很有用。

     

使用混合函数(GL_SRC_ALPHA_SATURATE,GL_ONE)优化多边形抗锯齿,其中多边形从最近到最远排序。

答案 2 :(得分:1)

您正在使用“提示”打开多边形平滑。提示只是对要实现平滑多边形边缘的实现的“提示”。如果需要,实现可以随意忽略它。

这正是它正在做的事情。

此外,您很可能无法在Android设备上打开抗锯齿功能,因为它们的功能不够强大。这可能在手机之间有所不同,但同样,您正在设置提示。

答案 3 :(得分:1)

我刚刚遇到了和你一样的问题。我认为您正在寻找的是以下代码行:

gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);

答案 4 :(得分:0)

  1. 试用一台设备。我不相信模拟器的视觉/图形相关问题。
  2. 试试gl.glEnable(GL10.GL_DITHER);。我不确定这是否默认开启。另外:这会使绘图变慢。