Сглаживание и фильтрация текстур в собственном приложении для Android с использованием OpenGL ES

Я отображаю 360-градусное фотосферное изображение на сфере с камерой в центре сферы. Когда мы создаем приложение с использованием собственного Android SDK и OpenGL ES 2.0, мы видим неровные края, как показано на изображении ниже. Зубцы видны на подлокотниках дивана, краях пола и т. д., когда я смотрю на этот вид с помощью картонного устройства.

С другой стороны, то же самое изображение (разрешение 4096X2048) отлично отображается в приложении unity3d для Android.

Используемый нами фильтр увеличения и уменьшения для текстуры — GL_LINEAR.

Исходный код, используемый для настройки параметров фильтрации текстуры и генерации текстуры и мипмапа:

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? Если да, можем ли мы получить подсказку о том, как это сделать? Является ли 4X максимальным MSAA, поддерживаемым в настоящее время на Android? (Я использую Нексус 5).

заранее спасибо

Апурв Нигам


person Apurv Nigam    schedule 03.03.2015    source источник
comment
Можете ли вы включить изображение? Или, по крайней мере, связать его с внешнего сайта, если у вас нет разрешения на его прямое включение?   -  person Reto Koradi    schedule 04.03.2015


Ответы (2)


Можем ли мы сделать анизотропную фильтрацию, чтобы сгладить текстуру при увеличении без размытия на Android?

В общем, нет - это «действительно дорого», поэтому не так много мобильных устройств поддерживает его.

Если да, можем ли мы получить ключ к тому, как это сделать?

В «официальном» OpenGL ES нет его поддержки; проверьте расширения поставщика, чтобы узнать, существует ли оно. Для десктопного GL он поддерживается через расширение GL_EXT_texture_filter_anisotropic — я не видел мобильного графического процессора, поддерживающего его.

Является ли 4X максимальным MSAA, поддерживаемым в настоящее время на Android? (Я использую Нексус 5).

Зависит от производителя - некоторые устройства поддерживают 8x (Mali-T760), некоторые старые устройства вообще не поддерживают (Tegra-1/2/3) - так что YMMV.

person solidpixel    schedule 04.03.2015
comment
Спасибо Isogen за ответ. Но есть ли способ уменьшить эффект пикселизации в моей текстурированной сфере. Я чувствую, что текстура минимизирована, пока я показываю. Могу ли я что-то сделать, чтобы ограничить его отображение только в исходном размере без уменьшения или увеличения? - person Apurv Nigam; 07.03.2015

Я нашел ответ на свою проблему. Я понял, что изображение было уменьшено используемой мной библиотекой Universal Image Loader. Таким образом, растровое изображение, переданное вызову texImage2D, уже было уменьшено, что привело к пиксельной текстуре. Поэтому я декодировал свое изображение с помощью BitmapFactory, используя параметр isScaled=false.

person Apurv Nigam    schedule 15.03.2015