Почему существует смещение при визуализации этого оверлея?

Я использую Vuforia SDK для отображения видеопотока камеры моего телефона на экране.

Видео-поток камеры телефона на экране

Таким образом , текстура генерируется библиотекой Vuforia, а не мной.

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

// Vertex Shader
attribute vec4 a_position;
attribute vec2 a_textureCoords;
varying vec2 v_textureCoords;
uniform mat4 u_projectionMatrix;

void main()
{
    gl_Position = u_projectionMatrix * a_position;
    v_textureCoords = a_textureCoords;
}


// Fragment Shader
varying highp vec2 v_textureCoords;
uniform sampler2D u_currentTexture;

void main()
{
    vec4 currentColor = texture2D(u_currentTexture, v_textureCoords);
    gl_FragColor = currentColor;
}

Теперь я хочу наложение в верхнем левом углу экрана:

Видеопоток с наложением в левом верхнем углу

Я не хочу , чтобы этот оверлей отображал только розовую текстуру, а скорее смесь розовой текстуры и текстуры фона. Обратите внимание, что текстуры не имеют одинаковых координат.

Но пока давайте забудем о смешивании и просто отрисоваем фоновую текстуру в программе шейдеров розовой текстуры . Так что, в конце концов, да, не должно быть никакой разницы между фоновой версией и bacground с оверлейной версией.

Наложение со смещением

Как видите (посмотрите на картину и верх стула), есть небольшое смещение

Шейдеры, используемые для отображения наложения:

// Vertex Shader
attribute vec4 a_position;
attribute vec2 a_currentTextureCoords;
varying vec2 v_currentTextureCoords;

void main()
{
    gl_Position = a_position;
    v_currentTextureCoords = a_currentTextureCoords;
}


// Fragment Shader
varying highp vec2 v_currentTextureCoords;
uniform sampler2D u_currentTexture;
uniform sampler2D u_backgroundTexture;

void main()
{
    vec2 screenSize = vec2(1080.0, 1920.0);
    vec2 cameraResolution = vec2(720.0, 1280.0);
    vec2 texelSize = vec2(1.0 / screenSize.x, 1.0 / screenSize.y);
    vec2 scaleFactor = vec2(cameraResolution.x / screenSize.x, cameraResolution.y / screenSize.y);
    vec2 uv = gl_FragCoord.xy * texelSize * scaleFactor;
    uv = vec2(scaleFactor.y - uv.y, scaleFactor.x - uv.x);
    vec4 backgroundColor = texture2D(u_backgroundTexture, uv);

    gl_FragColor = backgroundColor;
}

Мои расчеты неверны?

1 ответ

  1. Зачем вам нужна эта линия?

    uv = vec2(scaleFactor.y - uv.y, scaleFactor.x - uv.x);
    

    Не уверен, какую арифметическую связь имеют абсолютные координаты текстуры с масштабным фактором, который нуждается в сложении или вычитании …

    P.S. Это не связано с вашим вопросом, но ваши шейдеры будут короче и легче читаться, если вы просто используете векторные операции на языке. Например, заменить:

    vec2 scaleFactor = vec2(cameraResolution.x / screenSize.x, cameraResolution.y / screenSize.y);
    

    … с…

    vec2 scaleFactor = cameraResolution / screenSize;
    

    До тех пор, пока векторные типы имеют одинаковую длину, он будет делать именно то, что вы ожидаете, с гораздо меньшим количеством типов …