2011-01-23 41 views
5

我需要在openFrameworks应用程序中实现色度键控(去除纯色背景)。带有openframeworks/opengl的色度键

我将同时播放许多(10个或更多)视频(在同一帧中),并将它们与其他背景一起绘制到屏幕上。我可以通过遍历每个帧的像素并基于绿色阈值为每个像素设置alpha值来获得类似色度键的效果,但是同时有这么多视频,这种像素撞击变得令人望而却步。

是否有一个简单的OpenGL混合模式或遮罩操作,可以避免绘制某个颜色值的所有像素?还是有另一个openFrameworks或openFrameworks兼容的C++库,可以有效地做到这一点?

另外,是否有一个很好的(节省空间)的方式来存储alpha通道在QuickTime兼容的视频文件?我们将存储数TB的视频(连续数周的录制),因此我们使用节省空间的格式非常重要。

一个注意:源文件中的色键颜色将是“完美”的 - 它是数字添加的。所以如果有某种阈值或按位逻辑的技巧来做到这一点,那也可以起作用。


编辑:这是什么工作,以下VJo的建议对像素着色器。我们使用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),和下面的像素着色器(对于品红色为更换颜色):

“数据/着色器/ chromakey.frag”:

#extension GL_ARB_texture_rectangle : enable 

uniform sampler2DRect src_tex_unit0; 
vec4 color; 

void main(void) 
{ 
     vec2 st = gl_TexCoord[0].st; 
     vec4 sample = texture2DRect(src_tex_unit0, st); 
     gl_FragColor = sample; 
     if((sample.r > 0.5) && (sample.g < 0.5) && (sample.b > 0.5)) { 
       gl_FragColor.a = 0.0; 
     } 
} 

“数据/着色器/ chromakey.vert”:

void main() 
{ 
    gl_Position = ftransform(); 
    gl_TexCoord[0] = gl_MultiTexCoord[0]; 
} 

C++的代理类用于着色器 - shaderChromakey.h:

#include "ofMain.h" 
#include "ofxShader.h" 
#include "ofxFBOTexture.h" 

class shaderChromakey{ 

    public: 
     void setup(int fboW, int fboH); 

     void beginRender(); 
     void endRender(); 

     void draw(int x, int y, int width, int height); 

     ofxShader shader; 

     ofxFBOTexture fbo; 

}; 

小号haderChromakey.cpp:

#include "shaderChromakey.h" 

//-------------------------------------------------------------- 
void shaderChromakey::setup(int fboW, int fboH){ 

    ofBackground(255,255,255); 
    ofSetVerticalSync(true); 

    fbo.allocate(fboW, fboH, true); 

    shader.loadShader("shaders/chromakey"); 
} 

//-------------------------------------------------------------- 
void shaderChromakey::beginRender(){ 
    fbo.swapIn(); 
} 

//-------------------------------------------------------------- 
void shaderChromakey::endRender(){ 
    fbo.swapOut(); 
} 

//-------------------------------------------------------------- 
void shaderChromakey::draw(int x, int y, int width, int height){ 

    shader.setShaderActive(true); 
    fbo.draw(x, y, width, height); 
    shader.setShaderActive(false); 
} 

实例化着色器,在项目:

shaderChromakey chromakey; 
chromakey.setup(HORIZONTAL, VERTICAL) 

抽奖循环,使着色器:

chromakey.beginRender(); 
    // draw chomakeyed frame here 
chromakey.endRender(); 

回答

2

你可以使用glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_DST_ALPHA),然后当您启用混合时,如果像素是特定颜色(将alpha设置为0),则可以使用像素着色器执行所需操作。