Использование GL_TEXTURE_EXTERNAL_OES в OpenGLES 3.x для ArCore

Я пытаюсь преобразовать ArFrame в цель рендеринга, используя OpenGLES 3.2. Пример ArCore показывает использование GLES2, но внутри GLES3 расширение недоступно. Теперь я нашел расширение GL_OES_EGL_image_external_essl3 для использования samplerExternalOES. Поэтому я включил gl3.h и gl2ext.h.

Создание текстуры аналогично примеру ArCore:

glGenTextures(1, &g_TextureID);
glBindTexture(GL_TEXTURE_EXTERNAL_OES, g_TextureID);
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

ArSession_setCameraTextureName(m_pARSession, g_TextureID);

Внутри цикла рендеринга:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_EXTERNAL_OES, g_TextureID);

Мои шейдеры выглядят так:

constexpr char kVertexShader[] = R"(
    #version  320 es

    layout(location = 0) in vec2 in_UV;
    layout(location = 0) out vec2 out_UV;

    void main()
    {
        vec2 Vertices[4];

        Vertices[0] = vec2(-1.0f, -1.0f);
        Vertices[1] = vec2( 1.0f, -1.0f);
        Vertices[2] = vec2(-1.0f,  1.0f);
        Vertices[3] = vec2( 1.0f,  1.0f);

        out_UV = in_UV;

        gl_Position = vec4(Vertices[gl_VertexID], 0.0f, 1.0f);
    }
)";

constexpr char kFragmentShader[] = R"(
    #version 320 es

    #extension GL_OES_EGL_image_external_essl3 : require

    precision mediump float;

    layout(location = 0) uniform samplerExternalOES in_ExtOESTexture;

    layout(location = 0) in vec2 in_UV;

    layout(location = 0) out vec4 out_Output;

    void main()
    {
        out_Output = texture(in_ExtOESTexture, in_UV); //vec4(in_UV, 0, 1);
    }
)";

В результате рендеринга только in_UV с out_Output = vec4(in_UV, 0, 1); на экране получается идеально выглядящая UV-текстура.

введите здесь описание изображения

Но используя текстуру, все черное. Размер текстуры (с использованием textureSize(in_ExtOESTexture, 0)) равен нулю для обоих измерений.

Любая идея, как решить эту проблему?


person Tobias Schwandt    schedule 17.01.2018    source источник
comment
ArSession_update(m_pARSession, m_pARFrame); кстати вызывается и результат AR_SUCCESS.   -  person Tobias Schwandt    schedule 17.01.2018
comment
Хорошо. Кажется, это проблема с разрешениями моей камеры. В первый раз, когда я даю доступ к камере, я получаю поток изображений. После этого изображение черное. Итак, я должен отозвать разрешение в настройках и снова запустить приложение.   -  person Tobias Schwandt    schedule 18.01.2018
comment
Если я попытаюсь получить метаданные изображения, результат будет AR_ERROR_NOT_YET_AVAILABLE.   -  person Tobias Schwandt    schedule 22.01.2018


Ответы (1)


Проблема заключалась в том, что на устройстве не было установлено "arcore-preview2.apk". Таким образом, если этот APK не установлен, ошибка не возникает. Экран остается просто черным. Более того, примеры Google на GitHub работают без этого APK. Я создал новую проблему на GitHub из-за этого неожиданного поведения.

person Tobias Schwandt    schedule 23.01.2018