1

我将 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)。

提前致谢

阿普尔夫尼加姆

4

2 回答 2

0

我们可以在 Android 上进行各向异性过滤来平滑放大后的纹理而不模糊吗?

不是一般的——它“真的很贵”,所以没有多少移动硬件支持它。

如果是,我们能否获得有关如何做到这一点的线索?

“官方” OpenGL ES 中不支持它;检查供应商扩展以查看是否存在。对于桌面 GL,它通过 GL_EXT_texture_filter_anisotropic 扩展得到支持——我还没有看到支持它的移动 GPU。

Android 目前支持的最大 MSAA 是 4 倍吗?(我正在使用 Nexus 5)。

取决于供应商 - 一些设备支持 8x (Mali-T760),一些旧设备根本不支持它 (Tegra-1/2/3) - 所以 YMMV。

于 2015-03-04T19:19:22.613 回答
0

我找到了我的问题的答案。我发现图像正在被我使用的通用图像加载器库缩小。因此,被提供给 texImage2D 调用的位图已经按比例缩小,导致像素化纹理。所以我使用 isScaled=false 选项使用 BitmapFactory 解码了我的图像。

于 2015-03-15T10:33:26.523 回答