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?
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:
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.
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?