我将 360 度光球图像映射到一个球体上,相机位于球体中心。当我们使用原生 Android SDK 和 OpenGL ES 2.0 构建应用程序时,我们会看到锯齿状的边缘,如下图所示。当我使用纸板设备看到此视图时,可以在沙发扶手、地板边缘等处看到锯齿
另一方面,相同的图像(4096X2048 分辨率)在适用于 Android 的 unity3d 应用程序中完美呈现。
我们正在使用的纹理的放大和缩小过滤器是 GL_LINEAR。
用于设置纹理过滤参数和生成纹理和mipmap的源代码:
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mSphereTextureIds[0]);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR_MIPMAP_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
// Load the bitmap into the bound texture.
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);
多样本抗锯齿代码 (4X MSAA)
cardboardView.setEGLConfigChooser(new MyConfigChooser());
cardboardView.setRenderer(renderer);
我还开启了 4x Multisample 抗锯齿。但即使在这样做之后,纹理内部也会出现锯齿。我在我的两个着色器中对浮点和整数都使用了高精度。
class MyConfigChooser implements CardboardView.EGLConfigChooser {
@Override
public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) {
int attribs[] = {
EGL10.EGL_LEVEL, 0,
EGL10.EGL_RENDERABLE_TYPE, 4, // EGL_OPENGL_ES2_BIT
EGL10.EGL_COLOR_BUFFER_TYPE, EGL10.EGL_RGB_BUFFER,
EGL10.EGL_RED_SIZE, 8,
EGL10.EGL_GREEN_SIZE, 8,
EGL10.EGL_BLUE_SIZE, 8,
EGL10.EGL_DEPTH_SIZE, 16,
EGL10.EGL_SAMPLE_BUFFERS, 1,
EGL10.EGL_SAMPLES, 2, // This is for 4x MSAA.
EGL10.EGL_NONE
};
EGLConfig[] configs = new EGLConfig[1];
int[] configCounts = new int[1];
egl.eglChooseConfig(display, attribs, configs, 1, configCounts);
if (configCounts[0] == 0) {
// Failed! Error handling.
Log.d("test","MSAA Failed............");
return null;
} else {
return configs[0];
}
}
Unity 是否对纹理进行了一些后期处理,以便在放大期间进行过滤,使其外观更好,而不会产生锯齿效果?我们可以在 Android 上进行各向异性过滤以平滑放大后的纹理而不会模糊吗?如果是,我们能否获得有关如何做到这一点的线索?Android 目前支持的最大 MSAA 是 4 倍吗?(我正在使用 Nexus 5)。
提前致谢
阿普尔夫尼加姆