我目前正在像在Photoshop中那样使用涂抹工具。我正在将图像纹理传递给片段着色器。 当手指在屏幕上移动时,我需要将涂抹工具应用于图像纹理。我也将接触点传递给了顶点着色器。使用顶点着色器,我在接触点周围创建了一个四边形。
在片段着色器中,我需要为接触点中的四边形创建纹理。在片段着色器中,可以创建纹理并在该四边形中绘制。
我是在Opengl的openframeworks中做到的,如下所示
void EffectBrush::generateSmudgeTexture(ofPoint drawPoint){
unsigned char* data = _pixels.getData();
int last_center_index= (((int)_lastDrawPoint.y)*_boundary.x + (int)_lastDrawPoint.x) * 4;
int crnt_center_index= (((int)drawPoint.y)*_boundary.x + (int)drawPoint.x) * 4;
for(int i=0; i< _textureSize; i++){
for(int j=0; j< _textureSize; j++){
int x = i-_textureSize/2, y=j-_textureSize/2;
int offset = (y * _boundary.x + x ) * 4;
int crnt_index = crnt_center_index + offset;
int stamp_index = last_center_index + offset;
float radius = sqrt(x*x + y*y);
float mix = ofMap(radius, 0, _textureSize*0.5, 0.5, 1,true);
ofColor crnt_clr, stamp_clr;
if(mix<1 && _lastDrawPoint.x+x >= 0 && _lastDrawPoint.x+x < _boundary.x && _lastDrawPoint.y+y > 0 && _lastDrawPoint.y+y < _boundary.y){
stamp_clr=ofColor(data[stamp_index], data[stamp_index+1], data[stamp_index+2], data[stamp_index+3]);
}
else{
stamp_clr=ofColor(0,0,0,0);
mix = 1;
}
if(drawPoint.x+x >= 0 && drawPoint.x+x < _boundary.x && drawPoint.y+y > 0 && drawPoint.y+y < _boundary.y){
crnt_clr=ofColor(data[crnt_index], data[crnt_index+1], data[crnt_index+2], data[crnt_index+3]);
lerpColor(stamp_clr, crnt_clr, mix+ofRandom(1-mix)/2);
_textures[0].setColor(i, j, stamp_clr);
data[crnt_index] = stamp_clr.r;
data[crnt_index+1] = stamp_clr.g;
data[crnt_index+2] = stamp_clr.b;
data[crnt_index+3] = stamp_clr.a;
}
}
}
_textures[0].update();
}
我需要在Quad中生成纹理,并在Fragment Shader中将其返回。金属可能吗?