Я пытаюсь преобразовать 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)
) равен нулю для обоих измерений.
Любая идея, как решить эту проблему?