Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何去除Android OpenGL ES中的锯齿状边缘?_Android_Opengl Es - Fatal编程技术网

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

如何去除Android OpenGL ES中的锯齿状边缘?,android,opengl-es,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);

我有以下代码:

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 Emulator中,边缘仍然严重参差不齐。解决方案是什么?

您正在使用“提示”启用多边形平滑。提示只是对实现的一个“提示”,即希望多边形边平滑。如果需要,实现可以随意忽略它

这正是它正在做的

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

  • 试一试设备。我不信任emulator处理与视觉/图形相关的问题
  • 尝试
    gl.glEnable(GL10.gl\u抖动)。我不确定默认情况下是否启用此选项。另外:这会使绘图速度变慢

  • 最好的方法是使用多重采样(抗锯齿)。由于您使用仿真器,因此这不是您的选项。(OpenGL ES 2.0支持多重映射,但emulator不支持2.0) 根据OpenGL规范,设备可以忽略您设置的glHint,因此不要期望从中得到太多。 GL_抖动是从16位颜色深度“伪造”24位颜色深度的一种方法,基本上与边缘无关

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

    混合函数(GL_SRC_ALPHA,GL_ONE_减去_SRC_ALPHA)也可用于以任意顺序渲染抗锯齿点和线

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


    有多采样的示例代码。

    我刚刚遇到了与您相同的问题。我认为您需要的是以下代码行:

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

    那么,除了通过API给出提示外,还有其他解决锯齿边的方法吗?我不知道Emulator是否支持反走样。有经验的安卓开发者能证实这一点吗?我使用的是API 8级构建目标2.2。@艾伦:你可以通过渲染到两倍宽(或两倍高)的缓冲区来伪造抗锯齿然后使用双线性渲染到后台以获得抗锯齿,但我不知道如何在Android上打开抗锯齿…我仍在忙于处理OpenGl中的其他问题,一旦我测试了此处描述的建议,我将回信。-1。抖动与锯齿边缘无关,但在帧缓冲区使用低位深度(每像素16位等)时,抖动会减少带状。为了记录在案,以防有人遇到这种情况:AVD现在通过hopst GPU部署支持OpenGL ES 2.0(可选,请注意复选框)。仅供参考,这是一种启用多采样的方法,它不需要像thakis的回答那样编写着色器,可以在svdree的回答中找到,在我的评论中,我链接到了样本代码,看起来它使用了他的方法。不,这与形状内部的纹理像素有关,以确保纹理颜色平滑混合。问题是关于边缘。例如,沿着三维模型的轮廓。或三角形扇形的最后边缘,背景颜色要浅得多或深得多。Google Code上不再提供此功能。存档文件位于此处: