如何去除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设备上启用抗锯齿功能,因为它们的功能还不够强大。这可能在不同的手机之间有所不同,但同样,您正在设置提示
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上不再提供此功能。存档文件位于此处: