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

ace*_*ace 4 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();
Run Code Online (Sandbox Code Playgroud)

但在Android模拟器中,边缘仍然是严重的锯齿状.解决办法是什么?

tha*_*kis 11

http://code.google.com/p/gdc2011-android-opengl/提供了多重采样的示例代码.


小智 4

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

尽管有一种“假”抗锯齿的旧方法,但我从未使用过它,所以我无法告诉您如何操作,但您可以在网上找到一些提示。

来自OpenGL 文档

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

使用混合函数(GL_SRC_ALPHA_SATURATE、GL_ONE)对多边形抗锯齿进行优化,多边形按从最近到最远的顺序排序。