2017-01-13 2 views
0

Ich benutze Vuforia SDK, um den Videostream der Kamera meines Telefons auf dem Bildschirm zu rendern.Warum gibt es einen Offset, wenn ich dieses Overlay rendere?

Phone's camera video stream on screen

So wird die Textur von der Bibliothek Vuforia erzeugt, nicht ich.

Die Shader verwendet, um dieses Hintergrund zu machen sind:

// 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; 
} 

Nun, ich möchte ein Overlay in der oberen linken Ecke des Bildschirms:

Video stream with overlay in the upper-left corner

Ich will nicht Dieses Overlay, um nur eine rosa Textur anzuzeigen, sondern eine multiply blend der rosa Textur und der Hintergrundtextur. Beachten Sie, dass die Texturen nicht die gleichen Koordinaten haben.

Aber jetzt, lassen Sie sich über das Mischen vergessen und lassen Sie sich die Hintergrundtexturim Shader-Programm der rosaen Textur gerade machen. Also, am Ende, ja, sollte man keinen Unterschied zwischen der Hintergrund-Version und dem Hintergrund mit Overlay-Version sehen.

Overlay with offset

Wie Sie (Blick auf die Malerei und die Spitze des Stuhles) sehen können, gibt es einen kleinen Offset ...

den Shadern verwendet, um die Überlagerung zu machen sind:

// 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; 
} 

Sind meine Berechnungen falsch?

Antwort

0

Warum brauchen Sie diese Leitung?

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

nicht sicher, was arithmetische Beziehung die absoluten Texturkoordinaten mit dem Skalierungsfaktor aufweisen, die eine Addition oder eine Subtraktion braucht ...

P. S. Es hängt nicht mit Ihrer Frage zusammen, aber Ihre Shader werden kürzer und einfacher zu lesen sein, wenn Sie einfach die Vektoroperationen in der Sprache verwenden. Ersetzen Sie beispielsweise:

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

... mit ...

vec2 scaleFactor = cameraResolution/screenSize; 

Solange die Vektortypen die gleiche Länge haben, wird es genau das tun, was man mit viel weniger Tipp erwarten. ..

Verwandte Themen