片段着色器生成纹理

时间:2019-01-29 05:02:35

标签: ios swift shader metal metalkit

我目前正在像在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中将其返回。金属可能吗?

0 个答案:

没有答案