#include "ofApp.h"
void ofApp::setup(){
ofEnableAlphaBlending();
srcImg.load("A.jpg");
dstImg.load("B.jpg");
brushImg.load("brush.png");
int width = srcImg.getWidth();
int height = srcImg.getHeight();
maskFbo.allocate(width,height);
fbo.allocate(width,height);
#ifdef TARGET_OPENGLES
shader.load("shaders_gles/alphamask.vert","shaders_gles/alphamask.frag");
#else
if(ofIsGLProgrammableRenderer()){
string vertex = "#version 150\n\
\n\
uniform mat4 projectionMatrix;\n\
uniform mat4 modelViewMatrix;\n\
uniform mat4 modelViewProjectionMatrix;\n\
\n\
\n\
in vec4 position;\n\
in vec2 texcoord;\n\
\n\
out vec2 texCoordVarying;\n\
\n\
void main()\n\
{\n\
texCoordVarying = texcoord;\
gl_Position = modelViewProjectionMatrix * position;\n\
}";
string fragment = "#version 150\n\
\n\
uniform sampler2DRect tex0;\
uniform sampler2DRect maskTex;\
in vec2 texCoordVarying;\n\
\
out vec4 fragColor;\n\
void main (void){\
vec2 pos = texCoordVarying;\
\
vec3 src = texture(tex0, pos).rgb;\
float mask = texture(maskTex, pos).r;\
\
fragColor = vec4( src , mask);\
}";
shader.setupShaderFromSource(GL_VERTEX_SHADER, vertex);
shader.setupShaderFromSource(GL_FRAGMENT_SHADER, fragment);
shader.bindDefaults();
shader.linkProgram();
}else{
string shaderProgram = "#version 120\n \
#extension GL_ARB_texture_rectangle : enable\n \
\
uniform sampler2DRect tex0;\
uniform sampler2DRect maskTex;\
\
void main (void){\
vec2 pos = gl_TexCoord[0].st;\
\
vec3 src = texture2DRect(tex0, pos).rgb;\
float mask = texture2DRect(maskTex, pos).r;\
\
gl_FragColor = vec4( src , mask);\
}";
shader.setupShaderFromSource(GL_FRAGMENT_SHADER, shaderProgram);
shader.linkProgram();
}
#endif
maskFbo.begin();
ofClear(0,0,0,255);
maskFbo.end();
fbo.begin();
ofClear(0,0,0,255);
fbo.end();
bBrushDown = false;
}
void ofApp::update(){
maskFbo.begin();
if (bBrushDown){
brushImg.draw(mouseX-25,mouseY-25,50,50);
}
maskFbo.end();
fbo.begin();
ofClear(0, 0, 0, 0);
shader.begin();
shader.setUniformTexture("maskTex", maskFbo.getTexture(), 1 );
srcImg.draw(0,0);
shader.end();
fbo.end();
}
void ofApp::draw(){
ofSetColor(255,255);
dstImg.draw(0,0);
fbo.draw(0,0);
ofDrawBitmapString("Drag the Mouse to draw", 15,15);
ofDrawBitmapString("Press spacebar to clear", 15, 30);
}
void ofApp::keyPressed(int key){
maskFbo.begin();
ofClear(0,0,0,255);
maskFbo.end();
}
void ofApp::keyReleased(int key){
}
void ofApp::mouseMoved(int x, int y ){
}
void ofApp::mouseDragged(int x, int y, int button){
}
void ofApp::mousePressed(int x, int y, int button){
bBrushDown = true;
}
void ofApp::mouseReleased(int x, int y, int button){
bBrushDown = false;
}
void ofApp::mouseEntered(int x, int y){
}
void ofApp::mouseExited(int x, int y){
}
void ofApp::windowResized(int w, int h){
}
void ofApp::gotMessage(ofMessage msg){
}
void ofApp::dragEvent(ofDragInfo dragInfo){
}
Comments