我与Vuforia合作开展一个项目。 我使用 Vuforia 中的 VideoPlayback 示例。
当Vuforia检测到标记时,视频会在此标记上显示为叠加层。我尝试在视频叠加层上应用色度键。我找到了这篇文章http://pilcrowpipe.blogspot.fr/2013/03/chroma-keying-transparent-background.html
我尝试实现代码但没有任何效果。我认为这个例子使用视频背景为抠像,但我想在叠加视频上使用chromakey。我是对的吗?
在Vuforia Sample中,我想我必须在 renderFrameWithState 函数中更改一些内容。
if (NOT_READY != currentStatus) {
// Convert trackable pose to matrix for use with OpenGL
// ...
/// TEST doesn't work
//glDepthFunc(GL_LEQUAL);
//glEnable(GL_BLEND);
//glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
///
// ...
glUseProgram(shaderProgramID);
glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, quadVertices);
glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, quadNormals);
glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, texCoords);
glEnableVertexAttribArray(vertexHandle);
glEnableVertexAttribArray(normalHandle);
glEnableVertexAttribArray(textureCoordHandle);
// I think I must change something in code above...
// But what and where ????
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, frameTextureID);
glUniformMatrix4fv(mvpMatrixHandle, 1, GL_FALSE, (GLfloat*)&modelViewProjectionVideo.data[0]);
glUniform1i(texSampler2DHandle, 0 /*GL_TEXTURE0*/);
glDrawElements(GL_TRIANGLES, kNumQuadIndices, GL_UNSIGNED_SHORT, quadIndices);
glDisableVertexAttribArray(vertexHandle);
glDisableVertexAttribArray(normalHandle);
glDisableVertexAttribArray(textureCoordHandle);
glUseProgram(0);
}
我完全不喜欢OpenGL ES。
任何人都可以帮助我?
由于
答案 0 :(得分:0)
行,
我找到了抠像的解决方案,但我遇到了一个新问题。
在片段着色器中,我使用上面的代码:
precision mediump float;
varying vec2 texCoord;
uniform sampler2D texSampler2D;
void main()
{
// Keying for green color
vec3 keying_color = vec3(0., 1., 0.);
float thresh = 0.8;
float slope = 0.2;
vec3 input_color = texture2D(texSampler2D, texCoord).rgb;
float d = abs(length(abs(keying_color.rgb - input_color.rgb)));
float edge0 = thresh * (1.0 - slope);
float alpha = smoothstep(edge0, thresh, d);
gl_FragColor = vec4(input_color, alpha);
}
在VideoPlaybackEAGL.mm中,我在 renderFrameWithState 函数中添加此代码。
if (NOT_READY != currentStatus) {
// Convert trackable pose to matrix for use with OpenGL
// ...
/// It's work
glDepthFunc(GL_LEQUAL);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
///
// ...
glUseProgram(shaderProgramID);
glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, quadVertices);
glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, quadNormals);
glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, texCoords);
glEnableVertexAttribArray(vertexHandle);
glEnableVertexAttribArray(normalHandle);
glEnableVertexAttribArray(textureCoordHandle);
// I think I must change something in code above...
// But what and where ????
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, frameTextureID);
glUniformMatrix4fv(mvpMatrixHandle, 1, GL_FALSE, (GLfloat*)&modelViewProjectionVideo.data[0]);
glUniform1i(texSampler2DHandle, 0 /*GL_TEXTURE0*/);
glDrawElements(GL_TRIANGLES, kNumQuadIndices, GL_UNSIGNED_SHORT, quadIndices);
glDisableVertexAttribArray(vertexHandle);
glDisableVertexAttribArray(normalHandle);
glDisableVertexAttribArray(textureCoordHandle);
glUseProgram(0);
}
但是现在,我的VideoBackground停止呈现,完全冻结。我的叠加视频反转位置。当我将手机定位到顶部时,视频覆盖方向朝向底部。左右相同......
您有任何想法或解决方案吗? 谢谢!
答案 1 :(得分:0)
搜索后,我找到了解决方案!
在 VideoPlaybackEAGL.mm 中,我在 renderFrameWithState 函数中添加此代码。
if (NOT_READY != currentStatus) {
// Convert trackable pose to matrix for use with OpenGL
// ...
/// It's work
glDepthFunc(GL_LEQUAL);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
///
// ...
glUseProgram(shaderProgramID);
glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, quadVertices);
glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, quadNormals);
glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, texCoords);
glEnableVertexAttribArray(vertexHandle);
glEnableVertexAttribArray(normalHandle);
glEnableVertexAttribArray(textureCoordHandle);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, frameTextureID);
glUniformMatrix4fv(mvpMatrixHandle, 1, GL_FALSE, (GLfloat*)&modelViewProjectionVideo.data[0]);
glUniform1i(texSampler2DHandle, 0 /*GL_TEXTURE0*/);
glDrawElements(GL_TRIANGLES, kNumQuadIndices, GL_UNSIGNED_SHORT, quadIndices);
glDisableVertexAttribArray(vertexHandle);
glDisableVertexAttribArray(normalHandle);
glDisableVertexAttribArray(textureCoordHandle);
glUseProgram(0);
// Adding code above to resolve the problem...
glDepthFunc(GL_LEQUAL);
glEnable(GL_BLEND);
}
它的工作!我改变了一点顶点着色器以纠正z轴。
答案 2 :(得分:0)
最后一次
glEnable(GL_BLEND);
应该是:
glDisable(GL_BLEND);
为了不冻结背景。
感谢您的代码!